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