STM32CubeMx实现串口通信(详细教程)

STM32CubeMx实现串口通信

使用CubeMx来实现USART的阻塞式接受和发送,中断式接受和发送,中断+DMA接受和发送。

一、环境

硬件:STM32F103C8T6核心板
软件:STM32CubeMx
软件:Keil5 MDK

二、使用STM32CubeMx

1、选择芯片型号


我使用的是STM32F103C8T6的芯片,大家可以选择自己需要的芯片类型。

2、配置SYS


点击System Core下拉栏的SYS,选择Debug调试,我选择的是serial wire。

3、配置RCC

在这里插入图片描述
配置RCC时钟,点击HSE,选择Crystal/Ceramic Resonator。
在这里插入图片描述
进行系统的具体时钟配置,点击Clock Configuration选择栏,将时钟配置如图显示。

4、启动USART1

在这里插入图片描述
点击Connectivity,选择USART1,配置成Asynchronous。

5、项目名称和配置

在这里插入图片描述
点击Project Name,选择project,填写项目的名称。
在这里插入图片描述
在Code Generator 点击生成独立的C、H文件,然后点击生成文件。
在这里插入图片描述
打开生成的工程,编译一下,查看是否有错。

三、USART

1、阻塞式发送

使用HAL_UART_Transmit()函数发送
在这里插入图片描述
点击main.c文件,在主函数里面,添加两行代码:

HAL_UART_Transmit(&huart1,(uint8_t*)"Hello World",11,0xFFFF);
HAL_Delay(500);

代码编译成功之后,点击烧入单片机,(我使用的是最新的KEI软件,有个BUG就是,烧入代码之后需要按下复位键,代码才会执行,可以在魔术棒那里,点击Debug,点击Pack,取消ENABLE)。

打开串口调试助手,连接串口,查看信息
·
可以看到串口助手,每500ms打印一次Hello World。

2、Printf 串口打印

通过对printf重定向,使用printf 可以用来串口打印数据。
在这里插入图片描述
在主函数里面,添加头文件 stdio.h,在对printf 进行重定向,在后面增加函数:

int fputc(int c,FILE *f)
{
    uint8_t ch[1]={c};
    HAL_UART_Transmit(&huart1,ch,1,0xFFFF);
    return c;
}

在这里插入图片描述
在while函数 注释之前写的,添加:

printf("Hello World\r\n");
HAL_Delay(500);

使用MicroLIB,需要勾选。
在这里插入图片描述
添加函数后,点开魔术棒,勾选Use MicroLIB,然后编译代码,零个错误,下载成功之后。就打开串口查看结果。

倘如出现以下问题
在这里插入图片描述
出现这个问题就打开以下文件
在这里插入图片描述
在这里插入图片描述
将60行和289行注释一下,编译以下,在取消注释,编译一下,就解决问题了,这个应该是MDK的BUG吧
在这里插入图片描述
串口调试结果。

3、阻塞式接收

使用HAL_UART_Receive()函数接收。
在这里插入图片描述
在主函数定义一个接收缓存的Buf,在while调用HAL_UART_Receive函数,接收串口发来的数据,为了验证是否接收,我们在后面调用HAL_UART_Transmit函数,将接收的数据打印在串口里面。

HAL_UART_Receive(&huart1,Buf,5,0xFFFF);
HAL_UART_Transmit(&huart1,Buf,5,0xFFFF);
HAL_Delay(500);

在这里插入图片描述在串口助手,发送区输入 Hello,点击发送,可以看到接收区会显示Hello,证明接收成功,多点击几次发送Hello,查看接收数据有误丢失。

4、中断式发送和接收

阻塞的发送,太浪费CPU了,中断式发送使用HAL_UART_Transmit_IT()函数。
首先打开我们项目的CubeMX
在这里插入图片描述
点击NVIC,我们点击USART1,将中断打开,然后生产代码。
在这里插入图片描述
打开STM32F1xx.it.c文件,找到USART1_IRQHandler(void),在里面添加代码:

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
 {
      uint8_t ch;
      ch=READ_REG(huart1.Instance->DR);
      
      WRITE_REG(huart1.Instance->DR,ch);
 }

在这里插入图片描述
在串口初始化里面添加启动中断代码:

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

编译成功后,点击烧入,就可以打开串口调试助手了。
在这里插入图片描述在发送区里面我相继发送了Hello 、Hello World、Hello World Hello World Hello World、在接受区可以查看结果,采用的不定长发送,无论发送多少数据,都可以接收。

5、中断+DMA发送和接收

首先打开CubeMx,在USART1添加DMA
在这里插入图片描述
点击USART1,打开DMA设置,点击add,添加USAER1_RX,USART1_TX.再点击生成代码。
在这里插入图片描述
在这里插入图片描述
在main.定义一个接受100的数组,大家需要发送更大的数量,可以自行更改,在main.h声明外部可调用。
在这里插入图片描述
在usart.c文件里面的USART1初始化中,我们需要先打开接受DMA,在启动空闲中断,添加代码:

  HAL_UART_Receive_DMA(&huart1,DMA_Buf,100);
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

在这里插入图片描述
在STMF1xx.it.c文件中,找到USART1串口中断,添加代码:

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    uint8_t len=100-__HAL_DMA_GET_COUNTER(huart1.hdmarx);
    HAL_UART_Transmit_DMA(&huart1,DMA_Buf,len);
    HAL_UART_Receive_DMA(&huart1,DMA_Buf,100);
}

进入中断后,先清除标志位,在计算DMA的数量,将接受的通过HAL_UART_Transmit_DMA函数发送,在启动一次DMA接受,点击编译,编译成功后,打开串口助手。
在这里插入图片描述
在发送区,我们输入自己发送的值,可以查看接受区是否有数据,我定义的是100的数组,最多传送的数据为一百。

本次讲解了USART的三种使用方法,分别是阻塞式发送和接受,中断式发送和接受,中断+DMA式发送和接受。

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在使用STM32CubeMX进行蓝牙串口通信配置时,首先需要将HC-05蓝牙模块连接STM32开发板上。在配置完成后,主从两机重新上电,不需要按按键,进入正常模式,此时HC-05指示灯会快闪。等待几秒钟后,主从两机会自动配对完成,指示灯会以5秒的时间间隔闪烁,表示主从两机连接成功。\[1\] 在STM32CubeMX中,需要对STM32进行相应的配置。HC-05蓝牙模块是主从一体的,两个HC-05之间进行通信时,需要进入AT模式,对HC-05模块进行相应的设置。为了进入AT模式,需要通过TTL转USB模块将HC-05蓝牙模块连接到电脑上。在上电之前,需要一直按住HC-05上的按键,然后上电后松开按键,此时指示灯会慢闪,表示进入AT模式。\[2\] 在主函数循环中,可以使用以下代码进行蓝牙串口通信: ```c uint8_t SendBuffer\[30\] = "hello,world!"; HAL_UART_Transmit(&huart2, (uint8_t *)SendBuffer, sizeof(SendBuffer), HAL_MAX_DELAY); ``` 以上代码将"hello,world!"发送到UART2串口实现了蓝牙串口通信。\[3\] #### 引用[.reference_title] - *1* *2* *3* [基于STM32CubeMX的HC-05蓝牙主从通讯](https://blog.csdn.net/m0_59551305/article/details/126634445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值