stm32 串口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一、串口基础操作

  1. 打开GPIO和USART的时钟

  2. 配置GPIO(TX应为复用推挽输出,RX应为浮空或上拉输入)GPIO_Init初始化

  3. 配置USART(波特率直接写数,USART_Init函数会计算BRR寄存器重小数和整数部分的数值),使用USART_Init初始化,USART_Cmd使能

  4. 配置NVIC,中断源选择USART,使用NVIC_Init初始化

  5. 基于USART_SendData库函数编写串口数据处理函数,包括:

    发送:
    5.1 Serial_SendByte字节发送函数。使用USART_SendData库函数发送一个字节的数据,等待数据被转移到移位寄存器中退出函数(等待TXE(发送数据寄存器空 (Transmit data register empty))标志位置1时说明数据已经从数据寄存器移到了移位寄存器,认为已发送完毕,可以进行下一个数据的发送)。
    5.2 Serial_SendArray 数组发送函数。使用循环调用5.1中的Serial_SendByte函数发送数组中的数据。
    5.3 Serial_SendString 字符串发送函数。使用循环调用5.1中的Serial_SendByte函数发送字符串中的数据。
    5.4 Serial_SendNumber 数字发送函数。使用循环调用5.1中的Serial_SendByte函数发送数字的。。。万、千、百、十、个位发送出去。实现方法是用待传输的数字分别对。。。10000、1000、100、10、1求商再对10求余,分别获得最高位至最低位的值。(例如567,对100求商得5,5对10求余得最高位百位5,567对10求商得56,56对10求余得6,567对1求商得567,567对10求余得最低为7.)。
    5.5 重定向printf函数。三种方法,第一种把fputc重定义为调用Serial_SendByte发送数据并返回该数据。第二种方法是使用sprintf将待发送打印格式化为字符串,调用5.3中的Serial_SendString函数将字符串发发送出去,不用担心printf被某个端口独占。第三种方法是编写Serial_Printf函数,调用vsprintf将带输出内容格式化到一个字符串中,调用5.3中的Serial_SendString函数将字符串发发送出去。

    读取:
    5.6 使用查询的方法读取串口数据。在循环中用USART_GetFlagStatus库函数查询RXNE(读数据寄存器非空 (Read data register not empty))标志位,位置1时说明移位寄存器中的数据被转移到USART_DR寄存器中了,使用USART_ReceiveData库函数将该数据存到变量中。该标志位在读数据寄存器后会自动清零,所以不用手动清零。
    5.7 使用中断的方法读取串口数据。在USART1_IRQHandler中断服务函数中使用USART_GetITStatus库函数判断是否RXNE(读数据寄存器非空 (Read data register not empty))标志位,位置1时说明有数据传送进来了,使用USART_ReceiveData库函数将该数据存到变量中。


在这里插入图片描述
在这里插入图片描述

二、数据包

  1. 发送数据包
    编写Serial_SendPacket函数,①调用5.1中的Serial_SendByte函数发送包头,②调用Serial_SendArray发送数据,③调用调用5.1中的Serial_SendByte函数发送包尾

  2. 编写中断服务函数,使用状态机的方法接收数据包。

    数据包分为HEX数据包和文本数据包,这两种数据包又分为可变包长和固定包长两种。

    2.1 对HEX数据包,因传感器中的数据都是连续变化的,即使极少数据丢失也有后来的数据提供信息,而且不停变化的数据可能导致包头包尾难以判断,所以使用固定包长比较合适,本例中使用0xFF作为包头,0xFE作为包尾:

    在USART1_IRQHandler中断服务函数中,使用USART_GetITStatus判断RXNE标志位是否置1,使用RxHexState变量作为状态标志。①当RxHexState为0时,在等待包头,当读取到的数据为0xFF时认为已读到包头。②RxHexState设置为1,开始读取数据包中的数据,通过变量进行计数,当读满数据包长度后,③RxHexState设置为2,等待包尾,当读取到的数据为0xFE时认为读到包尾,并将RxHexState设置为0,回到初始装填。此时修改标志着是否读取到数据包的全局变量Serial_RxFlag为1,意思是向main函数报告已读取到一个数据包。

    2.2 对文本数据包,每句话都是不同的长度,可以使用特殊符号作为包头包尾,使用可变包长,本例中使用@作为包头,换行符作为包尾:
    在USART1_IRQHandler中断服务函数中,使用USART_GetITStatus判断RXNE标志位是否置1,使用RxHexState变量作为状态标志。①当RxHexState为0时,在等待包头,当读取到的数据为’@‘时认为已读到包头,②将RxHexState设置为1,先判断数据是否为’\r’,如果不是则为文本数据,将其存到字符数组中,如果是,③则将RxHexState设置为2,等待包尾中的第二个字符’\n’,此时认为读到完整的包尾,修改标志是否读取到数据包的全局变量Serial_RxFlag置1,向main函数报告已读取到一个数据包。

  3. 在main函数的while循环中用if语句判断标志是否读取到数据包的全局变量Serial_RxFlag是否是1,如果是1则有数据读进来,可通过判断语句执行响应动作。

注释:
\r是指Carriage Return(即为CR),Carriage 是打字机上写字的打印头,Carriage Return是让光标去到行首,是ASCII码的0x0D
\n是指Line Feed(即为LF)是指整体向上移动一行,是ASCII码的0x0A

微软的 MS-DOS/Windows 操作系统采用\r\n这两个字符来实现文本换行效果。
Unix/Linux 操作系统采用单个字符\n来实现文本换行效果。
Mac 操作系统采用单个字符\r 来实现文本换行效果.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一款非常流行的微控制器,它具有强大的串口通信功能。下面是使用STM32串口通信的基本步骤: 1. 配置GPIO引脚:首先要确定使用哪个串口,然后将相应的引脚配置为串口功能。 2. 配置USART寄存器:USART寄存器控制串口的各种参数,如波特率、数据位、停止位、校验等。 3. 初始化串口:将USART寄存器的值加载到USART控制器中,然后使能串口。 4. 发送数据:将待发送的数据写入USART数据寄存器中,USART将自动发送数据。 5. 接收数据:USART接收到数据后,将数据存放在USART数据寄存器中,然后通过中断或轮询方式读取数据。 下面是一个简单的STM32串口发送字符串的代码示例: ``` #include "stm32f10x.h" #include "stdio.h" USART_InitTypeDef USART_InitStructure; void USART1_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } int main(void) { USART1_Configuration(); while (1) { char buffer[] = "Hello, World!\r\n"; for (int i = 0; i < sizeof(buffer); i++) { USART_SendData(USART1, buffer[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } } ``` 该程序将串口1配置为TX模式,并发送一个字符串“Hello, World!”。要接收数据,请使用USART_ReceiveData函数读取USART数据寄存器中的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值