国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通過修改HAL_UART_Transmit_DMA()函數(shù),解決串口發(fā)送DMA只能發(fā)送一次的問題

這篇具有很好參考價(jià)值的文章主要介紹了通過修改HAL_UART_Transmit_DMA()函數(shù),解決串口發(fā)送DMA只能發(fā)送一次的問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

參考文章:1.?http://t.csdn.cn/FT6Mg

? ? ? ? ? ? ? ? ? 2.?http://t.csdn.cn/ejFIQ

今天用STM32F1的HAL庫開發(fā)遇到一個(gè)奇怪的問題,在主函數(shù)循環(huán)調(diào)用中用串口1的DMA請求,將內(nèi)存中的數(shù)據(jù)發(fā)送給串口,無論延遲Delay開了多大,始終只能發(fā)送一次DMA數(shù)據(jù)。后來在網(wǎng)上查閱大佬的資料終于有了思路。

廢話不多說,先上代碼:

在 stm32f1xx_hal_uart.c 文件中找到HAL_UART_Transmit_DMA()函數(shù)實(shí)現(xiàn),在解鎖操作__HAL_UNLOCK;后添加代碼:huart -> gState = HAL_UART_STATE_READY;? 編譯以后運(yùn)行完美解決。而且在低延遲的高速while循環(huán)中反復(fù)調(diào)用串口DMA請求,都可以運(yùn)行。

HAL_UART_Transmit_DMA()函數(shù)實(shí)現(xiàn)修改:(也就多加了一行代碼而已[doge])

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)     
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->pTxBuffPtr = pData;
    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;   //修改串口的工作狀態(tài)為Busy

    /* Set the UART DMA transfer complete callback */
    huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;

    /* Set the UART DMA Half transfer complete callback */
    huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;

    /* Set the DMA error callback */
    huart->hdmatx->XferErrorCallback = UART_DMAError;

    /* Set the DMA abort callback */
    huart->hdmatx->XferAbortCallback = NULL;

    /* Enable the UART transmit DMA channel */
    tmp = (uint32_t *)&pData;
    HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t *)tmp, (uint32_t)&huart->Instance->DR, Size);

    /* Clear the TC flag in the SR register by writing 0 to it */
    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);

    /* Process Unlocked */
    __HAL_UNLOCK(huart);
		huart -> gState = HAL_UART_STATE_READY;    //這一句官方好像給落下了???

    /* Enable the DMA transfer for transmit request by setting the DMAT bit
       in the UART CR3 register */
    SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

簡要分析:每當(dāng)調(diào)用一次HAL_UART_Transmit_DMA()都會(huì)先進(jìn)行一次串口狀態(tài)的判斷:if (huart->gState == HAL_UART_STATE_READY) 如果串口處于READY狀態(tài),則開始本次的DMA傳輸,否則會(huì)返回一個(gè)BUSY狀態(tài):

else
? {
? ? return HAL_BUSY;
? }

