STM32經(jīng)驗(yàn)心得(一)
相關(guān)經(jīng)驗(yàn)及心得如下:
摘要:1.在配置USART的TX完成中斷后,在沒(méi)有發(fā)數(shù)的情況下自動(dòng)進(jìn)入TX完成中斷函數(shù)。2 .在TX配置完成后,相應(yīng)的TC標(biāo)志位會(huì)自動(dòng)置1,隨后就進(jìn)入了TX完成中斷。3.相關(guān)配置程序編寫無(wú)誤,并已經(jīng)開(kāi)啟時(shí)鐘,依舊無(wú)法配置相關(guān)GPIO及外設(shè);4.ADC通道:分為規(guī)則組和注入組;5.修改定時(shí)器的預(yù)裝值后,定時(shí)器不能立刻修改。
在配置USART的TX完成中斷后,在沒(méi)有發(fā)數(shù)的情況下自動(dòng)進(jìn)入TX完成中斷函數(shù)。2. 問(wèn)題分析:
在TX配置完成后,相應(yīng)的TC標(biāo)志位會(huì)自動(dòng)置1,隨后就進(jìn)入了TX完成中斷。
(TC標(biāo)志位:發(fā)送完成標(biāo)志位 )
當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入U(xiǎn)SART_DR)。TC位也可以通過(guò)寫入0來(lái)清除,只有在多緩存通訊中才推薦這種清除程序。
0:發(fā)送還未完成;
1:發(fā)送完成成。
a)方案一:先讀狀態(tài)寄存器(USART_SR),然后再DR發(fā)送寄存器中寫數(shù),TC標(biāo)志位自動(dòng)清除;
/**用于清除TC標(biāo)志位**/USART_GetFlagStatus(USART1,USART_IT_TC);USART1->DR=0x00;123
b)方案二:強(qiáng)行將SR寄存器的TC位寫0,但是在實(shí)際運(yùn)行過(guò)程中TC標(biāo)志位不能立刻清零,需要增加一個(gè)延遲函數(shù),才能使得TC標(biāo)志位清零;
4.其他補(bǔ)充
無(wú)
相關(guān)配置程序編寫無(wú)誤,并已經(jīng)開(kāi)啟時(shí)鐘,依舊無(wú)法配置相關(guān)GPIO及外設(shè);
2. 問(wèn)題分析:在調(diào)試過(guò)程運(yùn)用IAR查看單片機(jī)相關(guān)的寄存器狀態(tài),發(fā)現(xiàn)相應(yīng)的寄存器在運(yùn)行配置程序后仍然沒(méi)有反應(yīng),懷疑可能相應(yīng)外設(shè),沒(méi)有啟動(dòng),分析原因可能是沒(méi)有時(shí)鐘。
3. 解決方法:在配置GPIO及外設(shè)之前就應(yīng)該將開(kāi)啟相應(yīng)的時(shí)鐘;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //首先應(yīng)該開(kāi)啟時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//首先應(yīng)該開(kāi)啟時(shí)鐘/**TX--PA9**/GPIOInitStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIOInitStruct.GPIO_Pin=GPIO_Pin_9;GPIOInitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIOInitStruct);1234567三、 ADC通道
ADC通道:分為規(guī)則組和注入組
規(guī)則組:每次轉(zhuǎn)換n個(gè),直至所轉(zhuǎn)換結(jié)束,無(wú)SEXT標(biāo)志位;
注入組:每次轉(zhuǎn)換一個(gè),直至完成所有組員,有SEXT標(biāo)志位;
配置的變量,在未修改的情況下改變;
2、問(wèn)題分析:變量在未修改的情況下改動(dòng),懷疑數(shù)據(jù)存在溢出,可能是因?yàn)橹羔?、DMA配置有關(guān)。由于本次測(cè)試程序中沒(méi)有運(yùn)用數(shù)據(jù)指針,懷疑是DMA配置問(wèn)題,查看DMA配置,發(fā)現(xiàn)
DMA_InitStruct.DMA_BufferSize=(DMATXLENGTH*sizeof(int));/*緩沖大小配置成數(shù)據(jù)所需要的的緩存空間大小,但實(shí)際這個(gè)函數(shù)配置的是數(shù)據(jù)的個(gè)數(shù)。上述的配置就導(dǎo)致了DMA的傳輸通道增加,指向了錯(cuò)誤的變量地址;*/12343、解決方法
DMA_InitStruct.DMA_BufferSize=DMATXLENGTH;14、深入思考
DMA在某些情況下可以想象成運(yùn)用指針直接給變量賦值、數(shù)組賦值等,因此在使用直接訪問(wèn)內(nèi)存地址過(guò)程中要明確清晰的知道所指向的地址、該地址中對(duì)應(yīng)數(shù)據(jù)所占空間的大小、所需要指向的數(shù)據(jù)個(gè)數(shù)等。盡量避免指針指錯(cuò)的現(xiàn)象。在某些使用DMA傳輸?shù)臄?shù)據(jù),這些數(shù)據(jù)往往只隨著源數(shù)據(jù)的變化而變化,在后續(xù)的數(shù)據(jù)調(diào)用中很少進(jìn)行額外的改動(dòng),因此,在處理目的數(shù)據(jù)的時(shí)候,增加const關(guān)鍵字進(jìn)行修飾,可以有效的防止目的數(shù)據(jù)的意外更改。五、 定時(shí)器PWM輸出1、問(wèn)題描述:
修改定時(shí)器的預(yù)裝值后,定時(shí)器不能立刻修改。
2、問(wèn)題分析:在仿真過(guò)程中查看寄存器,在修改預(yù)裝值后寄存器的配置沒(méi)有改變,而是完成一次后才做修改的。于是查看手冊(cè),需要修改相應(yīng)寄存器捕獲/比較模式寄存器2(TIMx_CCMR2)中的OCxPE和OCxFE。
位3 OC3PE:輸出比較3預(yù)裝載使能
位2 OC3FE:輸出比較3快速使能
直接運(yùn)用指針修改寄存器相應(yīng)的位的數(shù)值。
TIM3->CCMR2=TIM3->CCMR2|0x0004;//將OC3FE置1TIM3->CCMR2=TIM3->CCMR2&0xfff7;//將OC3PE清零TIM3->CCR3=(u16)0*00;//向預(yù)裝寄存器寫值(CCR3寄存器)123