STM32采用HAL庫(kù)使用usart_DMA問題
在這里需要理解一個(gè)概念就是,使用hal庫(kù),首先一定要對(duì)標(biāo)準(zhǔn)庫(kù)中外設(shè)的使用,有一個(gè)很好的了解,在我這里出現(xiàn)這個(gè)原因就是由于對(duì)標(biāo)準(zhǔn)庫(kù)中外設(shè)的使用不夠了解,導(dǎo)致轉(zhuǎn)移到HAL庫(kù),出現(xiàn)各種問題。
本次采用的是HAL庫(kù)串口2中斷的接受,DMA方式發(fā)送。
具體想實(shí)現(xiàn)的功能是:上位機(jī)發(fā)送一幀固定的數(shù)據(jù)(15bit)前面2個(gè)字節(jié)固定的,在串口中斷中,檢測(cè)到了這個(gè)前面2個(gè)字節(jié)是正確的,則進(jìn)行數(shù)據(jù)的處理。處理好數(shù)據(jù)以后,在采用DMA方式發(fā)送出去對(duì)應(yīng)的數(shù)據(jù)。
出現(xiàn)的問題:每次調(diào)用函數(shù)這個(gè)函數(shù)后,下次就不能使用了
MYDMA_USART_Transmit(&UART2_Handler(u8*)USART2_TX_BUF,USART2_REC_LEN);//啟動(dòng)傳輸12
(ps : 該函數(shù)是原子哥提供的采用hal庫(kù)USART_DMA發(fā)送固定長(zhǎng)度的數(shù)據(jù)的函數(shù))
查看各種問題后,發(fā)現(xiàn)是由于發(fā)送完成以后,沒有清除中斷完成標(biāo)志,并且完成以后需要在關(guān)閉串口DMA.
//等待DMA1_Steam6傳輸完成if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6)){__HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6傳輸完成標(biāo)志HAL_UART_DMAStop(&UART2_Handler);//傳輸完成以后關(guān)閉串口DMA}123456一般情況下我們都是采用while(1)循環(huán)的方式來進(jìn)行等待DMA發(fā)送完成.
while(1){if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6傳輸完成{__HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6傳輸完成標(biāo)志HAL_UART_DMAStop(&UART2_Handler);//傳輸完成以后關(guān)閉串口DMA}break;}12345678當(dāng)時(shí)采用這種方式會(huì)是的我們的CPU主權(quán)的不到很好的釋放,所以我們采用定時(shí)中斷的方式去實(shí)現(xiàn),這樣就不會(huì)占用CPU了??梢圆捎枚〞r(shí)400us判斷一次傳輸是否完成。
//定時(shí)器中斷回調(diào)函數(shù)voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==(&TIM3_Handler)){if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6傳輸完成{__HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6傳輸完成標(biāo)HAL_UART_DMAStop(&UART2_Handler);//傳輸完成以后關(guān)閉串口DMA}}}




