智芯MCU 勘误文档问题解析
目录
- 一、ES勘误手册解析
- 1、11xMC
- Ⅰ、勘误汇总表
- Ⅱ、勘误问题解析
- ADC.1 :ADC FIFO 水位中断以及DMA请求可能会被异常触发
- ADC.2:ADC电路上电初始状态可能不稳定
- ADC.3:ADC软件复位后可能存在FIFO不为空的情况
- ADC.4:在ADC转换过程中关闭ADC可能造成ADC卡死
- LIN.1:LIN配置为从机时接收到错误Break段可能会停止接收数据
- LIN.2:硬件LIN break信号最大兼容长度为45Bit
- LIN.3 :启用LIN自动同步波特率可能导致通讯失败
- UART/LIN.1:初始化后可能通讯失败
- UART/LIN.2:重新初始化UART/LIN参数配置可能会失败
- DMA.1:当使用DMA传输FIFO数据时可能存在误触发
- DMA.2:DMA请求可能会被意外地启动
- SPI_CLK.1:PTA2作为SPI1_CLK的复用功能是无效的
- RTC_CLKOUT.1:RTC_CLKOUT为内部保留功能,用户不可使用
- I2C.1:由于总线上的干扰可能通讯失败
- SRMC.1:进入低功耗模式失败
- TIM.1:使用TIM进行输入捕获时可能会在开始时获取到无效的上升沿
- OSC.1:晶振ready flag可能会在外部晶振时钟不稳定的情况下置位
- LPO.1:
- FLASH.1:在对一个flash块执行操作的同时读取另一个flash块会造成总线错误
- SCM.1:SCM_DEVID[MEMSIZE_ID]与SCM_FLSCFG无法获取memory大小
一、ES勘误手册解析
1、11xMC
截止20250826,对于11xMC以下为各类资料最新版本:
- SDK:V1.8
- RM参考手册:V1.9
- ES勘误手册:V2.2
- FAQ问题解答手册:V0.8
Ⅰ、勘误汇总表
其中:
- A表示存在勘误问题有解决方案
- P表示存在勘误问题无解决方案
- N表示无勘误问题
Ⅱ、勘误问题解析
ADC.1 :ADC FIFO 水位中断以及DMA请求可能会被异常触发
- 问题说明:
ADC FIFO 水位中断以及DMA请求可能会被异常触发
- 处理方案:
- FIFO水位中断可能异常触发: 在进入FWM中断回调函数前除了判断ADC_FWM_INT(FIFO水位中断标志)之外还需判断ADC_STAT.RDY(ADC结果FIFO就绪)才能进入中断回调
此问题在SDK1.8版本已修复,具体内容如下:
- **ADC触发DMA请求可能异常触发:**在使用DMA对ADC FIFO数据进行搬运功能时应该先禁用ADC的DMA功能,在ADC FIFO水位中断中去开启DMA使能控制,在开启前DMA请求不会被响应,搬运完成自动关闭(DMA配置选择转换完成以后自动关闭使能)
使用方式可参考SDK中Examples下adc_Trg_loop_dma示例:
ADC.2:ADC电路上电初始状态可能不稳定
- 问题说明:
由于工艺差异导致adc采集电路可能在低电压启动,进而导致上电或者从低功耗从STANDBY模式唤醒第一次采集adc数据可能不准确
- 处理方案:
上电或者从低功耗从STANDBY模式唤醒首先通过软件触发adc采集第一次数据并丢弃结果以重置ADC进入正常状态
这部分处理代码在智芯提供的workaround例程中:
ADC.3:ADC软件复位后可能存在FIFO不为空的情况
- 问题描述:
当bus clock与ADC功能使能不是来自于同一时钟源时,通过配置ADC_CTRL[RST]来对ADC进行复位将有可能造成FIFO不为空的情况
- 处理方案:
读取FIFO中的值ADC_FCTRL[FCOUNT],若ADC_FCTRL[FCOUNT]不为零则始终读取ADC_DATA_RD直到ADC_FCTRL[FCOUNT]为零
这部分代码在智芯ADC workaround例程中:
ADC.4:在ADC转换过程中关闭ADC可能造成ADC卡死
- 问题描述:
当ADC正在转换时,通过配置ADC_CTRL[ADC_EN]来关闭ADC将有可能造成ADC卡死
- 处理方案:
出现此情况时需要Reset ADC再重新进行ADC初始化以重启ADC,因此在需要关闭ADC的场景下(例如进入低功耗、异常处理等情况)可以先通过ADC_STAT[ADC_ACTIVE]判断ADC是否处于空闲状态,等待其空闲再进行关闭ADC,必要情况下可以执行reset以及adcinit
示例代码如下:
/*检测ADC是否处于空闲状态*/
if( RESET == ADC_GetStatus(ADC0_ID, ADC_STATUS_ACTIVE)){ADC_Disable(ADC0_ID);//关闭ADCADC_SoftwareReset_Workaround();//对ADC0 reset并清空FIFOInit_ADC0();//重新初始化ADC
}
LIN.1:LIN配置为从机时接收到错误Break段可能会停止接收数据
- 问题描述:
LIN配置为从机,当在接收过程中接收到异常的break信号并压入FIFO中将会导致LIN停止接收
- 处理方案:
在使用硬件LIN接收报头时先关闭FIFO再回复响应是再开启FIFO
相关处理在SDK V1.8版本中已进行处理:
LIN.2:硬件LIN break信号最大兼容长度为45Bit
- 问题描述:
对于LIN一致性测试标准中(例如ISO17987系列)通常要求Break 段的最大长度限制为47 位时间(bit time),而使用硬件LIN最高只能达到45Bit,因此无法满足此需求
- 处理方案:
有大于45bit break信号需求时使用软件LIN,可联系智芯获取软件LIN协议栈
LIN.3 :启用LIN自动同步波特率可能导致通讯失败
- 问题描述:
A版本自动动波特率功能不可用,对于B版本来说启用自动波特率,由于总线干扰可能会计算出错误的波特率,导致同步字段故障,但是无效波特率会被加载进配置导致通讯失败
- 问题处理:
启用自动波特率时,如果检测到UART_LSR中SYNC_FIELD_ERROR, PID_ERR and TO_ERROR错误时应当重新进行LIN初始化,初始化因遵循特定初始化步骤
UART/LIN.1:初始化后可能通讯失败
- 问题描述:
如果UART/LIN初始化先进行了引脚复用的初始化在进行其他配置初始化,那么接收通道将会收到干扰,从而导致通讯失败
- 处理方案:
对于A版本与B版需按照特定的初始化步骤进行初始化:
对于A版本初始化流程如下,该部分内容在LIN workaround中有示例:
对于B版本初始化流程如下,与A版本相比少了几个步骤:
UART/LIN.2:重新初始化UART/LIN参数配置可能会失败
- 问题描述:
特定情况下需要重新初始化UART/LIN,如果此时总线上存在busy标志将会导致重新初始化失败
- 处理方案:
按照特定步骤初始化即可解决
DMA.1:当使用DMA传输FIFO数据时可能存在误触发
- 问题描述:
在使用DMA传输FIFO中的数据时,当传输数据总量DMA_NUMn[NUM]等于或小于单次源/目标读写数据大小DMA_CSn[SSIZE]、DMA_CSn[DSIZE]时DMA请求不会消失将会导致额外误触发一次DMA搬运
- 处理方案:
在配置DMA需遵循DMA_NUMn[NUM]>DMA_CSn[SSIZE]/DMA_CSn[DSIZE]进行设置
DMA.2:DMA请求可能会被意外地启动
- 问题描述:
正常来说DMA与CPU是相互独立的操作的,但是SDK也提供了软件使能请求的接口,因此会带来CPU与DMA异步操作带来的并发问题,例如DMA_DMAE寄存器在T1时刻为0x2,CPU软件操作DMA会先将寄存器中数据读取至CPU缓存中执行完需要的操作(例如启动DMA bit0使能则改写为0x3)再回写至寄存器。在这个过程中如果原来的bit1为的DMA动作恰好完成并清除了bit1位,则此时寄存器实际值为0x00,而CPU回写的数据为0x3,则会意外的再触发一次bit1的DMA动作。
- 处理方案:
- 1.如果应用场景为只需要使用两个DMA通道
由于DMA_DMAE寄存器支持以8bit形式访问,因此选择DMA通道是可以再0-7中选择一个,在8-15中选择另外一个则不会互相影响 - 2.如果应用场景为需要使用大于两个DMA通道,有两个方法规避此问题:方法一:串行使用DMA,每次仅执行一个DMA通道的操作,所有DMA通道依次运行
方法二:在CPU访问DMA_DMAE寄存器前,先使用DMA halt功能来暂停DMA所有通道,避免硬件disable request与软件enable request产生冲突:
- 1.如果应用场景为只需要使用两个DMA通道
- disable全局中断;
2.halt DMA(DMA_CONF.HALT=1);
3.查询DMA_CONF.BUSY标志,确保NOT busy;
4.SW使能通道request(DMA_DMAE.DMAEn=1);
5.释放DMA(DMA_CONF.HALT=0);
6.enable全局中断;
SPI_CLK.1:PTA2作为SPI1_CLK的复用功能是无效的
- 问题描述:
PTA2作为SPI1_CLK的复用功能是无效的,是RM手册中的错误,引脚复用功能以智芯PINMUX资料为准
- 处理方案:
SPI1_CLK正确的复用引脚为PTE11、PTA10
RTC_CLKOUT.1:RTC_CLKOUT为内部保留功能,用户不可使用
- 问题描述:
RTC_CLKOUT对外输出 MCU内部保留功能,用户模式是无效的,配置此功能无法生效
- 处理方案:
使用定时器生成RTC时钟,并通过定时器通道引脚输出
I2C.1:由于总线上的干扰可能通讯失败
- 问题描述:
I2C由于总线干扰(电源短路或接地短路)可能会进入错误状态,进而导致通讯失败
- 处理方案:
当I2C出现通讯异常的情况时按照特定步骤重新初始化即可正常通讯:
SRMC.1:进入低功耗模式失败
- 问题描述:
进入低功耗状态(STOP and STANDBY)需要两个步骤:配置SRMC寄存器,
CPU执行WFI指令。在这个过程中如果产生了中断并且在执行WFI指令前未清除中断标志位,则MCU会进入停止保持状态(halt)导致进入低功耗失败
- 处理方案:
详细内容可参考智芯资料中Z20K11xM低功耗使用指南
TIM.1:使用TIM进行输入捕获时可能会在开始时获取到无效的上升沿
- 问题描述:
在使用TIM双边沿捕获或者上升沿输入捕获模式时,如果在开始前输入电平始终为高电平则使能计数时会立即捕获到一个不是真实的上升沿。
- 处理方案:
在使用TIM双边沿捕获或者上升沿输入捕获模式时,使能计数后,丢弃第一个捕获事件
OSC.1:晶振ready flag可能会在外部晶振时钟不稳定的情况下置位
- 问题描述:
OSC ready标志在软复位时并不会清除,将会导致在持续供电的情况下关闭外部晶振再启动会立即置位osc ready标志,此时晶振时钟可能还不稳定
- 处理方案:
启动晶振按照特定的步骤即可:
该部分内容在智芯SDK V1.8版本中已经添加:
LPO.1:
- 问题描述:
LPO默认开启,如果使用默认配置可能会造成精度超过标准范围
- 处理方案:
需进行特定的配置以保证LPO处于标志范围内:
FLASH.1:在对一个flash块执行操作的同时读取另一个flash块会造成总线错误
- 问题描述:
当代码运行再ram或cache中,程序执行如下序列,会产生busfault;
①读Dflash --> ②执行擦/写Dflash命令 --> ③执行擦/写Dflash命令的过程中读Pflash
- 处理方案:
- 1.不同时读写flash即可
- 2.在步骤2和步骤3前直接插入一个步骤(读取一次pflash上任意地址的数据),在后面的SDK/MCAL上会增加软件workaround;
参考代码示例:
if (0 == flashType ) // flashType = 0 : launch command on flash0{__asm volatile("PUSH {R0, R1}\n""LDR R0, =0x01000000\n" //flash1 address"LDR R1, [R0]\n""POP {R0, R1}\n");}else if (1 == flashType) // flashType = 1 : launch command on flash1{__asm volatile("PUSH {R0, R1}\n""LDR R0, =0x02000000\n" //flash0 address"LDR R1, [R0]\n""POP {R0, R1}\n");} else {//do nothing}
SCM.1:SCM_DEVID[MEMSIZE_ID]与SCM_FLSCFG无法获取memory大小
- 问题描述:
从SCM_DEVID[MEMSIZE_ID] and SCM_FLSCFG中获取的memory大小可能不准确
- 处理方案:
不使用SCM_DEVID[MEMSIZE_ID] and SCM_FLSCFG获取memory大小