STM32开发(8)----CubeMX配置串口通讯(中断方式和DMA方式)

本文介绍了如何使用STM32CubeMX配置STM32F103C6T6的串口通讯,包括中断和DMA两种方式。在中断方式中,详细阐述了CubeMX的配置步骤,代码实现涉及重定向printf到串口,并展示了实验结果。在DMA方式下,配置了DMA参数,并在main函数中使用HAL_UART_Transmit_DMA发送数据。实验结果显示两种方式均成功实现了串口通信。
摘要由CSDN通过智能技术生成


前言

本章继续介绍使用STM32CubeMX对串口进行配置的方法,串口通讯有三种方式:轮询,中断和DMA,上一章节实现了重载printf功能和串口轮询接收功能,本章介绍中断和DMA方式,上一章节已经对串口进行了介绍,附有连接和烧录等过程,因此本章仅仅介绍CubeMX配置的方法,代码实现和实验结果。

一、中断方式

1.CubeMX配置

选择芯片stm32f103c6t6,新建工程

在这里插入图片描述

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

在这里插入图片描述

配置时钟树,这里使用官方推荐的配置

在这里插入图片描述

stm32f103c6t6中有2个USART口,全都支持DMA方式,其中一个通讯速率可以达到4.5Mb/s,另个一通讯速录可达2.25Mb/s,都具有CTS和RTS信号引脚。
在这里插入图片描述配置引脚功能,从datasheet中可以PA8-PA11可以USART1的复用引脚,因为我们这里使用异步模式,所以仅仅需要TX和RX两个引脚(即PA9,PA10),这样就可以在PA9管脚得到PWM输出。datasheet截图如下:在这里插入图片描述
前面设置HSE时钟为72MHz;USART1的时钟挂载在APB2上
在这里插入图片描述![
CubeMX配置如下:
在这里插入图片描述
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
在这里插入图片描述

使能USART1中断
在这里插入图片描述

SYS选项卡中Debug选项选择串口(这个选项可以设置,不会有影响)
在这里插入图片描述

Code Generator中设置只拷贝使用到的库,分离.c和.h文件

在这里插入图片描述

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

在这里插入图片描述

2.代码实现

C语言中的标准库中所用的标准输入输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

main函数如下

/* USER CODE BEGIN 0 */
uint8_t aTxStartMessage[] = "\r\n****Interupt Serical communication ****\r\n";
 

uint8_t aRxBuffer[20];
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Transmit_IT(&huart1, (uint8_t *)aTxStartMessage, sizeof(aTxStartMessage));
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
		HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

为了串口回显,这里重载回调函数HAL_UART_RxCpltCallback,该函数会在接收数据之后调用

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UART_RxCpltCallback can be implemented in the user file
   */
    HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);
}
/* USER CODE END 4 */

3.实验结果

在这里插入图片描述

二、DMA方式

1.CubeMX配置

在这里插入图片描述
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
在这里插入图片描述

使能USART1中断,串口使用DMA方式必须开启中断,否则程序发送一次数据后,不能判断DMA传输是否完成,串口会一直处于busy状态。
在这里插入图片描述
DMA参数配置,发送选择 DMA1 Stream 4通道,方向从存储器到外设,优先级为低。接收选择 DMA1 Stream 5通道,方向从外设到存储器。mode设置可以选择Normal表单次传输,传输一次后终止传输,Circular表示循环传输,传输完成后又重新开始继续传输,不断循环永不停止。此处选择单次传输,Mode为Normal。Data Width:串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择Byte。
在这里插入图片描述

2.代码实现

main函数如下,每秒串口打印一次:

/* USER CODE BEGIN 0 */
uint8_t aTxMessage[] = "\r\n****DMA Serial  communication***\r\n";
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage));

    	HAL_Delay(1000);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3.实验结果

在这里插入图片描述

总结

本章承接上一章对串口传输方式的配置,介绍使用STM32CubeMX配置串口中断和DMA两种传输方式方式,这里没有介绍中断和DMA的原理,接下来几章介绍中断原理和DMA原理。

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LinfineEdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值