最详细STM32,cubeMX串口发送,接收数据
【摘要】 >这篇文章将详细介绍 串口 发送数据,接受数据。@[TOC](文章目录)---# 前言- 实验开发板:STM32F103C8T6。- 所需软件:keil5 , cubeMX 。- 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。- 实验:串口发送数据点亮 led。---# 一、串口的基础知识如果想了解串口的基础知识可以参考我之前的文章:[STM32Cube串口USART发送接收...
>这篇文章将详细介绍 串口 发送数据,接受数据。
@[TOC](文章目录)
---
# 前言
- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
- 实验:串口发送数据点亮 led。
---
# 一、串口的基础知识
如果想了解串口的基础知识可以参考我之前的文章:
[STM32Cube串口USART发送接收数据](https://blog.csdn.net/wuyiyu_/article/details/129219018)
[STM32CubeMX串口USART中断发送接收数据
](https://blog.csdn.net/wuyiyu_/article/details/129238627)
# 二、cubeMX 配置
1. 选择芯片,开始创建工程。

2. 设置 仿真。

3. 配置时钟,选择 HSE, 高速时钟。

4. 设置时钟频率。
直接设置为 最大频率 72 ,然后双击 enter 即可。

5. 设置工程的名字,工具链选择 MDK。

6. 点击自动生成 .c / .h 文件。

7. 这里我使用串口2 ,USART2。然后选择异步模式。
对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。

8. 点击 NVIC, 使能中断。
9. 设置 相关参数(波特率,数据长度,校验位,停止位)

10. 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。

11. 点击生成即可。
这样就可以生成 keil 的工程文件。

# 三、自动生成代码解析
使用 cubeMX 生成的 串口代码都放在 usart.c 中。
1. 首先还是 先定义一个 串口对象,这是一个结构体。
2. 初始化这个结构体中的相关参数。然后调用 `HAL_UART_Init(&huart2)` 对其初始化。
3. 之后自动调转到`HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)` 执行。
4. ` __HAL_RCC_USART2_CLK_ENABLE()`; 开启串口 2
由于 PA2, PA3 引脚,所以使用 ` __HAL_RCC_GPIOA_CLK_ENABLE();`使能 gpio 端口。
5. 配置引脚:
这里 **PA2 作为复用引脚**(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是==GPIO_MODE_AF_PP==复用推挽输出。
6. `HAL_NVIC_SetPriority(USART2_IRQn, 0, 0)` 设置优先级
`HAL_NVIC_EnableIRQ(USART2_IRQn);` 使能中断


# 四、串口发送数据函数
1. 发送数据。串口发送数据有 2 种写法。(有无中断)
这里我主要介绍最后一个参数 超时时间 **Timeout** 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。
```c
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
```
以中断的方式发送数据。这里就不需要超时时间了。
```c
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
```
2. 接收数据。
- 开启串口中断接收函数:
==每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据==。
```c
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
```
- 串口中断接收回调函数:
当接收到数据时,就会调用该函数。
```c
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
```
# 五、使用串口收发数据点亮 led
这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。
```c
uint8_t rx_buff = 0; // 存放接收的数据
/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart2)
{
if(rx_buff == 0xa1) // 发送 a1 点亮 led
{
printf("LED ON\r\n"); // 使用 printf 发送数据,需重定向 fputc 函数
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}
else if(rx_buff == 0xa2) // 发送 a2 熄灭 led
{
printf("LED OFF\r\n");
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
}
HAL_UART_Receive_IT(&huart2,&rx_buff,1); // 再次开启接收
}
```
### 重定向函数:
发送数据,可使用 **printf** 。
`由于 printf 依赖于 fputc 函数`,所以可以重定向 fputc 来实现 printf 串口发送数据。
```c
int fputc(int ch, FILE* f)
{
while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);
return 0;
}
```
接收数据可以使用 **scanf** 。
```c
int fgetc( FILE *f) /* scanf 输入 */
{
char c = 0;
while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
return c;
}
```
---
# 总结
下一篇文章为大家介绍 STM32 超声波 模块的使用。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)