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