在IAR环境下调试有不同的复位类型,其中一些只复位内核不复位MCU外设的复位方式在特定情况下可能会造成仿真问题。
以常用的AT_Link(CMSIS DAP)和Jlink为例:
CMSIS DAP:
1) Disabled (no reset):没有reset动作。
2) Software:直接将CPU的PC指针重置到应用程序入口函数,相当于软复位。
3) Hardware:通过翻转DAPLink的nSRST/nRESET引脚(一般接到MCU reset脚)来复位MCU。
4) Core:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core。
5) System:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位和SYSRESETREQ位来同时复位Core和MCU外设模块。
Jlink/J-Trace
1) Normal:默认的复位策略,等同于Core and peripherals方式。
2) Core:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core。
3) Core and peripherals:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位和 SYSRESETREQ位来同时复位Core和MCU外设模块。
4) Reset Pin:通过拉低J-Link的RESET引脚(一般也会接到MCU reset脚)来复位MCU。
注意:
以上复位方式中,有几种不会复位MCU的外设,这在特定情况下会引起一些问题,比如:
RESET按钮选择为Core并执行后,代码跳转到main函数入口,变量值被复位,但是寄存器值不会被复位。
此时如果客户的代码里在用TMR触发ADC采样,使用DMA搬运,那么点击复位后ADC、触发源TMR均还是保持正常工作,即TMR还是按照既定周期触发ADC,ADC也一直在响应触发转换并产生DMA请求;
但用于ADC转换数据传输的DMA由于配置的非loop mode,在之前传输完设定counter笔数据后就保持为停止传输状态;
重新启动运行后,代码从头执行,当执行完dma_config后(即重新配置了DMA的counter),DMA会立即响应ADC挂起的DMA请求搬运数据,该次搬运数据为非预期的,因此会导致adc1_ordinary_valuetab(DMA搬运ADC数据到该数组)内存储的数据出现错位现象。