0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32 UART配置中斷DMA傳輸

冬至子 ? 來源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-24 14:32 ? 次閱讀

在處理UART數(shù)據(jù)的時(shí)候,DMA是一種非常靈活、高效的方式。

※補(bǔ)記:USART_DR 串口數(shù)據(jù)寄存器是一個(gè)雙寄存器,包含了TDR和RDR,對(duì)它讀操作,讀取的是RDR寄存器的值,對(duì)它的寫操作,實(shí)際上是寫到TDR寄存器;當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到收據(jù)的時(shí)候,也是存在該寄存器內(nèi)。

圖片

圖片

關(guān)于讀寫:

__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx);/*
讀取接收寄存器USARTx_DR中8位數(shù)據(jù),接收即所得。返回值最大為0xFF
若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。
*/
__STATIC_INLINE uint16_t LL_USART_ReceiveData9(USART_TypeDef *USARTx);/*
讀取接收寄存器USARTx_DR中9位數(shù)據(jù)(當(dāng)字節(jié)長(zhǎng)9,接收即所得)。返回值最大為0x1FF
若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。
*/
__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value);/*
向發(fā)送寄存器寫入9位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值
*/
__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)/*
向發(fā)送寄存器寫入8位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值
*/

·

API

__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx);/*
使能接收DMA,啟用后DR有數(shù)據(jù)時(shí)將允許發(fā)送DMA請(qǐng)求;具體見示例用法
*/
__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx);/*
禁用接收DMA
*/
__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(USART_TypeDef *USARTx);/*
檢測(cè)是否使能接收DMA
*/

__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx);/*
使能發(fā)送DMA
*/
__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx);/*
禁用發(fā)送DMA
*/
__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(USART_TypeDef *USARTx);/*
檢測(cè)是否使能發(fā)送DMA
*/
/**************************************************/
__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx);/*
返回UART模塊數(shù)據(jù)寄存器DR地址;無論是否啟用DMA均可用
*/

/ 結(jié)力期末考分界線 */

配置使用DMA收發(fā):

1.在CubeMX中:

圖片

圖片

圖片

+在項(xiàng)目設(shè)置中調(diào)整為使用LL

2.生成代碼

此時(shí)在生成代碼已實(shí)現(xiàn)了串口DMA的初始化設(shè)置并生成了相應(yīng)的DMA中斷句柄。接下來通過代碼實(shí)現(xiàn)功能。示例為一個(gè)簡(jiǎn)單的功能,將串口接收到的數(shù)據(jù)再通過串口發(fā)出。

3.配置

①在main.h中定義全局變量test_data:

uint8_t test_data;

②在usart.c中引入變量

extern uint8_t test_data;

③在usart.c中進(jìn)行設(shè)置

※通道配置為非循環(huán)模式時(shí),傳輸結(jié)束后(即傳輸計(jì)數(shù)變?yōu)?)將不再產(chǎn)生DMA操作。要開始新的DMA傳輸,需要3個(gè)步驟:在關(guān)閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數(shù)目(有需要?jiǎng)t需重新配置地址),然后重新開啟DMA。

//RX DMA配置
 LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5,LL_USART_DMA_GetRegAddr(USART1));//連接外設(shè)寄存器USART1- >DR
 LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data);//連接數(shù)據(jù)存儲(chǔ)地址
 LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 1);/*設(shè)置傳輸?shù)臄?shù)據(jù)長(zhǎng)度,由于是一字節(jié)一傳所以此處為1,
 若數(shù)據(jù)為n字節(jié)則會(huì)在接收到的字節(jié)數(shù)量達(dá)到n的時(shí)候,才傳輸結(jié)束。*/
 LL_USART_EnableDMAReq_RX(USART1);//使能RX接收DMA
 LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);//使能DMA通道的傳輸完成中斷功能;當(dāng)傳輸量達(dá)到數(shù)據(jù)長(zhǎng)度將引發(fā)中斷
 LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//開啟DMA傳輸,此時(shí)若RX讀取到數(shù)據(jù)寫入DR將傳輸至MemoryAddress
 //
 //TX DMA配置
 LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, LL_USART_DMA_GetRegAddr(USART1)); //連接外設(shè)寄存器USART1- >DR
 LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data); //連接數(shù)據(jù)存儲(chǔ)地址
 LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_4); //使能DMA中斷
 LL_USART_EnableDMAReq_TX(USART1); //使能TX接收DMA
 
  /* USER CODE END USART1_Init 1 */

