記錄一些stm32調(diào)試過程中:不易被理解、存在使用誤區(qū)、不清不楚、是坑、使用常識(shí)等方面的一些記錄。本記錄只包含stm32的內(nèi)核以及外設(shè)等寄存器的調(diào)試,不包含業(yè)務(wù)方面。
低功耗管理
使用低功耗功能前是否需要打開PWR時(shí)鐘?
是需要先打開PWR時(shí)鐘的,否則無法喚醒。
-
睡眠模式、停機(jī)模式和待機(jī)模式的區(qū)別?
引用地址
這兩個(gè)模式與睡眠模式相比,屬于深度睡眠模式。
睡眠模式
停機(jī)模式
待機(jī)模式
NVIC(內(nèi)嵌的中斷向量控制器)
NVIC是什么東西?是內(nèi)嵌的中斷向量控制器?翻譯的被不明不白,無法理解。說簡單一點(diǎn)就是,來管理全部的中斷的控制器,哪個(gè)中斷來了,誰先來的,誰后來的,應(yīng)該先運(yùn)行哪個(gè)?能不能被搶占,還是按照順序執(zhí)行等。
如何理解中斷、掛起?
國內(nèi)單片機(jī)學(xué)習(xí)者一開始都是學(xué)習(xí)別人翻譯過來的中文手冊(cè),我也不例外。但是翻譯過來的有些就十分的晦澀難懂,更甚者還會(huì)有錯(cuò)誤出現(xiàn)(例如,EXTI的中斷\事件控制框圖)。所以建議去看看英文手冊(cè),即使借助翻譯軟件慢慢看也沒有關(guān)系。
對(duì)于理解中斷、掛起,十分有幫助的地方是M3權(quán)威指南手冊(cè)的124頁,看完如果沒有幫助你來找我。
NVIC中的Pending(中斷掛起)位會(huì)自動(dòng)清除嗎?
當(dāng)觸發(fā)了某個(gè)中斷,并進(jìn)入了該中斷服務(wù)函數(shù)的話,該位是會(huì)被硬件自動(dòng)清除的。
但是觸發(fā)這個(gè)中斷的外設(shè)中的中斷標(biāo)志位的話,并不一定會(huì)自動(dòng)清除,需要查看手冊(cè),看是否需要自己手動(dòng)清除。
EXTI(外部中斷/事件)
將PortA0連接到EXTI0,觸發(fā)外部中斷,總是進(jìn)入兩次中斷服務(wù)函數(shù),并且沒有外部干擾存在。
void EXTI0_IRQHandler(void)
{
// 中斷執(zhí)行的業(yè)務(wù)代碼...
ExtiClearIntStatus(0u); //清除LINE0上的中斷標(biāo)志位
}
解釋:
① 該現(xiàn)象十分有規(guī)律,可以考慮是因?yàn)闆]有清除掉EXTI的掛起寄存器,導(dǎo)致該中斷一直被掛起,即使退出了中斷服務(wù)函數(shù),還是會(huì)一直進(jìn)入該中斷。
② 但是,每次只進(jìn)入兩次,上述還是解釋不通,并且代碼中已經(jīng)將掛起寄存器中的中斷標(biāo)志清除掉了。
③ 最終原因是因?yàn)?,清除中斷?biāo)志的函數(shù)寫在了最后一句,導(dǎo)致中斷服務(wù)函數(shù)返回后,硬件上仍舊沒有來得及將掛起寄存器的標(biāo)志位清零(硬件執(zhí)行是有延遲的)。所以導(dǎo)致又一次進(jìn)入了中斷服務(wù)函數(shù)。并且在仿真調(diào)試中,我也發(fā)現(xiàn),第一次進(jìn)入中斷服務(wù)函數(shù)時(shí),EXTI的PR掛起寄存器中的中斷標(biāo)志位為置位狀態(tài),第二次進(jìn)入中斷服務(wù)函數(shù)時(shí),發(fā)現(xiàn)該位已經(jīng)被清除。
④ 所以,最要是一進(jìn)入中斷服務(wù)函數(shù),就將掛起的標(biāo)志位清除掉,再執(zhí)行業(yè)務(wù)邏輯代碼,給硬件一定的執(zhí)行事件。
DMA(直接內(nèi)存訪問)
下面的代碼對(duì)dma進(jìn)行寄存器操作總是寫入失?。?/code>
RCC->AHBENR |= RCC_AHB_DMA1; // 開啟DMA1時(shí)鐘
DMA_CHx->CPAR = uiPeriAddr; // 外設(shè)地址
DMA_CHx->CMAR = uiMemoryAddr; // 內(nèi)存地址
解釋:
如果這樣操作,dma的這兩個(gè)寄存器總是寫入不成功。
因?yàn)閯傞_啟了DMA時(shí)鐘,還并未穩(wěn)定(電路的運(yùn)行也需要時(shí)間),所以寫入失敗,需要在時(shí)鐘開始后,加入延遲。
應(yīng)該加入至少大于等于兩個(gè)時(shí)鐘周期【__nop();】。文章來源:http://www.zghlxwxcb.cn/news/detail-801987.html
使用Dma進(jìn)行發(fā)送時(shí),有什么注意事項(xiàng)?
① 最好是使用Dma正常模式(即非循環(huán)模式)進(jìn)行發(fā)送。也就是數(shù)據(jù)轉(zhuǎn)移(發(fā)送)到全滿就停止Dma發(fā)送。
② 在Dma配置發(fā)送初始化時(shí),因?yàn)檫@個(gè)時(shí)候還沒有數(shù)據(jù)要進(jìn)行發(fā)送,所以CNDTR寄存器的值請(qǐng)寫入0,否則當(dāng)你使能Dma時(shí),它會(huì)自動(dòng)發(fā)送數(shù)據(jù)。最好是等想要發(fā)送數(shù)據(jù)時(shí):先失能Dma,寫入想要發(fā)送的數(shù)據(jù)長度,再使能Dma,啟動(dòng)發(fā)送。文章來源地址http://www.zghlxwxcb.cn/news/detail-801987.html
到了這里,關(guān)于【STM32調(diào)試】寄存器調(diào)試不良問題記錄持續(xù)版的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!