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

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

這篇具有很好參考價值的文章主要介紹了STM32-UART-DMA HAL庫緩沖收發(fā)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、說明

1.1、注意事項:

  • HAL庫的DMA底層基本都會默認開啟中斷使能,如果在STM32CubeMx禁用了中斷相關(guān)的功能,程序可能會進入空中斷回調(diào)出不來。
  • 切記使用STM32-HAL庫的DMA發(fā)送時需要開啟USART中斷和DMA中斷。
  • 在一般時間要求不是很高很高的場合,使用HAL庫自帶的函數(shù)就可以,并不會很頻繁的觸發(fā)中斷占用資源。

1.2、接收部分

  • 接收DMA初始化成循環(huán)傳輸模式。開啟對應DMA通道中斷和串口全局中斷
  • 之前擔心開啟串口中斷會在接收數(shù)據(jù)時連續(xù)觸發(fā)中斷、導致消耗CPU資源,實際HAL底層未開啟接收中斷,不會觸發(fā)中斷。

1.3、發(fā)送部分

  • 發(fā)送時如果要使用DAM功能,必須開啟DMA中斷和串口中斷。HAL的全局狀態(tài)需要在中斷中得到更新,否則會發(fā)送完一次狀態(tài)一直處于被占用中。
  • HAL底層開啟了串口數(shù)據(jù)發(fā)送完成中斷TC。該中斷只有在DMA沒有新的數(shù)據(jù)傳入后,并且移位寄存器為空時才會觸發(fā)一次,不會每發(fā)送一個字節(jié)就會觸發(fā)中斷。

STM32-UART-DMA HAL庫緩沖收發(fā),stm32,單片機,嵌入式硬件


STM32-UART-DMA HAL庫緩沖收發(fā),stm32,單片機,嵌入式硬件

2、代碼

2.1、初始化

初始化接收即可,發(fā)送會在有數(shù)據(jù)時才會去操作DMA
開啟中斷


STM32-UART-DMA HAL庫緩沖收發(fā),stm32,單片機,嵌入式硬件


STM32-UART-DMA HAL庫緩沖收發(fā),stm32,單片機,嵌入式硬件

 
#include "SEGGER_RTT.h"

#define TX_FIFO_SIZE 36
#define RX_FIFO_SIZE 128

static uint8_t rxbuff[RX_FIFO_SIZE];
static uint8_t txbuff[TX_FIFO_SIZE];

static uint16_t tx_tail = 0;
static uint16_t tx_head = 0;

2.2、緩沖接收

循環(huán)接收、需要開啟DMA和UART中斷

void dma_uart_init()
{
  HAL_UART_Receive_DMA(&huart1, rxbuff, RX_FIFO_SIZE);
}
///查詢讀取一個字節(jié)數(shù)據(jù)
int dma_uart_read_char()
{
  static int rx_tail = 0;
  int rx_head = (RX_FIFO_SIZE)-huart1.hdmarx->Instance->CNDTR; // 接收到的數(shù)據(jù)偏移量
  if (rx_head != rx_tail)
  {
    int ch = rxbuff[rx_tail++];
    if (rx_tail >= RX_FIFO_SIZE)
    {
      rx_tail = 0;
    }
    return ch;
  }
  return -1;
}

2.3、緩沖發(fā)送

單次DMA發(fā)送,需要開啟DMA和UART中斷文章來源地址http://www.zghlxwxcb.cn/news/detail-801703.html

///查詢狀態(tài)并觸發(fā)一次發(fā)送
static void dma_uart_write_trig()
{
  static int lock = 0;
  if (lock)//中斷重入鎖
    return;
  lock = 1;

  if (huart1.gState == HAL_UART_STATE_READY)
  {
    static uint8_t dma_tx_fifo[128];
    for (size_t n = 0; n < 128; n++)
    {
      if (tx_head != tx_tail)
      {
        dma_tx_fifo[n] = txbuff[tx_tail++];
        if (tx_tail >= TX_FIFO_SIZE)
          tx_tail = 0;
      }
      else
      {
        if (n > 0)
        {
          HAL_UART_Transmit_DMA(&huart1, dma_tx_fifo, n);
        }
        break;
      }
    }
  }
  lock = 0;
}

///DMA緩沖發(fā)送多個字節(jié)數(shù)據(jù)
void dma_uart_writes(const uint8_t *data, int size)
{
  for (size_t i = 0; i < size; i++)
  {
    uint16_t tmp = tx_head + 1;
    if (tmp >= TX_FIFO_SIZE)
    {
      tmp = 0;
    }
#if 0 // 丟棄新的數(shù)據(jù)
    if (tmp == tx_tail) // 數(shù)據(jù)溢出 發(fā)送慢于寫入
    {
      break;  
    }
#else // 等待舊數(shù)據(jù)發(fā)送完
    if (tmp == tx_tail)
    {
      while (tmp == tx_tail)
      {
      }
    }
#endif
    txbuff[tx_head] = data[i];
    tx_head = tmp;
  }
  dma_uart_write_trig();
}

///中斷回掉函數(shù),該函數(shù)由串口發(fā)送完成中斷TC觸發(fā)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  dma_uart_write_trig();
}

2.4、格式化打印

#include "stdarg.h"
#include "stdio.h"

#define PRINT_BUFF_SIZE 500
static char print_buff[PRINT_BUFF_SIZE];
void print_x(void *format, ...)
{
  va_list ap;
  va_start(ap, format);
  int n = vsnprintf(print_buff, PRINT_BUFF_SIZE, format, ap);
  va_end(ap);
  if (n > 0)
  {
    dma_uart_writes((uint8_t *)print_buff, n);
  }
}

