在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32基礎知識:串口通信-DMA方式

CHANBAEK ? 來源:上下求索電子er ? 作者:上下求索電子er ? 2023-10-26 11:48 ? 次閱讀

串口通信-DMA方式

1 DMA概述

直接存儲器訪問 (DMA) : 用于在外設與存儲器之間以及存儲器與存儲器之間進行高速數據傳輸。DMA傳輸過程的初始化和啟動由CPU完成,傳輸過程由DMA控制器來執行,無需CPU參與,從而節省CPU資源,提高利用率。

DMA數據傳輸的四個要素:

  • 傳輸源 :DMA數據傳輸的來源
  • 傳輸目標:DMA數據傳輸的目的
  • 傳輸數量:DMA傳輸數據的數量
  • 觸發信號:啟動一次DMA數據傳輸的動作

STM32的DMA控制器特點

圖片

  1. 每個DMA控制器有8個數據流,每個數據流可以映射到8個通道(或請求);
  2. 每一個DMA控制器用于管理一個或多個外設的存儲器訪問請求,并通過總線仲裁器來協調各個DMA請求的優先級;
  3. 數據流(stream)是用于連接傳輸源和傳輸目標的數據通路,每個數據流可以配置為不同的傳輸源和傳輸目標,這些傳輸源和傳輸目標稱為通道(Channel);
  4. 具備16字節的FIFO。使能FIFO功能后,源數據先送入FIFO,達到FIFO的觸發閾值后,再傳送到目標地址。
    圖片

DMA數據傳輸方式

  • 普通模式:傳輸結束后(即要傳輸數據的數量達到零),將不再產生DMA操作。若 開始新的DMA傳輸,需在關閉DMA通道情況下,重新啟動DMA傳輸。
  • 循環模式:可用于處理環形緩沖區和連續數據流(例如ADC掃描模式)。當激活循 環模式后,每輪傳輸結束時,要傳輸的數據數量將自動用設置的初始值進行加載,并繼續響應DMA請求。

2 DMA方式的接口函數

  1. 串口DMA方式發送函數:HAL_UART_Transmit_DMA

    函數原型HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_Handle TypeDef *huart, uint 8_t *pData, uint 16_t Size)
    功能描述在DMA方式下發送一定數量的數據
    入口參數1huart:串口句柄的地址
    入口參數pData:待發送數據的首地址
    入口參數3Size:待發送數據的個數
    返回值HAL狀態值:HAL_OK表示發送成功;HAL_ERROR表示參數錯誤;HAL_BUSY表示串口被占用;
    注意事項1. 該函數將啟動DMA方式的串口數據發送2. 完成指定數量的數據發送后,可以觸發DMA中斷,在中斷中將調用發送中斷回調函數HAL_UART_TxCpltCallback進行后續處理3. 該函數由用戶調用戶調用
  2. 串口DMA方式接收函數:HAL_UART_Receive_DMA

    函數原型HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_Handle TypeDef *huart, uint 8_t *pData, uint 16_t Size)
    功能描述在DMA方式下接收一定數量的數據
    入口參數1huart:串口句柄的地址
    入口參數pData:待接收數據的首地址
    入口參數3Size:待接收數據的個數
    返回值HAL狀態值:HAL_OK表示發送成功;HAL_ERROR表示參數錯誤;HAL_BUSY表示串口被占用;
    注意事項1. 該函數將啟動DMA方式的串口數據接收2. 完成指定數量的數據接收后,可以觸發DMA中斷,在中斷中將調用接收中斷回調函數HAL_UART_ExCpltCallback進行后續處理3. 該函數由用戶調用戶調用
  3. 獲取未傳輸數據個數函數:__HAL_DMA_GET_COUNTER

    函數原型__HAL_DMA_GET_COUNTER
    功能描述獲取DMA數據流中未傳輸數據的個數
    參數HANDLE :串口句柄的地址
    返回值NDTR寄存器的內容,即DMA數據流中無傳輸數據的個數
    注意事項1. 該函數是宏函數,進行宏替換,不發生函數調用2. 該函數需要由用戶調用,用于獲取未傳輸數據的個數
  4. 關閉DMA數據流:__HAL_DMA_DISABLE

    函數原型__HAL_DMA_DISABLE(__HANDLE__)
    功能描述關閉指定的DMA數據流
    參數HANDLE :串口句柄的地址
    返回值
    注意事項1. 該函數是宏函數,進行宏替換,不發生函數調用2. 該函數需要由用戶調用,用于關閉指定的DMA數據流3. 關閉DMA數據流后觸發DMA中斷,最終調用串口收發的回調函數

任務實踐4

不定長數據的收發:利用串口調試助手,從PC上發送任意長度的字符到開發板,開發板收到后原樣發回到PC。

空閑中斷的特點:

  1. 在一幀數據傳輸結束后,通信線路將會維持高電平,這個狀態稱為空閑狀態;
  2. 當CPU檢測到通信線路處于空閑狀態時,且空閑狀態持續時間大于一個字節傳輸時間時,空閑狀態標志IDLE將由硬件置1。如果串口控制寄存器CR1中的IDLEIE位為1,將會觸發空閑中斷( IDLE中斷);
  3. 由于空閑標志是在一幀數據傳輸完成后才置位,在有效數據傳輸過程中不會置位,因此借助空閑中斷,可以實現不定長數據的收發。

