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

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

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

STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,雙串口通過(guò)DMA方式接收不定長(zhǎng)數(shù)據(jù)

嵌入式單片機(jī)MCU開(kāi)發(fā) ? 來(lái)源:嵌入式單片機(jī)MCU開(kāi)發(fā) ? 作者:嵌入式單片機(jī)MCU開(kāi) ? 2022-11-14 16:20 ? 次閱讀

概述

本篇文章主要介紹如何使用STM32CubeMX移植到雅特力AT32F403AVGT7,并通過(guò)雙串口輸出打印。

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

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

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

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

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

在這里插入圖片描述

硬件準(zhǔn)備

首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是雅特力AT32F403AVGT7的開(kāi)發(fā)板:

在這里插入圖片描述

選擇芯片型號(hào)

雅特力AT32F403AVGT7兼容STM32F103系列,故選取STM32f103VG進(jìn)行開(kāi)發(fā)。

在這里插入圖片描述

配置時(shí)鐘

HSE與LSE分別為外部高速時(shí)鐘和低速時(shí)鐘,在本文中使用內(nèi)置的時(shí)鐘源,故都選擇Disable選項(xiàng),如下所示:在這里插入圖片描述

配置時(shí)鐘樹(shù)

雅特力AT32F403AVGT7最高頻率到240M,但是STM32F1的最高主頻到72M,同時(shí)使用不使用外部晶振時(shí)候,最高速度只能到64M,所以配置64即可:

在這里插入圖片描述

串口配置

本次實(shí)驗(yàn)使用的串口2,串口3進(jìn)行串口通信,波特率配置為115200。

在這里插入圖片描述

在這里插入圖片描述

配置DMA

在DMA 設(shè)置中,Mode有兩種模式,一種是普通模式(Normal),使用一次發(fā)送語(yǔ)句就發(fā)一次,另一種是循環(huán)模式(Circula),使用一次發(fā)送會(huì)一直發(fā)送。這里接收選擇循環(huán)模式。

在這里插入圖片描述

在這里插入圖片描述

中斷

在中斷設(shè)置里打開(kāi)串口2,3的中斷。

在這里插入圖片描述

生成工程設(shè)置

注意在生產(chǎn)工程設(shè)置中不能出現(xiàn)中文,不然會(huì)報(bào)錯(cuò)。

在這里插入圖片描述

代碼生成設(shè)置

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

在這里插入圖片描述

生成代碼

在這里插入圖片描述

代碼編寫

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

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

變量定義 ,在main.c中添加。

/* USER CODE BEGIN PV */
#define BUFFERSIZE_usart2 1000           //可以接收的最大字符個(gè)數(shù)       
uint8_t ReceiveBuff_usart2[BUFFERSIZE_usart2]; //接收緩沖區(qū)
uint8_t recv_end_flag_usart2 = 0,Rx_len_usart2;//接收完成中斷標(biāo)志,接收到字符長(zhǎng)度

#define BUFFERSIZE_usart3 1000           //可以接收的最大字符個(gè)數(shù)       
uint8_t ReceiveBuff_usart3[BUFFERSIZE_usart3]; //接收緩沖區(qū)
uint8_t recv_end_flag_usart3 = 0,Rx_len_usart3;//接收完成中斷標(biāo)志,接收到字符長(zhǎng)度
int f1_u1 = 0;
/* USER CODE END PV */

函數(shù)聲明和串口重定向,這里使用串口3進(jìn)行打印,在main.c中添加。

