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

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

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

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

STM32CUBEMX(2)--USART通過DMA方式接收不定長數(shù)據(jù)

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2022-11-14 15:36 ? 次閱讀

概述

直接存儲器訪問(DMA)用于在外設(shè)與存儲器之間以及存儲器與存儲器之間提供高速數(shù)據(jù)傳輸。可以在無需任何CPU操作的情況下通過DMA快速傳輸傳輸。這樣節(jié)省的CPU資源可供其它操作使用。

DMA允許在后臺執(zhí)行數(shù)據(jù)傳輸,無需Cortex-MO處理器干預(yù)。在此操作過程中,主處理器可以執(zhí)行其它任務(wù),僅當(dāng)整個數(shù)據(jù)塊需要處理時,才會中斷主處理器。這樣即使傳輸大量數(shù)據(jù)也不會對系統(tǒng)性能造成太大影響。

DMA主要用于為不同的外設(shè)模塊實現(xiàn)集中數(shù)據(jù)緩沖存儲(通常在系統(tǒng)SRAM中)。與分布式解決方案(其中每個外設(shè)都需要實現(xiàn)自己的本地數(shù)據(jù)存儲)相比,DMA解決方案在硅片成本和功耗方面的成本較低。

根據(jù)使用的產(chǎn)品型號的不同,有一個或兩個DMA模塊。

STM32F0XX DMA控制器總共有5個通道用于DMA1,每個通道都專門管理來自一個或多個外設(shè)的存儲器訪問請求。它具有一個仲裁器,用于處理不同的DMA請求的優(yōu)先級。

本篇文章主要介紹如何使用STM32CubeMX實現(xiàn)串口DMA讀取,并且打印出去。

在這里插入圖片描述

在這里插入圖片描述

硬件準(zhǔn)備

首先需要準(zhǔn)備一個開發(fā)板,這里我準(zhǔn)備的是NUCLEO-F030R8的開發(fā)板:在這里插入圖片描述

在這里插入圖片描述

選擇芯片型號

使用STM32CUBEMX選擇芯片stm32f030r8,如下所示:

在這里插入圖片描述

在這里插入圖片描述

配置時鐘

HSE與LSE分別為外部高速時鐘和低速時鐘,在本文中使用內(nèi)置的時鐘源,故都選擇Disable選項,如下所示:

在這里插入圖片描述

在這里插入圖片描述

配置時鐘樹

STM32F0的最高主頻到48M,所以配置48即可:

在這里插入圖片描述

在這里插入圖片描述

串口配置

本次實驗使用的串口1進行串口通信,波特率配置為115200。

在這里插入圖片描述

配置DMA

在這里插入圖片描述

中斷

在這里插入圖片描述

在這里插入圖片描述

生成工程設(shè)置

在這里插入圖片描述

在這里插入圖片描述

代碼生成設(shè)置

最后設(shè)置生成獨立的初始化文件:

在這里插入圖片描述

在這里插入圖片描述

生成代碼

在這里插入圖片描述

在這里插入圖片描述

配置keil

在這里插入圖片描述

在這里插入圖片描述

代碼

在main.c中,添加頭文件,若不添加會出現(xiàn) identifier "FILE" is undefined報錯。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

變量定義:

/* USER CODE BEGIN PV */
#define BUFFERSIZE 255           //可以接收的最大字符個數(shù)       
uint8_t ReceiveBuff[BUFFERSIZE]; //接收緩沖區(qū)
uint8_t recv_end_flag = 0,Rx_len;//接收完成中斷標(biāo)志,接收到字符長度
/* USER CODE END PV */

函數(shù)聲明和串口重定向:

/* USER CODE BEGIN PFP */
void uart1_data(void);                    //接收函數(shù)
#ifdef __GNUC__                                    //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END PFP */

開啟串口IDLE中斷:

