成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

DMA發(fā)送函數(shù)只能被調(diào)用一次嗎

2024/12/12
2193
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

在STM32HAL庫里定義很多狀態(tài)變量,用于對各自外設(shè)模塊的狀態(tài)管理,比方ready,busy,idle,timeout,error等,以便正確使用各個外設(shè),避免使用上的混亂。

usart為例,庫里為USART的發(fā)送、接收操作分別定義了兩個狀態(tài)變量,即gState和RxState。其中g(shù)State表示USART的發(fā)送狀態(tài),RxState表述接收時可能的狀態(tài)。

是ready還是busy或其它出錯、超時狀態(tài)。USART初始化后gState為reddy狀態(tài),當(dāng)要調(diào)用UART發(fā)送函數(shù)時軟件將其設(shè)置為Busy.當(dāng)usart完成發(fā)送或中止發(fā)送時,軟件將gState設(shè)置回Ready。

如果說你調(diào)用的查詢式發(fā)送函數(shù),即HAL_UART_Transmit(),則在該函數(shù)里查詢到數(shù)據(jù)發(fā)送完畢或發(fā)生超時都會將gState設(shè)置為Ready.

如果說你調(diào)用的是中斷式發(fā)送函數(shù),即HAL_UART_Transmit_IT(),同時你沿用CubeMx創(chuàng)建的中斷服務(wù)程序代碼框架,在相應(yīng)的發(fā)送中斷服務(wù)程序里檢測到發(fā)送完畢時,也會將gState修改為ready為下次發(fā)送做準(zhǔn)備。 如果說你調(diào)用API函數(shù)是HAL_UART_Transmit_IT(),而中斷服務(wù)程序是另外組織的,要記得在發(fā)送完成時將gState改為Ready,不然下次調(diào)用HAL_UART_Transmit_IT()函數(shù)會因?yàn)間state檢查不通過而不能得以執(zhí)行。

如果說你調(diào)用的是DMA方式發(fā)送函數(shù),即HAL_UART_Transmit_DMA(),同樣,也沿用CubeMx創(chuàng)建的中斷服務(wù)程序代碼框架,且開啟了DMA完成中斷和UART事件的中斷,

st-img

在相應(yīng)的DMA完成中斷代碼里也會適時地將gState從busy改為ready。如果說,你雖然調(diào)用了HAL_UART_Transmit_DMA()函數(shù),但沒有開啟DMA完成中斷,也沒有在適當(dāng)?shù)奈恢脤State改為ready,這時就會發(fā)生即使你多次調(diào)用HAL_UART_Transmit_DMA()函數(shù)而只會做一次發(fā)送的情形。因?yàn)樵诤罄m(xù)的HAL_UART_Transmit_DMA()函數(shù)里做gState檢查發(fā)現(xiàn)是busy而強(qiáng)行退出。當(dāng)然,這時手動將其改為Ready也是可以的,但要保證合適的時間點(diǎn)。

比方,我就是不想開啟DMA相關(guān)中斷,只是想通過DMA方式發(fā)送幾次字符串而已,像下面這樣

HAL_UART_Transmit_DMA(&huart2, (uint8_t *)String1,??sizeof(String1));

HAL_Delay(200);

huart2.gState = HAL_UART_STATE_READY;

huart2.hdmatx->State = HAL_DMA_STATE_READY;
__HAL_UNLOCK(huart2.hdmatx);

HAL_UART_Transmit_DMA(&huart2, (uint8_t *)String2,??sizeof(String2));

HAL_Delay(200);

huart2.gState = HAL_UART_STATE_READY;

huart2.hdmatx->State = HAL_DMA_STATE_READY;
__HAL_UNLOCK(huart2.hdmatx);

當(dāng)然,這里還有一種情況,盡管當(dāng)我們基于中斷或DMA方式調(diào)用UART發(fā)送,也開啟了相關(guān)中斷并沿用庫函數(shù)的寫法,還是可能出現(xiàn)只有第一次發(fā)送有效的
情況,比方像下面這樣:

HAL_UART_Transmit_DMA(&huart2, (uint8_t *)String1,??sizeof(String1));
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)String2,??sizeof(String2));
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)String3,??sizeof(String3));

這里的三次調(diào)用太近了,第一次調(diào)用時軟件將gstate改為busy,當(dāng)運(yùn)行第二個第三個調(diào)用時,第一次的uart發(fā)送可能根本沒有完成,自然也就沒法
基于它的完成中斷將gstate改為ready,這樣導(dǎo)致后續(xù)的兩次調(diào)用都無效了。所以像這種情況,第二次調(diào)用前要確保上次傳輸完成了。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

大荔县| 泾源县| 五大连池市| 安丘市| 喀喇| 丰顺县| 诸暨市| 崇礼县| 郸城县| 合川市| 如东县| 蓬溪县| 汾阳市| 淮阳县| 保康县| 宜兴市| 洛川县| 山东省| 钟祥市| 泗水县| 温泉县| 宾阳县| 通渭县| 报价| 江城| 安达市| 娱乐| 浦东新区| 调兵山市| 稻城县| 长治市| 绥滨县| 平谷区| 绥德县| 普兰店市| 和田市| 万全县| 正镶白旗| 多伦县| 遵化市| 河池市|