用的CH573,有時候程序跑幾分鐘就死機(jī),有時候跑幾個小時死機(jī),請問有可能是什么原因造成的程序死機(jī)
查看: 3464
回復(fù): 1
程序運(yùn)行死機(jī)有可能是什么原因造成的
熱門產(chǎn)品 :
CH585: 集成高速USB和NFC的藍(lán)牙MCU
原因其實很多,
下面就是一個例子:
代碼里面的"while(1)"
在ble的例程里面,如果使用內(nèi)部32K RC時鐘,在做RC時鐘校準(zhǔn)時,需要用到當(dāng)前芯片溫度的函數(shù),函數(shù)如下:
(該代碼 位于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,
如果,我們在別處更高優(yōu)先級(比如中斷)里使用了這個外設(shè),恰好在
??R8_ADC_CONVERT?|=?RB_ADC_START;
之后,
??while(?R8_ADC_CONVERT?&?RB_ADC_START?)
之前?
那么,當(dāng)我們在回到這里后,由于硬件狀態(tài)機(jī)已經(jīng)被中斷改變,可能就會出現(xiàn)while 永遠(yuǎn)不會跳出的現(xiàn)象了.
解決方式有兩種:
1,上述代碼加原子操作(執(zhí)行開始前關(guān)閉全局中斷,結(jié)束后開全局中斷)
2,不要在中斷中 使用ADC;
請勿發(fā)布廣告和違法內(nèi)容, 代碼可以選擇編輯器代碼語言格式, 更易他人閱讀幫助您, 或者留下聯(lián)系方式,以便更好更快服務(wù)您
只有登錄才能回復(fù),可以選擇微信賬號登錄