/* USER CODE BEGIN 2 */
    printf("串口1DMA例程
");
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口1 IDLE中斷 
  /* USER CODE END 2 */

主循環(huán):

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
        uart1_data();//串口數(shù)據(jù)處理
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

串口DMA獲取:

/* USER CODE BEGIN 4 */
void uart1_data(void)
{
    if(recv_end_flag ==1)//接收完成標(biāo)志
    {
        printf("數(shù)據(jù)長度=%d
",Rx_len);//打印接收到的數(shù)據(jù)長度 
        printf("數(shù)據(jù)內(nèi)容:");
        for(int i=0;iprintf("%c",ReceiveBuff[i]);//向串口打印接收到的數(shù)據(jù)
            }
    printf("
");          
    for(int i = 0; i < Rx_len ; i++) //清空接收緩存區(qū)
    ReceiveBuff[i]=0;//置0
    Rx_len=0;//接收數(shù)據(jù)長度清零
    recv_end_flag=0;//接收標(biāo)志位清零
    }
    //開啟下一次接收
    HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
/* USER CODE END 4 */

#include "stm32f0xx_it.c"文件中斷外部變量引用:

/* USER CODE BEGIN 0 */
#define BUFFERSIZE 255    //可接收的最大數(shù)據(jù)量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END 0 */

串口1中斷函數(shù):

/**
  * @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 */
    uint32_t temp;
    if(USART1 == huart1.Instance)//判斷是否為串口1中斷

    {      
        if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//如果為串口1
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除中斷標(biāo)志
      HAL_UART_DMAStop(&huart1);//停止DMA接收
             temp  = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//獲取DMA當(dāng)前還有多少未填充
              Rx_len =  BUFFERSIZE - temp; //計算串口接收到的數(shù)據(jù)個數(shù)
              recv_end_flag = 1;
         }
        }    
  /* USER CODE END USART1_IRQn 1 */
}

演示效果

在這里插入圖片描述

在這里插入圖片描述

審核編輯:湯梓紅

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

    關(guān)注

    114

    文章

    16838

    瀏覽量

    182279
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    569

    瀏覽量

    102058
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    198

    瀏覽量

    31509
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    286

    瀏覽量

    15862
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用DMA進行USART不定長接收

    在上一講中,我們對USART進行了簡單介紹,并講解了如何在不使用DMA的情況下進行不定長度數(shù)據(jù)接收,本講將著重講解如何使用DMA進行
    的頭像 發(fā)表于 02-18 17:01 ?696次閱讀
    如何使用<b class='flag-5'>DMA</b>進行<b class='flag-5'>USART</b><b class='flag-5'>不定長</b>度<b class='flag-5'>接收</b>

    STM32CUBEMX(2)--USART通過DMA方式接收不定長數(shù)據(jù)

    。 本篇文章主要介紹如何使用STM32CubeMX實現(xiàn)串口DMA讀取,并且打印出去。QQ群:615061293。 硬件準(zhǔn)備 首先需要準(zhǔn)備一個開發(fā)板,這里我準(zhǔn)備的是NUCLEO-F030R8的開發(fā)板
    發(fā)表于 09-04 11:48

    STM32 HAL庫中串口空閑中斷+DMA 實現(xiàn)串口數(shù)據(jù)不定長接收 精選資料分享

    for STM32F0 Series)本文內(nèi)容:不定長數(shù)據(jù)接收的原理串口接收中斷的配置串口接收
    發(fā)表于 08-16 08:02

    STM32CubeMX串口+DMA接收不定長數(shù)據(jù)的函數(shù)分享

    STM32CubeMX串口+DMA接收不定長數(shù)據(jù)的函數(shù)分享
    發(fā)表于 12-07 07:23

    利用STM32單片機的IDLE空閑中斷接收不定長數(shù)據(jù)

    定長數(shù)據(jù),無法穩(wěn)定接收不定長數(shù)據(jù),本章介紹利用STM32單片機的IDLE空閑中斷,
    發(fā)表于 12-13 06:46

    STM32CUBEMX(2)--USART通過DMA方式接收不定長數(shù)據(jù)

    STM32CUBEME--2USART通過DMA方式接收不定長
    發(fā)表于 12-01 15:06 ?0次下載
    <b class='flag-5'>STM32CUBEMX</b>(<b class='flag-5'>2</b>)--<b class='flag-5'>USART</b><b class='flag-5'>通過</b><b class='flag-5'>DMA</b><b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32F072使用DMA+IDLE進行串口接收不定長數(shù)據(jù)有問題,改為DMA+RTO接收正常。

    把調(diào)試STM32F072串口過程中,出現(xiàn)了一小點問題,記錄下來,F(xiàn)0的串口寄存器有些增加的功能以前沒用到,F(xiàn)0增加了modbus協(xié)議之類的接收超時處理,完美實現(xiàn)了不定長數(shù)據(jù)包的幀
    發(fā)表于 12-03 09:21 ?11次下載
    <b class='flag-5'>STM32</b>F072使用<b class='flag-5'>DMA</b>+IDLE進行串口<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>有問題,改為<b class='flag-5'>DMA</b>+RTO<b class='flag-5'>接收</b>正常。

    STM32 HAL庫中串口空閑中斷+DMA 實現(xiàn)串口數(shù)據(jù)不定長接收

    Package for STM32F0 Series)本文內(nèi)容:不定長數(shù)據(jù)接收的原理串口接收中斷的配置串口
    發(fā)表于 12-06 18:36 ?26次下載
    <b class='flag-5'>STM32</b> HAL庫中串口空閑中斷+<b class='flag-5'>DMA</b> 實現(xiàn)串口<b class='flag-5'>數(shù)據(jù)</b>的<b class='flag-5'>不定長</b><b class='flag-5'>接收</b>

    STM32CubeMX HAL庫串口+DMA+IDLE空閑中斷不定長度數(shù)據(jù)接收和發(fā)送

    Cube_FW_F1_V1.8.0(STM32Cube MCU Package for STM32F1xx Series)本文內(nèi)容:不定長數(shù)據(jù)接收
    發(fā)表于 12-07 11:36 ?25次下載
    <b class='flag-5'>STM32CubeMX</b> HAL庫串口+<b class='flag-5'>DMA</b>+IDLE空閑中斷<b class='flag-5'>不定長度數(shù)據(jù)</b><b class='flag-5'>接收</b>和發(fā)送

    stm32 串口接收不定長度數(shù)據(jù)及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實現(xiàn)接收不定長度數(shù)據(jù)的呢? 串口接收數(shù)據(jù)一般會采用串口中斷方式自動
    發(fā)表于 12-23 19:09 ?27次下載
    <b class='flag-5'>stm32</b> 串口<b class='flag-5'>接收</b><b class='flag-5'>不定長度數(shù)據(jù)</b>及黏包處理 + 串口<b class='flag-5'>DMA</b><b class='flag-5'>接收</b>

    STM32 DMA串口接收不定長數(shù)據(jù)

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

    STM32之串口DMA接收不定長數(shù)據(jù)

    目錄STM32之串口DMA接收不定長數(shù)據(jù)引言DMA簡介什么是
    發(fā)表于 12-24 19:03 ?30次下載
    <b class='flag-5'>STM32</b>之串口<b class='flag-5'>DMA</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32F429 標(biāo)準(zhǔn)庫 串口完成中斷+DMA 接收不定長數(shù)據(jù)

    之前寫過STM32F103的串口+DMA不定長數(shù)據(jù)接收驅(qū)動,近期在設(shè)計STM32F429系列單片
    發(fā)表于 12-24 19:03 ?21次下載
    <b class='flag-5'>STM32</b>F429 標(biāo)準(zhǔn)庫  串口完成中斷+<b class='flag-5'>DMA</b>  <b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數(shù)據(jù)

    本文利用中斷實現(xiàn)串口不定長接收(非DMA),使用HAL庫,將接收數(shù)據(jù)打印出去。
    的頭像 發(fā)表于 11-14 16:31 ?1649次閱讀
    <b class='flag-5'>STM32CUBEMX</b>(8)--<b class='flag-5'>USART</b><b class='flag-5'>通過</b>定時器中斷<b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32CubeMX之串口接收不定長數(shù)據(jù)

    基本串口通信通常只能接收定長數(shù)據(jù),無法穩(wěn)定接收不定長數(shù)據(jù),本章介紹利用
    的頭像 發(fā)表于 05-11 09:59 ?3896次閱讀
    <b class='flag-5'>STM32CubeMX</b>之串口<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數(shù)據(jù)</b>
    主站蜘蛛池模板: 入逼视频 | 亚洲三级黄色 | 一级片在线观看免费 | 22sihu国产精品视频影视资讯 | 黄色的网站在线观看 | 亚洲欧美色视频 | 5g国产精品影院天天5g天天爽 | 亚洲一区 在线播放 | 天堂网www天堂在线资源链接 | 黄色片啪啪 | 开心色99×xxxx | 四虎美女 | 香蕉色网 | 天堂中文字幕在线观看 | 免费人成在线观看网站品爱网日本 | 午夜免费啪视频观看网站 | 456成人网| 色婷婷综合久久久 | 手机看片国产免费久久网 | 成人久久久精品乱码一区二区三区 | aaa视频| 国产三级播放 | 美女免费毛片 | 天天干天天舔天天射 | 丁香六月婷婷综合 | 巨尻在线观看 | 伊人久久大香线蕉影院95 | 色妞在线 | 丁香啪啪天堂激情婷婷 | 黄网站视频 | 日本三级黄 | 一级特黄aaa免费 | h视频在线观看免费网站 | 国模于子涵啪啪大胆 | 香蕉视频久久久 | 99色综合| 亚洲色图综合在线 | 一级毛片一级毛片一级级毛片 | 极品国产一区二区三区 | 欧美午夜网 | 神马午夜在线观看 |