/* USER CODE BEGIN PFP */
void uart2_data(void);                    //接收函數(shù)
void uart3_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(&huart3 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END PFP */

開(kāi)啟串口IDLE中斷,在main.c中添加。

/* USER CODE BEGIN 2 */
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//使能串口2 IDLE中斷 
    __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//使能串口2 IDLE中斷 
        printf("雙串口DMA接收例程
");
  /* USER CODE END 2 *

串口DMA獲取,在main.c中添加。

void uart2_data(void)
{
    if(recv_end_flag_usart2 ==1)//接收完成標(biāo)志
    {
        printf("串口2數(shù)據(jù)長(zhǎng)度=%d
",Rx_len_usart2);//打印接收到的數(shù)據(jù)長(zhǎng)度 
        printf("串口2數(shù)據(jù)內(nèi)容:");
        for(int i=0;iprintf("%c",ReceiveBuff_usart2[i]);//向串口打印接收到的數(shù)據(jù)
            }
    printf("
");          
    for(int i = 0; i < Rx_len_usart2 ; i++) //清空接收緩存區(qū)
    ReceiveBuff_usart2[i]=0;//置0
    Rx_len_usart2=0;//接收數(shù)據(jù)長(zhǎng)度清零
    recv_end_flag_usart2=0;//接收標(biāo)志位清零
    }
                //開(kāi)啟下一次接收
    HAL_UART_Receive_DMA(&huart2,(uint8_t*)ReceiveBuff_usart2,BUFFERSIZE_usart2);
}
void uart3_data(void)
{
    if(recv_end_flag_usart3 ==1)//接收完成標(biāo)志
    {
        printf("串口3數(shù)據(jù)長(zhǎng)度=%d
",Rx_len_usart3);//打印接收到的數(shù)據(jù)長(zhǎng)度 
        printf("串口3數(shù)據(jù)內(nèi)容:");
        for(int i=0;iprintf("%c",ReceiveBuff_usart3[i]);//向串口打印接收到的數(shù)據(jù)
            }
    printf("
");          
    for(int i = 0; i < Rx_len_usart3 ; i++) //清空接收緩存區(qū)
    ReceiveBuff_usart3[i]=0;//置0
    Rx_len_usart3=0;//接收數(shù)據(jù)長(zhǎng)度清零
    recv_end_flag_usart3=0;//接收標(biāo)志位清零
    }
                //開(kāi)啟下一次接收
    HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff_usart3,BUFFERSIZE_usart3);
}

主循環(huán),在main.c中添加。

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
        uart2_data();
        uart3_data();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 *

中斷外部變量引用,在stm32f0xx_it.c中添加。

/* USER CODE BEGIN 0 */
#define BUFFERSIZE_usart2 255    //可接收的最大數(shù)據(jù)量
extern uint8_t recv_end_flag_usart2,Rx_len_usart2;


#define BUFFERSIZE_usart3 255    //可接收的最大數(shù)據(jù)量
extern uint8_t recv_end_flag_usart3,Rx_len_usart3;
/* USER CODE END 0 */

串口2,3中斷函數(shù),在stm32f0xx_it.c中添加。

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
        uint32_t temp_usart2;
    if(USART2 == huart2.Instance)//判斷是否為串口2中斷

    {      
        if(RESET != __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))//如果為串口2
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除中斷標(biāo)志
      HAL_UART_DMAStop(&huart2);//停止DMA接收
             temp_usart2  = __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);//獲取DMA當(dāng)前還有多少未填充
              Rx_len_usart2 =  BUFFERSIZE_usart2 - temp_usart2; //計(jì)算串口接收到的數(shù)據(jù)個(gè)數(shù)
              recv_end_flag_usart2 = 1;
         }
        }
  /* USER CODE END USART2_IRQn 1 */
}

/**
  * @brief This function handles USART3 global interrupt.
  */
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
    uint32_t temp_usart3;
    if(USART3 == huart3.Instance)//判斷是否為串口3中斷

    {      
        if(RESET != __HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))//如果為串口3
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中斷標(biāo)志
      HAL_UART_DMAStop(&huart3);//停止DMA接收
             temp_usart3  = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//獲取DMA當(dāng)前還有多少未填充
              Rx_len_usart3 =  BUFFERSIZE_usart3 - temp_usart3; //計(jì)算串口接收到的數(shù)據(jù)個(gè)數(shù)
              recv_end_flag_usart3 = 1;
         }
        }
  /* USER CODE END USART3_IRQn 1 */
}

結(jié)果演示

開(kāi)機(jī)會(huì)顯示雙串口DMA接收例程。

串口2發(fā)送數(shù)據(jù)會(huì)在串口3中打印,但是會(huì)顯示接收的是串口2。

串口3發(fā)送數(shù)據(jù)會(huì)在串口3中打印,但是會(huì)顯示接收的是串口3。

在這里插入圖片描述

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    561

    瀏覽量

    100583
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    283

    瀏覽量

    14807
  • 雅特力
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    8018
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEMX(6)--移植AT32F403AVGT7,串口通過(guò)DMA方式接收不定長(zhǎng)數(shù)據(jù)

    概述 本篇文章主要介紹如何使用STM32CubeMX移植AT32F403AVGT7,并
    發(fā)表于 09-06 16:37

    STM32CUBEMX(7)--移植AT32F403AVGT(兼容STM32F103VGT6),DAC輸出電壓

    概述 本篇文章主要介紹如何使用STM32CubeMX移植AT32F403AVGT7,并
    發(fā)表于 09-06 16:40

    STM32CUBEMX移植

    STM32CUBEMX移植AT32F403AVGT7[兼容
    發(fā)表于 07-23 09:21

    如何使用STM32CubeMX移植AT32F403AVGT7

    如何使用STM32CubeMX移植AT32F403AVGT7,并
    發(fā)表于 08-05 07:01

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

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

    如何使用STM32CubeMX移植AT32F403AVGT7

    如何使用STM32CubeMX移植AT32F403AVGT7呢?并通過(guò)串口輸出打???
    發(fā)表于 10-25 08:36

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

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

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

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

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

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

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

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

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

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

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

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

    STM32CUBEMX(7)--移植AT32F403AVGT(兼容STM32F103VGT6),DAC輸出電壓

    本篇文章主要介紹如何使用STM32CubeMX移植AT32F403AVGT7,并
    的頭像 發(fā)表于 11-14 16:23 ?2778次閱讀
    <b class='flag-5'>STM32CUBEMX</b>(<b class='flag-5'>7</b>)--<b class='flag-5'>移植</b><b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32<b class='flag-5'>F403AVGT</b>(兼容<b class='flag-5'>STM32F103VGT6</b>),DAC輸出電壓

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

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

    STM32CubeMX串口接收不定長(zhǎng)數(shù)據(jù)

    基本串口通信通常只能接收定長(zhǎng)數(shù)據(jù),無(wú)法穩(wěn)定接收不定長(zhǎng)數(shù)據(jù)
    的頭像 發(fā)表于 05-11 09:59 ?3395次閱讀
    <b class='flag-5'>STM32CubeMX</b>之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>