④中斷處理函數(shù):

void DMA1_Channel5_IRQHandler(void)
{   //RX中斷調(diào)用
  /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */
 
    if(LL_DMA_IsActiveFlag_TC5(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷
 {
  LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);//關(guān)閉通道,以在之后開啟新的DMA傳輸
  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data);  //TX連接數(shù)據(jù)存儲(chǔ)地址
  LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, 1);//設(shè)置TX數(shù)據(jù)長(zhǎng)度
  LL_DMA_ClearFlag_TC5(DMA1);//清除中斷標(biāo)志,使能下一次RX中斷
  
  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);//從數(shù)據(jù)位置向TX啟動(dòng)一次DMA;傳輸完成后調(diào)用TX的DMA中斷
 }
  /* USER CODE END DMA1_Channel5_IRQn 0 */

}
void DMA1_Channel4_IRQHandler(void)
{ //TX中斷調(diào)用
  /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
    if(LL_DMA_IsActiveFlag_TC4(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷
 {
  LL_DMA_ClearFlag_TC4(DMA1); //清除中斷標(biāo)志
  LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4); //關(guān)閉通道,以在之后開啟新的DMA傳輸
  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data);   //RX連接數(shù)據(jù)存儲(chǔ)地址
  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//再次啟動(dòng)RX DMA功能
 }
  
  /* USER CODE END DMA1_Channel4_IRQn 0 */
}

