用的CH573,有时候程序跑几分钟就死机,有时候跑几个小时死机,请问有可能是什么原因造成的程序死机
热门产品 :
CH32X035: 32位USB+USB PD单片机
用的CH573,有时候程序跑几分钟就死机,有时候跑几个小时死机,请问有可能是什么原因造成的程序死机
原因其实很多,
下面就是一个例子:
代码里面的"while(1)"
在ble的例程里面,如果使用内部32K RC时钟,在做RC时钟校准时,需要用到当前芯片温度的函数,函数如下:
(该代码 位于CH573 EVT的EXAM\BLE\HAL\MCU.c 文件中,不同版本EVT 可能存在差异,下面代码来源于CH573 EVT 1.7 )
uint16 HAL_GetInterTempValue( void ) { uint8 sensor, channel, config, tkey_cfg; uint16 adc_data; tkey_cfg = R8_TKEY_CFG; sensor = R8_TEM_SENSOR; channel = R8_ADC_CHANNEL; config = R8_ADC_CFG; ADC_InterTSSampInit(); R8_ADC_CONVERT |= RB_ADC_START; while( R8_ADC_CONVERT & RB_ADC_START ) ; adc_data = R16_ADC_DATA; R8_TEM_SENSOR = sensor; R8_ADC_CHANNEL = channel; R8_ADC_CFG = config; R8_TKEY_CFG = tkey_cfg; return ( adc_data ); }
这里很明显,有个while,
如果,我们在别处更高优先级(比如中断)里使用了这个外设,恰好在
R8_ADC_CONVERT |= RB_ADC_START;
之后,
while( R8_ADC_CONVERT & RB_ADC_START )
之前
那么,当我们在回到这里后,由于硬件状态机已经被中断改变,可能就会出现while 永远不会跳出的现象了.
解决方式有两种:
1,上述代码加原子操作(执行开始前关闭全局中断,结束后开全局中断)
2,不要在中断中 使用ADC;