|
作者 | strongerHuang
微信公眾號(hào) | strongerHuang
看到一個(gè)交流群在討論關(guān)于【關(guān)于STM32中斷優(yōu)先級(jí)的話題】,其中就有小伙伴提到:為什么有些STM32中斷沒(méi)有【子優(yōu)先級(jí)】?
比如,有時(shí)候你在使用STM32CubeMX配置時(shí),你會(huì)發(fā)現(xiàn)只有Preemption Priority【搶占優(yōu)先級(jí)】,而沒(méi)有Sub Priority【次優(yōu)先級(jí)】:
sissh55b3u064088250331.png (179.69 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
sissh55b3u064088250331.png
2024-12-10 08:32 上傳
然而,有時(shí)候你會(huì)發(fā)現(xiàn)又有Sub Priority【次優(yōu)先級(jí)】:
aikkg00ma5064088250431.png (214 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
aikkg00ma5064088250431.png
2024-12-10 08:32 上傳
這個(gè)問(wèn)題就牽涉到STM32,準(zhǔn)確的來(lái)說(shuō)的是 Cortex-M NVIC 嵌套向量中斷控制器的問(wèn)題。
下面就展開(kāi)來(lái)說(shuō)說(shuō)關(guān)于ARM單片機(jī)NVIC的內(nèi)容。
關(guān)于Cortex-M的NVIC
NVIC:Nested Vectored Interrupt Controller,嵌套向量中斷控制器。
在每個(gè)Cortex-M內(nèi)核中都有這么一個(gè)NVIC嵌套向量中斷控制器,當(dāng)MCU使用的內(nèi)核不同,其中的NVIC也可能不同。
比如,Cortex-M0和Cortex-M3內(nèi)核中NVIC功能就不同。
其中,中斷優(yōu)先級(jí)分組功能就不同。
Cortex-M0的NVIC沒(méi)有優(yōu)先級(jí)分組功能,Cortex-M3、 M4、M7有分組功能。
zgdlyy4nixk64088250531.jpg (147.3 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
zgdlyy4nixk64088250531.jpg
2024-12-10 08:32 上傳
所以,你在使用STM32CubeMX配置時(shí),M0/M0+內(nèi)核的STM32是沒(méi)有【次優(yōu)先級(jí)】那個(gè)選項(xiàng)的。
Cortex-M0包含STM32F0、L0、G0等處理器。
對(duì)底層感興趣的朋友可以繼續(xù)往下看。
NVIC寄存器
NVIC寄存器,需查看對(duì)應(yīng)的內(nèi)核(Cortex-M)手冊(cè),在ARM官網(wǎng)能找到(M3也有對(duì)應(yīng)的中文翻譯版,大家可以自己網(wǎng)上搜索)。
內(nèi)核中的寄存器和我們STM32參考手冊(cè)中寄存器一樣,不同的Bit位代表含義不同。
但是,對(duì)于NVIC來(lái)說(shuō),由于包含眾多優(yōu)先級(jí)相關(guān)配置,寄存器數(shù)量相對(duì)較多(NVIC寄存器族)。
pno0d3yb4nn64088250632.jpg (350.32 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
pno0d3yb4nn64088250632.jpg
2024-12-10 08:32 上傳
拿M3來(lái)說(shuō),優(yōu)先級(jí)分組的配置,位于NVIC的AIRCR應(yīng)用程序中斷及復(fù)位控制寄存器中:
een44dgwwha64088250732.jpg (285.79 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
een44dgwwha64088250732.jpg
2024-12-10 08:32 上傳
這里推薦閱讀之前我寫過(guò)的一篇文章:Cortex-M中斷在RTOS中的應(yīng)用及注意事項(xiàng)
中斷入口
額外提下一個(gè)小伙伴問(wèn)的問(wèn)題:為什么外部中斷8和9都使用同一個(gè)中斷?void EXTI9_5_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line8) != RESET) { /* 代碼 */ EXTI_ClearITPendingBit(EXTI_Line8); } if(EXTI_GetITStatus(EXTI_Line9) != RESET) { /* 代碼 */ EXTI_ClearITPendingBit(EXTI_Line9); }}我想,這個(gè)問(wèn)題應(yīng)該不難。好比一個(gè)main程序入口,進(jìn)入之后需要處理很多事情,只是在里面需要區(qū)分事件。
很多外設(shè)中斷,都會(huì)使用同一個(gè)中斷入口,有一個(gè)原因:節(jié)約中斷入口資源分配。
像USART發(fā)送和接收中斷,TIM不同通道捕獲中斷等。
------------ END ------------
0fcp0w51lmw64088250832.gif (71.87 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
0fcp0w51lmw64088250832.gif
2024-12-10 08:32 上傳
●專欄《嵌入式工具》●專欄《嵌入式開(kāi)發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
點(diǎn)擊“閱讀原文”查看更多分享。 |
|