到了這里,關(guān)于STM32-UART-DMA HAL庫緩沖收發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • stm32 hal庫uart使用 DMA中斷只能發(fā)送一次的問題

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

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

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

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

    2024年02月12日
    瀏覽(30)
  • 【STM32筆記】STM32的串口數(shù)據(jù)收發(fā)基礎(四)(USART DMA模式)

    【STM32筆記】STM32的串口數(shù)據(jù)收發(fā)基礎(四)(USART DMA模式)

    ? ?? 在STM32中編寫串口通信數(shù)據(jù)收發(fā)有三種方式: 輪詢模式 (阻塞方式), 中斷模式 (非阻塞方式)以及 DMA模式 。 ? ?? 打開STM32CubeMX,前部分配置流程如串口數(shù)據(jù)收發(fā)基礎(三)節(jié)里一樣。配置好USART1的基本參數(shù),開啟定時器中斷后,接下來就要開啟USART1的DMA。

    2024年02月03日
    瀏覽(17)
  • STM32 cubemx+串口空閑中斷+DMA雙緩沖

    ????????寫這篇文章是為了記錄下之前做過的項目中用到的一部分關(guān)鍵技術(shù),之前做過的項目中涉及到 采用最小開銷來實時接收遙控器數(shù)據(jù)、能夠準確驗證傳輸過來數(shù)據(jù)的準確性 ,減小誤差率,要求能穩(wěn)定適用于不同的環(huán)境。 目錄 1、為什么要用到串口空閑中斷? 2、為

    2024年02月09日
    瀏覽(21)
  • stm32和python實現(xiàn)DMA+串口數(shù)據(jù)收發(fā)

    1-0 串口配置 1-1 DMA發(fā)送模式配置 1-2 通過DMA傳輸數(shù)據(jù)到USART1的發(fā)送寄存器 1-3 串口數(shù)據(jù)發(fā)送 將usart1_dma_tx_data()函數(shù)放在main函數(shù)中或者中斷處理函數(shù)中即可,如下所示: 2-1 DMA接收模式配置 2-2 串口結(jié)束中斷 2-3 對串口接收的數(shù)據(jù)進行處理 3 完整程序

    2024年02月14日
    瀏覽(25)
  • 【STM32】HAL庫 STM32CubeMX——DMA (串口DMA發(fā)送接收)

    【STM32】HAL庫 STM32CubeMX——DMA (串口DMA發(fā)送接收)

    軟件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦線,面包板,USB轉(zhuǎn)TTL DMA,全稱Direct Memory Access,即直接存儲器訪問。 DMA傳輸將數(shù)據(jù)從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。 我們知道系統(tǒng)的運

    2024年02月12日
    瀏覽(24)
  • stm32 uart dma方式接收不定長度字符

    一般處理: stm32 uart使用dma接收時,會有自己的數(shù)據(jù)流中斷,數(shù)據(jù)流中斷會調(diào)用HAL_UART_RxCpltCallback。但是數(shù)據(jù)流中斷只會在HAL_UART_Receive_DMA函數(shù)指定的buffer滿時才會觸發(fā)。 接收不定長度字符,需要和uart的UART_IT_IDLE結(jié)合。 兩種結(jié)合方式 第一種:(習慣標準庫的程序員) 步驟

    2024年02月10日
    瀏覽(15)
  • HAL庫STM32的串口收發(fā)教程

    HAL庫STM32的串口收發(fā)教程

    ??????? 首先配置STM32CubeMX 第一步在系統(tǒng)SYS里的Debug(調(diào)試)選項選擇Serial Wire(這里使用ST-LINK-V2仿真下載器所以選擇該項)。 ?第二打開使用外部晶振 ?在芯片引腳上點擊PC13選擇GPIO_Output(即設置GPIO為輸出模式) 點擊GPIO,點擊PC13 在其下方配置引腳: GPIO out? level 設置成

    2024年02月14日
    瀏覽(27)
  • STM32學習筆記(五)串口空閑中斷+DMA實現(xiàn)不定長收發(fā)(stm32c8t6)

    STM32學習筆記(五)串口空閑中斷+DMA實現(xiàn)不定長收發(fā)(stm32c8t6)

    記錄一下學習過程 DMA DMA,全稱為: Direct Memory Access,即直接存儲器訪問, DMA 傳輸將數(shù)據(jù)從一個 地址空間復制到另外一個地址空間。 這一過程無需cpu的參與,從而提高cpu使用的效率 DMA相關(guān)的參數(shù):1 數(shù)據(jù)的源地址、2 數(shù)據(jù)傳輸?shù)哪繕说刂?、3 傳輸寬度,4 傳輸多少字節(jié),5 傳

    2024年02月14日
    瀏覽(20)
  • STM32 HAL DMA中斷配置

    STM32 HAL DMA中斷配置

    使用HAL庫方式DMA中斷時,在網(wǎng)上找了好多資料都沒有怎么介紹。所以就自己研究了一下,并做個記錄。我的芯片型號是STM32G030。下面我以I2C傳數(shù)據(jù)為例介紹下HAL庫是如何使用DMA中斷的。 我使用的是I2C2,簡單配置下參數(shù),加上DMA通道。 DMA貌似默認開啟了中斷,藍色的勾勾是我

    2024年04月23日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包