0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32CUBEMX开发GD32F303(9)----USART通过DMA收发

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2022-11-29 11:15 次阅读

概述

本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。 本章主要配置串口进行DMA收发。 需要GD样片的可以加Q_QUN申请:6_15061293。

查阅手册可以得知,PA9、PA10为串口0的输出和输入口。

在这里插入图片描述

样品申请

https://www.wjx.top/vm/mB2IKus.aspx

硬件准备

这里准备了GD32303C_START开发板进行验证。

在这里插入图片描述

STM32CUBEMX配置

在这里插入图片描述

勾选中断。

在这里插入图片描述

开启DMA读取和接收。 其中Word = 32bit,Half word = 16bit,Byte = 8bit

在这里插入图片描述

在这里插入图片描述

keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。

在这里插入图片描述

串口重定向

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

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

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
#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 */

串口接收发送函数

一般情况下,串口接收发送函数有如下所示。

● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。

● HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。

● HAL_UART_Transmit_IT();串口中断模式发送

● HAL_UART_Receive_IT();串口中断模式接收

● HAL_UART_Transmit_DMA();串口DMA模式发送

● HAL_UART_Receive_DMA();串口DMA模式接收

HAL_UART_Transmit_DMA()发送

测试代码如下。 定义需要发送的数据。

/* USER CODE BEGIN PV */
uint8_t TxData[] = "

**** Hello,World!' ***

";
/* USER CODE END PV */

HAL_UART_Transmit_DMA()发送代码。

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      HAL_UART_Transmit_DMA(&huart1, (uint8_t *)TxData, sizeof(TxData)-1);
         HAL_Delay(1000);
  }
  /* USER CODE END 3 */

DMA有normal和circular两种模式。 Normal表单次传输,传输一次后终止传输,所以需要传输几次就需要开启几次,Circular表示循环传输,传输完成后又重新开始继续传输,开启一次后会一直传输。 normal传输打印如下所示,传输完成就关闭。

在这里插入图片描述

circular传输打印如下所示,一直传输,不会停止。

在这里插入图片描述

HAL_UART_Receive_DMA()发送

测试代码如下。 定义需要接受存放数组。

/* USER CODE BEGIN PV */
uint8_t RxData[255];
/* USER CODE END PV */

开启HAL_UART_Receive_DMA()接受代码。

/* USER CODE BEGIN 2 */
  HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据
  /* USER CODE END 2 */

重写读取回调函数,将接受的数据发送出去在开启接收。

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

    HAL_UART_Transmit(&huart1, (uint8_t *)"text:", 5,0xffff);//轮询发送,不然可能发送不出去
    HAL_UART_Transmit_DMA(&huart1, (uint8_t *)RxData, 10);//发送接受的数据
    HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据
}

/* USER CODE END 4 */

DMA有normal和circular两种模式。 Normal表单次接收,接收一次后终止接收,所以需要接收几次就需要开启几次,Circular表示循环接收,接收完成后又重新头开始继续接收,开启一次后会一直接收。 normal传输打印如下所示,传输完成就关闭。 演示效果如下所示。

在这里插入图片描述

circular接收打印如下所示,当发送数据大于接收长度时候,会进行循环接收。

在这里插入图片描述

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348735
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99018
  • USART
    +关注

    关注

    1

    文章

    186

    浏览量

    30407
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
  • gd32f303
    +关注

    关注

    4

    文章

    37

    浏览量

    3593
收藏 人收藏

    评论

    相关推荐

    STM32CUBEMX开发GD32F303(6)----GPIO输入函数说明

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD
    的头像 发表于 11-25 16:06 1173次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(6)----GPIO输入函数说明

    STM32CUBEMX开发GD32F303(8)----USART收发配置

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD
    的头像 发表于 11-29 10:40 2489次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(8)----<b class='flag-5'>USART</b><b class='flag-5'>收发</b>配置

    STM32CUBEMX开发GD32F303(1)----前期准备与烧录

    概述 在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。 芯片申请 芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面
    的头像 发表于 11-22 17:08 2446次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(1)----前期准备与烧录

    STM32CUBEMX开发GD32F303(3)----点亮LED

    STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过J-LINK烧录GD32303C_START和
    的头像 发表于 11-23 11:43 2047次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(3)----点亮LED

    STM32CUBEMX开发GD32F303(4)----GPIO输出模式,速率测试、开漏和输出说明

    STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START
    的头像 发表于 11-25 11:49 1387次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(4)----GPIO输出模式,速率测试、开漏和输出说明

    GD32F303固件库开发(5)----GPIO输出模式,速率测试、开漏和输出说明

    STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START
    的头像 发表于 11-25 15:32 2550次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>(5)----GPIO输出模式,速率测试、开漏和输出说明

    STM32CUBEMX开发GD32F303(7)----配置printf

    概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD
    的头像 发表于 11-28 11:06 1865次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(7)----配置printf

    STM32CUBEMX开发GD32F303(10)----双ADC轮询模式扫描多个通道

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD
    的头像 发表于 11-29 17:38 1264次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(10)----双ADC轮询模式扫描多个通道

    STM32CUBEMX开发GD32F303(11)----ADC在DMA模式下扫描多个通道

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD
    的头像 发表于 11-30 10:59 1550次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(11)----ADC在<b class='flag-5'>DMA</b>模式下扫描多个通道

    STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发
    的头像 发表于 11-30 14:40 3044次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(12)----输出PWM及修改PWM频率与占空比

    STM32CUBEMX开发GD32F303(13)----定时器TIM捕获PWM测量频率与占空比

    概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发
    的头像 发表于 12-07 10:15 2788次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(13)----定时器TIM捕获PWM测量频率与占空比

    STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发
    的头像 发表于 07-26 13:52 1361次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    STM32CUBEMX开发GD32F303(15)----外部中断EXTI

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发
    的头像 发表于 07-26 15:53 828次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(15)----外部中断EXTI

    STM32CUBEMX开发GD32F303

    在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。
    的头像 发表于 07-27 09:32 955次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>

    STM32CUBEMX开发GD32F303(17)----内部Flash读写

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发
    的头像 发表于 07-27 09:35 1173次阅读
    <b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(17)----内部Flash读写