設計思路:

  1. 使能IDLE中斷,在串口2的中斷服務程序USART2_IRQHandler中添加對IDLE中斷的判斷,該函數位于stm32f4xx_it.c文件;

  2. 設置傳輸模式為普通模式,啟動DMA傳輸。串口一旦接收到數據,則觸發DMA操作,將數據存放到用戶定義的接收緩沖區;

  3. 當一幀數據發送完成后,線路處于IDLE狀態,將觸發IDLE中斷,調用IDLE中斷回調函數,設置數據接收完成標志;

  4. 主程序檢測到接收完成標志置位后,將接收的一幀數據原樣發回到PC,并禁能DMA,以觸發DMA中斷。DMA中斷將調用接收中斷回調函數,在回調函數中重新啟動DMA傳輸。

  5. 串口1的DMA配置
    圖片
    DMA數據流的中斷使能由CubeMX自動勾選,手動使能串口2中斷
    圖片

  6. 編寫程序
    stm32f1xx_it.c中添加空閑中斷的處理

    /**
      * @brief This function handles USART1 global interrupt.
      */
    void USART1_IRQHandler(void)
    {
      /* USER CODE BEGIN USART1_IRQn 0 */
    
      /* USER CODE END USART1_IRQn 0 */
      HAL_UART_IRQHandler(&huart1);
      /* USER CODE BEGIN USART1_IRQn 1 */
    
      // Add handling of idle interrupts
      if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE != RESET))
      {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);   // Clear the IDLE interrupt flag
        HAL_UART_IdleCpltCallback(&huart1);   // User-written IDLE interrupt callback function
      }
      /* USER CODE END USART1_IRQn 1 */
    }
    

    main.c

    添加用戶宏變量、變量定義

    /* USER CODE BEGIN PM */
    #define LENGTH 100   // Receive buffer size
    /* USER CODE END PM */
    
    /* USER CODE BEGIN PV */
    uint8_t RxBuffer[LENGTH];
    uint8_t RecCount = 0;
    uint8_t RxFlag = 0;
    /* USER CODE END PV */
    

    聲明和定義空閑中斷回調函數,定義DMA接收中斷回調函數

    /* USER CODE BEGIN PFP */
    void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 4 */
    int fputc (int ch, FILE *f)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    int fgetc(FILE *f)
    {
        uint8_t ch = 0;
        HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      if (huart- >Instance == USART1)
      {
        HAL_UART_Receive_DMA(&huart1, (uint8_t*)RxBuffer, LENGTH);
      }
    }
    
    void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
    {
      RxFlag = 1;
    }
    /* USER CODE END 4 */
    

    編寫用戶應用代碼

    /* USER CODE BEGIN 2 */
      printf("***  UART coummunication using IDLE IT + DMAn");
      pringf("PLease enter arbitrary length characters:n");
      __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
      HAL_UART_Receive_DMA(&huart1, (uint8_t*)RxBuffer, LENGTH);
     /* USER CODE END 2 */
    
      /* USER CODE BEGIN 3 */
        if (RxFlag == 1)
        {
          RxFlag = 0;
          RecCount = LENGTH - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
          HAL_UART_Transmit_DMA(&huart1, (uint8_t*)RxBuffer, RecCount);
          RecCount = 0;
          __HAL_DMA_DISABLE(&hdma_uasrt1_rx);
        }
      }
      /* USER CODE END 3 */
    
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7637

    瀏覽量

    166483
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11044

    瀏覽量

    216076
  • STM32
    +關注

    關注

    2290

    文章

    11017

    瀏覽量

    362519
  • 串口通信
    +關注

    關注

    34

    文章

    1636

    瀏覽量

    56574
  • dma
    dma
    +關注

    關注

    3

    文章

    572

    瀏覽量

    102377
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32串口通信基礎知識點匯總,不看肯定后悔

    STM32串口通信基礎知識點匯總,不看肯定后悔
    發表于 12-03 08:03

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

    目錄DMA通信原理DMA的基本介紹DMA工作原理STM32DMA結構
    發表于 12-10 06:04

    STM32串口采用DMA方式發送數據測試

    (USART1~USART5),支持DMA方式通信DMA方式由于不需要CPU的參與,而是直接由DMA
    發表于 11-27 10:03 ?3662次閱讀

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

    目錄DMA通信原理DMA的基本介紹DMA工作原理STM32DMA結構
    發表于 11-26 19:21 ?13次下載
    <b class='flag-5'>DMA</b><b class='flag-5'>通信</b>編程與<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>中斷<b class='flag-5'>方式</b>

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

    CubeH7 1.9.0開發工具:MDK Keil 5.32二、原理過程在STM32上接9個串口,每個串口約收發50個字節數據每幀,若使用傳統的按字節中斷HAL_UART_Receive_IT()的
    發表于 12-02 21:06 ?42次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>串口</b>使用IDLE中斷+<b class='flag-5'>DMA</b>接收(HAL庫函數)

    STM32】使用DMA方式實現串口數據轉發

    焊死在板子上,沒辦法直接使用串口進行通訊,所以不得不使用串口轉發的方式,來進行模塊的連接。實現串口轉發的方式有很多,各有優劣。本文主要利用
    發表于 12-02 21:06 ?22次下載
    【<b class='flag-5'>STM32</b>】使用<b class='flag-5'>DMA</b><b class='flag-5'>方式</b>實現<b class='flag-5'>串口</b>數據轉發

    STM32中斷與串口DMA通信

    一管腳接一個LED,GPIOB端口一引腳接一個開關(用杜邦線模擬代替)。采用中斷模式編程,當開關接高電平時,LED亮燈;接低電平時,LED滅燈。2. 采用串口中斷方式重做上篇博客中的串口通信
    發表于 12-06 20:36 ?11次下載
    <b class='flag-5'>STM32</b>中斷與<b class='flag-5'>串口</b><b class='flag-5'>DMA</b><b class='flag-5'>通信</b>

    STM32串口DMA發送數據

    一、DMA簡介二、實驗流程了解了DMA之后,我們做一個實驗:STM32采用串口DMA方式,用11
    發表于 12-07 10:36 ?22次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>DMA</b>發送數據

    串口通信基礎知識詳解

    目錄通信基礎知識STM32串口通信基礎(UART)串口通信
    發表于 12-20 19:20 ?15次下載
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>基礎知識</b>詳解

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

    方法:一種是 :IDLE 接收空閑中斷+DMA一種是: IDLE 接收空閑中斷+RXNE接收數據中斷都可完成串口數據的收發知識點介紹:STM32 IDLE 接收空閑中斷功能:在使用..
    發表于 12-20 19:39 ?31次下載
    <b class='flag-5'>STM32</b> HAL CubeMX <b class='flag-5'>串口</b>IDLE接收空閑中斷+<b class='flag-5'>DMA</b>

    STM32中的串口通信基礎知識

    目錄串口通信基本原理并行通信與串行通信串行通信中單工,半雙工和全雙工的區別按通信
    發表于 12-24 18:37 ?4次下載
    <b class='flag-5'>STM32</b>中的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>的<b class='flag-5'>基礎知識</b>

    STM32 DMA串口接收不定長數據

    STM32 DMA串口接收不定長數據
    發表于 12-24 18:50 ?41次下載
    <b class='flag-5'>STM32</b>  <b class='flag-5'>DMA</b><b class='flag-5'>串口</b>接收不定長數據

    STM32采用串口DMA方式的USART串口通訊

    一.因為前面寫了STM32串口中斷之DMA通信,所以這個博客和上次的博客大同小異上次博客:STM32串口
    發表于 12-24 18:53 ?10次下載
    <b class='flag-5'>STM32</b>采用<b class='flag-5'>串口</b><b class='flag-5'>DMA</b><b class='flag-5'>方式</b>的USART<b class='flag-5'>串口</b>通訊

    STM32串口中斷之DMA通信

    一.DMA介紹DMA詳細介紹請轉博客:嵌入式:初次了解STM32的USART串口通訊(中斷方式)_LaiYiFei25的博客-CSDN博客
    發表于 12-24 19:08 ?12次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>中斷之<b class='flag-5'>DMA</b><b class='flag-5'>通信</b>

    STM32F103DMA串口通信

    本文在前兩篇USART串口通信的基礎上,使用DMA控制器來實現串口通信文章目錄一、DMA1.DMA
    發表于 12-28 19:15 ?12次下載
    <b class='flag-5'>STM32F103DMA</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>
    主站蜘蛛池模板: 国产99久9在线视频 国产99久久九九精品免费 | 丁香六月婷婷七月激情 | 色天天综合网色鬼综合 | 免费视频在线看 | 免费免费啪视频视频观看 | 91大神大战丝袜美女在线观看 | 色黄视频网站 | 天堂资源在线8 | 国产免费好大好硬视频 | 国内自拍 亚洲系列 欧美系列 | 日本写真高清视频免费网站网 | 国产精品成人aaaaa网站 | 亚洲色图在线视频 | 8天堂资源在线 | 精品综合久久久久久98 | 日本一区二区高清免费不卡 | 免费在线视频播放 | 九色亚洲 | 天堂网2018| 天天插综合网 | 亚洲精品九色在线网站 | 456影院第一| 三级黄色一级视频 | 亚洲最大成人 | 天天干天天操天天玩 | 九九热精品在线视频 | 亚洲黄色网址大全 | 日本黄大片在线观看 | 久久人精品 | 高h上错人1v1| 成人永久免费视频网站在线观看 | 婷婷狠狠 | 丁香花五月婷婷开心 | 噜噜色小说 | 91久久精品青青草原伊人 | 亚洲人毛茸茸bbxx | 国产小视频在线高清播放 | 四虎影院海外永久 | 美女网站在线观看视频18 | 你懂的网址免费国产 | 在线激情网 |