當(dāng)?shù)谝淮握{(diào)用HAL_UART_Transmit_DMA()時(shí),串口處于READY狀態(tài),于是進(jìn)行DMA傳輸,注意,在DMA傳輸過程中,會(huì)將串口從READY狀態(tài)改為發(fā)送BUSY狀態(tài)(軟件修改):huart->gState = HAL_UART_STATE_BUSY_TX;但是在DMA完成本次傳輸工作以后,并沒有將串口從發(fā)送BUSY狀態(tài)改回READY狀態(tài),一開始我認(rèn)為可能硬件自動(dòng)修改該標(biāo)志,但是不確定,還沒有翻參考手冊,如果有知道的大佬煩請指教!因此這里我索性添加一句代碼軟件修改該狀態(tài):huart -> gState = HAL_UART_STATE_READY;

這樣就能保證每次調(diào)用完HAL_UART_Transmit_DMA()函數(shù)后,串口的狀態(tài)均為READY,為下一次的串口發(fā)送DMA請求做準(zhǔn)備。文章來源地址http://www.zghlxwxcb.cn/news/detail-536708.html

到了這里,關(guān)于通過修改HAL_UART_Transmit_DMA()函數(shù),解決串口發(fā)送DMA只能發(fā)送一次的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32 HAL庫的HAL_UART_Transmit_IT使用方法

    STM32 HAL庫的HAL_UART_Transmit_IT使用方法

    是STM32 HAL庫中非阻塞的串口發(fā)送函數(shù)。 用法:1. 調(diào)用HAL_UART_Transmit_IT()發(fā)送數(shù)據(jù) ? ? ? ? ? ?2. 在HAL_UART_TxCpltCallback()里寫上發(fā)送完成后的處理 注意:?HAL_UART_Transmit_IT()要等待上次發(fā)送完成后再發(fā)送,否則返回HAL_BUSY。用huart-gState == HAL_UART_STATE_READY判斷上次是否發(fā)送完成。 官方

    2024年02月16日
    瀏覽(24)
  • STM32-UART-DMA HAL庫緩沖收發(fā)

    STM32-UART-DMA HAL庫緩沖收發(fā)

    1.1、注意事項(xiàng): HAL庫的DMA底層基本都會(huì)默認(rèn)開啟中斷使能,如果在STM32CubeMx禁用了中斷相關(guān)的功能,程序可能會(huì)進(jìn)入空中斷回調(diào)出不來。 切記使用STM32-HAL庫的DMA發(fā)送時(shí)需要開啟USART中斷和DMA中斷。 在一般時(shí)間要求不是很高很高的場合,使用HAL庫自帶的函數(shù)就可以,并不會(huì)很頻

    2024年01月18日
    瀏覽(27)
  • stm32 hal庫uart使用 DMA中斷只能發(fā)送一次的問題

    1.stm32 uart使用DMA,無論發(fā)送還是接收都各自有一個(gè)數(shù)據(jù)流中斷。這個(gè)數(shù)據(jù)流中斷是框架代碼不必過多關(guān)心。 2.使用了DMA后,uart的global中斷是否要使用?標(biāo)準(zhǔn)做法是在cubemx上要勾選的,不然,就會(huì)產(chǎn)生只能發(fā)送一次的問題。 問題的原因? 我相信這是hal庫的問題,理論上講有一

    2024年02月11日
    瀏覽(22)
  • (stm32之HAL庫)UART工作在DMA模式要打開串口中斷嗎?

    (stm32之HAL庫)UART工作在DMA模式要打開串口中斷嗎?

    最近學(xué)習(xí)了stm32(F4xx)的串口在DMA模式下的使用,期間以ST官方提供的例程進(jìn)行參考學(xué)習(xí),發(fā)現(xiàn)其初始化過程中是打開了UART的中斷的,而且HAL庫中stm32f4xx_hal_uart.c文件中的DMA模式使用說明里也有這么一句話: 即在非循環(huán)模式下(也就是發(fā)完一次數(shù)據(jù)就停止的常用模式)需要配置

    2024年02月12日
    瀏覽(30)
  • 【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    Author: DrinkCat(szt@drinkcat.com) Copyright ? 2023 DrinkCat Original link: DrinkCat’s Blog UART是一種異步串行通信接口,常用于通過串口與外部設(shè)備進(jìn)行通信。它通過發(fā)送和接收數(shù)據(jù)幀來實(shí)現(xiàn)數(shù)據(jù)傳輸,使用起來相對(duì)簡單。UART通常包含發(fā)送器(Transmitter)和接收器(Receiver),通過兩根信號(hào)線

    2024年02月10日
    瀏覽(22)
  • STM32 HAL庫函數(shù)——HAL_UART_RxCpltCallback()詳解

    HAL_UART_RxCpltCallback 是一個(gè)回調(diào)函數(shù),用于在使用 HAL 庫進(jìn)行串口接收時(shí)處理接收完成事件。當(dāng)使用 HAL_UART_Receive_IT 函數(shù)啟動(dòng)串口接收并且接收到指定數(shù)量的數(shù)據(jù)后,HAL 庫會(huì)自動(dòng)調(diào)用 HAL_UART_RxCpltCallback 函數(shù)。 回調(diào)函數(shù)是一種特殊的函數(shù),它在特定事件發(fā)生時(shí)由系統(tǒng)或庫調(diào)用,

    2024年02月13日
    瀏覽(27)
  • STM32 HAL庫函數(shù)——HAL_UART_Receive_IT()詳解

    huart :UART句柄,指向要使用的UART外設(shè)。 pData :指向數(shù)據(jù)緩沖區(qū)的指針,用于存儲(chǔ)接收到的數(shù)據(jù)。 Size :要接收的數(shù)據(jù)元素(u8或u16)的數(shù)量。 返回值類型為 HAL_StatusTypeDef ,表示函數(shù)執(zhí)行的狀態(tài)。可能的返回值有: HAL_OK :函數(shù)執(zhí)行成功。 HAL_ERROR :函數(shù)執(zhí)行過程中發(fā)生錯(cuò)誤

    2024年02月08日
    瀏覽(27)
  • STM32CubeMX-HAL庫-UART串口接收中斷回調(diào)函數(shù)代碼分析

    ????????CubeMx中HAL庫函數(shù)的調(diào)用不同于庫函數(shù)調(diào)用,在學(xué)習(xí)CubeMx串口通信時(shí),不理解HAL庫中的回調(diào)函數(shù)是怎么被調(diào)用的,于是查看每個(gè)的定義,參考其他人寫的博客,總算弄明白了HAL庫中斷調(diào)用與庫函數(shù)不同之處。寫下這篇博客一是加深自己的理解,二是希望對(duì)不理解HA

    2024年02月02日
    瀏覽(45)
  • A11 STM32_HAL庫函數(shù) 之 DMA通用驅(qū)動(dòng)所有函數(shù)的介紹及使用

    序號(hào) 函數(shù)名 描述 1 HAL_DMA_Init() 初始化DMA通道。 2 HAL_DMA_DeInit() 反初始化DMA通道。 3 HAL_DMA_Start() 啟動(dòng)DMA傳輸。 4 HAL_DMA_Start_IT() 啟動(dòng)DMA傳輸并使用中斷處理傳輸完成。 5 HAL_DMA_Abort() 中止DMA傳輸。 6 HAL_DMA_Abort_IT() 中止DMA傳輸并使用中斷處理中止完成。 7 HAL_DMA_PollForTransfer() 輪詢

    2024年04月12日
    瀏覽(22)
  • CubeMX生成的中斷函數(shù)HAL_UART_IRQHandler(*huart1)如何使用。

    CubeMX生成的中斷函數(shù)HAL_UART_IRQHandler(*huart1)如何使用。

    串口發(fā)送/接收函數(shù) HAL_UART_Transmit();串口發(fā)送數(shù)據(jù),使用超時(shí)管理機(jī)制? HAL_UART_Receive();串口接收數(shù)據(jù),使用超時(shí)管理機(jī)制 HAL_UART_Transmit_IT();串口中斷模式發(fā)送 ? HAL_UART_Receive_IT();串口中斷模式接收 HAL_UART_Transmit_DMA();串口DMA模式發(fā)送 HAL_UART_Transmit_DMA();串口DMA模式接收 串口中斷函

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包