日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]使用STM32CubeMX生成初始化代碼。問題:HAL_UART_Transmit_DMA函數(shù)只能調(diào)用一次,第二次就返回狀態(tài)HAL_UART_STATE_BUSY 0x02。原因:stm32l1xx_hal_uart.c開頭有描述 (##) DMA Configuration if you need to use

使用STM32CubeMX生成初始化代碼。

問題:

HAL_UART_Transmit_DMA函數(shù)只能調(diào)用一次,第二次就返回狀態(tài)HAL_UART_STATE_BUSY 0x02。


原因:

stm32l1xx_hal_uart.c開頭有描述

(##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()
and HAL_UART_Receive_DMA() APIs):
(+++) Declare a DMA handle structure for the Tx/Rx channel.
(+++) Enable the DMAx interface clock.
(+++) Configure the declared DMA handle structure with the required
Tx/Rx parameters.
(+++) Configure the DMA Tx/Rx channel.
(+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle.
(+++) Configure the priority and enable the NVIC for the transfer complete
interrupt on the DMA Tx/Rx channel.
(+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
(used for last byte sending completion detection in DMA non circular mode)


配置USARTx中斷優(yōu)先級,啟用NVIC USART中斷句柄(使用DMA非循環(huán)模式時(shí),用來檢測最后一個(gè)字節(jié)發(fā)送完畢)



默認(rèn) USART1的全局中斷未Checked。


或者:

在發(fā)送結(jié)束的回調(diào)函數(shù)中,恢復(fù)uart的Ready狀態(tài)。

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
{
//回調(diào)函數(shù)
huart->State=HAL_UART_STATE_READY;


}

下面附的是mbed-os的代碼,它的UART_DMATransmitCplt函數(shù)直接復(fù)位Uart的狀態(tài)了。


/**

*@briefDMAUARTtransmitprocesscompletecallback

*@paramhdma:DMAhandle

*@retvalNone

*/

01523staticvoidUART_DMATransmitCplt(DMA_HandleTypeDef*hdma)

{

UART_HandleTypeDef*huart=(UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;

huart->TxXferCount=0;

/*DisabletheDMAtransferfortransmitrequestbysettingtheDMATbit

intheUARTCR3register*/

huart->Instance->CR3&=(uint32_t)~((uint32_t)USART_CR3_DMAT);

/*WaitforUARTTCFlag*/

if(UART_WaitOnFlagUntilTimeout(huart,UART_FLAG_TC,RESET,HAL_UART_TXDMA_TIMEOUTVALUE)!=HAL_OK)

{

/*TimeoutOccured*/

huart->State=HAL_UART_STATE_TIMEOUT;

HAL_UART_ErrorCallback(huart);

}

else

{

/*NoTimeout*/

/*Checkifareceiveprocessisongoingornot*/

if(huart->State==HAL_UART_STATE_BUSY_TX_RX)

{

huart->State=HAL_UART_STATE_BUSY_RX;

}

else

{

huart->State=HAL_UART_STATE_READY;

}

HAL_UART_TxCpltCallback(huart);

}

}



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