在CAN0復(fù)位后,在訪問CAN0外設(shè)之前,應(yīng)該添加至少20個(gè)NOP的復(fù)位延遲,而不是9個(gè)NOP復(fù)位延遲。否則無法訪問CAN0寄存器。9個(gè)NOP復(fù)位延遲是在將108MHz的Fcclk除以12MHz的FIRC內(nèi)部時(shí)鐘之后獲得的,如下LPC43xxUM文檔第15.4.1節(jié)備注所示。
/* Chip_SetupCoreClock(CLKIN_CRYSTAL, MAX_CLOCK_FREQ, true); */
// Chip_SetupCoreClock(CLKIN_CRYSTAL, 108000000, true);
// CCLK 12MHz
Chip_SetupCoreClock(CLKIN_CRYSTAL, 12000000, true);
已通過輪詢復(fù)位標(biāo)志成功等待CAN0退出復(fù)位。
Chip_RGU_TriggerReset( RGU_CAN0_RST );
//NOP_operation();
while(Chip_RGU_InReset(RGU_CAN0_RST))
為什么 9 或者10 個(gè)NOP復(fù)位延遲時(shí)間不滿足要求,而20個(gè)NOP確可以呢?使用108Mhz時(shí)鐘作為內(nèi)核時(shí)鐘,如用戶手冊所說,在復(fù)位CAN后,需要等待108Mhz/12Mhz = 9個(gè)周期。但是實(shí)際測試需要20個(gè)周期數(shù)。當(dāng)內(nèi)核時(shí)鐘是12Mhz的時(shí)候,0或者1個(gè)等待周期數(shù)都是可以的。
-> 使用"NOP"來實(shí)現(xiàn) NOP_operation()是有風(fēng)險(xiǎn)的,由于Cortex-M用戶手冊提示如下:
NOP is not necessarily a time-consuming NOP. The processor might remove it from the pipeline before it reaches the execution stage.
可以使用MOV r0,r0或硬件定時(shí)器來實(shí)現(xiàn)等待周期,以避免編譯器和優(yōu)化級別配置的影響。
審核編輯:湯梓紅
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1410瀏覽量
41105 -
CAN
+關(guān)注
關(guān)注
57文章
2888瀏覽量
466756 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1883瀏覽量
132845 -
Cortex-M
+關(guān)注
關(guān)注
2文章
230瀏覽量
30230 -
nop
+關(guān)注
關(guān)注
0文章
9瀏覽量
2063
原文標(biāo)題:LPC4357FET256 CAN0復(fù)位后,需要插入NOP延遲一段時(shí)間
文章出處:【微信號:嵌入式 MCU,微信公眾號:嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM8L運(yùn)行一段時(shí)間后死機(jī),手動復(fù)位無效怎么解決?
STM8串口工作一段時(shí)間后出現(xiàn)通訊異常的原因?
STM8L運(yùn)行一段時(shí)間后死機(jī),手動復(fù)位無效,只能上電復(fù)位怎么解決?
VL53L0在使用一段時(shí)間后無法讀取數(shù)據(jù)如何解決?
ADS1013采集運(yùn)放輸出數(shù)據(jù),一段時(shí)間后變的很低是為什么?
請問CC2630運(yùn)行一段時(shí)間會自動復(fù)位是什么原因
STM32運(yùn)行一段時(shí)間后死機(jī),手動復(fù)位無效,只能上電復(fù)位才能正常運(yùn)行
回收LPC4357FET256 收購LPC4357FET256
微雪電子LPC Cortex M4開發(fā)板 Core4357簡介

Arduino 接MPU6050 9250使用IIC通訊,輸出數(shù)據(jù)一段時(shí)間后死機(jī)卡死的問題解決

評論