以上代碼即可實(shí)現(xiàn)功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119838
  • TDR
    TDR
    +關(guān)注

    關(guān)注

    1

    文章

    68

    瀏覽量

    19881
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10949
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15256
  • 數(shù)據(jù)存儲(chǔ)器

    關(guān)注

    1

    文章

    69

    瀏覽量

    17765
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32串口中斷 DMA接收的幾點(diǎn)注意地方

    STM32串口中斷DMA接收的幾點(diǎn)注意地方
    的頭像 發(fā)表于 03-04 13:57 ?2.1w次閱讀

    DMA通信編程與STM32串口中斷方式

    目錄DMA通信原理DMA的基本介紹DMA工作原理STM32DMA結(jié)構(gòu)DMA的主要特性
    發(fā)表于 11-26 19:21 ?13次下載
    <b class='flag-5'>DMA</b>通信編程與<b class='flag-5'>STM32</b>串口<b class='flag-5'>中斷</b>方式

    STM32 串口使用IDLE中斷+DMA接收(HAL庫函數(shù))

    STM32 串口使用IDLE中斷+DMA接收(HAL庫函數(shù))一、開發(fā)環(huán)境單片機(jī)型號(hào):STM32H743IIT6工程配置環(huán)境:
    發(fā)表于 12-02 21:06 ?40次下載
    <b class='flag-5'>STM32</b> 串口使用IDLE<b class='flag-5'>中斷</b>+<b class='flag-5'>DMA</b>接收(HAL庫函數(shù))

    STM32---UART使用DMA數(shù)據(jù)傳輸

    當(dāng)預(yù)先不知道要接收的數(shù)據(jù)時(shí),如何使用 DMAUART 上讀取數(shù)據(jù)的信息。在STM32中,通常有以下幾種模式:輪詢模式程序必須輪詢狀態(tài)位以檢查是否已收到新字符并以足夠快的速度讀取它以獲得所有字節(jié)
    發(fā)表于 12-03 10:06 ?8次下載
    <b class='flag-5'>STM32---UART</b>使用<b class='flag-5'>DMA</b>數(shù)據(jù)<b class='flag-5'>傳輸</b>

    STM32CubeMX_UART_printf_接收中斷_DMA空閑中斷_LPUART

    文章目錄前言STM32CubeMX新建F767工程UART配置生成代碼串口發(fā)送printf支持串口接收中斷DMA空閑
    發(fā)表于 12-06 18:36 ?6次下載
    <b class='flag-5'>STM32CubeMX_UART</b>_printf_接收<b class='flag-5'>中斷</b>_<b class='flag-5'>DMA</b>空閑<b class='flag-5'>中斷</b>_LPUART

    STM32 HAL CubeMX 串口IDLE接收空閑中斷+DMA

    關(guān)于DMA原理部分講解,及CubeMx配置部分,請(qǐng)參考該文章【STM32】HAL庫 STM32CubeMX教程十一—DMA (串口
    發(fā)表于 12-20 19:39 ?30次下載
    <b class='flag-5'>STM32</b> HAL CubeMX 串口IDLE接收空閑<b class='flag-5'>中斷</b>+<b class='flag-5'>DMA</b>

    STM32L431 寄存器配置 USART+DMA發(fā)送+中斷接收

    用的外設(shè)是PA9 PA10DMA選擇的是DMA2_Channel6代碼中還用了DMA傳輸完成中斷,用來
    發(fā)表于 12-24 19:09 ?17次下載
    <b class='flag-5'>STM32</b>L431 寄存器<b class='flag-5'>配置</b> USART+<b class='flag-5'>DMA</b>發(fā)送+<b class='flag-5'>中斷</b>接收

    STM32CubeMx配置DMA+串口空閑中斷+FreeRTOS,完美處理串口數(shù)據(jù)。

    。使用DMA輔助處理串口的數(shù)據(jù),能夠大幅緩解單片機(jī)的運(yùn)行壓力,提高串口數(shù)據(jù)的處理能力。使用CubeMx配置串口+DMA+FreeRTOS,以下內(nèi)容僅展示了主要涉及到的串口和DMA
    發(fā)表于 12-24 19:11 ?50次下載
    <b class='flag-5'>STM32</b>CubeMx<b class='flag-5'>配置</b><b class='flag-5'>DMA</b>+串口空閑<b class='flag-5'>中斷</b>+FreeRTOS,完美處理串口數(shù)據(jù)。

    STM32U59 SPI DMA發(fā)送未產(chǎn)生傳輸完成中斷問題分析

    某客戶發(fā)現(xiàn)修改代碼后,STM32U59 SPI DMA 發(fā)送未產(chǎn)生傳輸完成中斷,但修改的代碼跟 SPI 以及 DMA 毫無關(guān)聯(lián)。
    的頭像 發(fā)表于 09-01 12:11 ?5677次閱讀

    HAL庫無法實(shí)現(xiàn)UARTDMA傳輸真是這樣嗎?

    使用STM32CubeMx進(jìn)行圖形化配置,并生成基于HAL庫的初始代碼,要實(shí)現(xiàn)UART收發(fā)功能的DMA傳輸的話,除了安排好的收發(fā)緩沖內(nèi)存外,
    的頭像 發(fā)表于 01-08 11:16 ?2612次閱讀

    DMA中斷的內(nèi)存到內(nèi)存傳輸

    要使用中斷配置 DMA,請(qǐng)按照內(nèi)存到內(nèi)存模式部分中詳述的步驟進(jìn)行操作。 在System Core 》 NVIC中啟用DMA1 Channel 1 Global Interrupt如下圖
    發(fā)表于 03-23 15:23 ?3013次閱讀
    <b class='flag-5'>DMA</b>帶<b class='flag-5'>中斷</b>的內(nèi)存到內(nèi)存<b class='flag-5'>傳輸</b>

    DMA不產(chǎn)生傳輸完成中斷

    DMA不產(chǎn)生傳輸完成中斷
    的頭像 發(fā)表于 10-18 16:44 ?1277次閱讀
    <b class='flag-5'>DMA</b>不產(chǎn)生<b class='flag-5'>傳輸</b>完成<b class='flag-5'>中斷</b>

    STM32串口中斷DMA接收常見的幾個(gè)問題

    STM32串口中斷DMA接收常見的幾個(gè)問題
    的頭像 發(fā)表于 10-26 16:41 ?3340次閱讀
    <b class='flag-5'>STM32</b>串口<b class='flag-5'>中斷</b>及<b class='flag-5'>DMA</b>接收常見的幾個(gè)問題

    STM32如何配置外部中斷?STM32外部中斷配置步驟

    STM32如何配置外部中斷STM32外部中斷配置步驟? 作為一款現(xiàn)代化的微控制器,
    的頭像 發(fā)表于 10-26 17:47 ?3326次閱讀

    STM32 DMA傳輸的問題分析

    用戶使用STM32G473RET6芯片,開發(fā)環(huán)境STM32CubeMX+Keil(LL庫)。使用DMA1通道1,在半傳輸中斷和完全
    的頭像 發(fā)表于 12-01 09:19 ?2638次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>DMA</b><b class='flag-5'>傳輸</b>的問題分析