文章目录
STM32串口通信&STM32与K210通信的实现
待修整
STM32串口通信介绍
- STM32串口通信就是设备之间的数据传输协议,实现数据传输的功能
设备之间数据成功传输的关键就是协议的一致性,就比如STM32与K210的通信
STM32串口通信的数据形式
- STM32串口通信的数据传输是以数据包的形式,可以理解为数组
数组内容: 起始位+有效数据+校验位+停止位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5GnEoAi-1665844164000)(2022-10-15-17-35-00.png)]
以上为设备之间进行通信的依据
STM32串口通信配置(以串口1为例)
- 定义结构体变量
GPIO_InitTypeDef GPIO_InitStructure; // IO口配置结构体
USART_InitTypeDef USART_InitStructure; //串口配置结构体
NVIC_InitTypeDef MVIC_InitStructure; // 中断配置结构体
- 使能串口与GPIO时钟
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
- 相关配置
// 串口复位
USART_DeInit(USART1);
// GPIO端口模式设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// 串口参数初始化
USART_InitStructure.USART_BaudRate = bound; // 波特率配置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字节长为8位
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_Rx|USART_Mode_Tx // 收发模式配置
// 串口初始化
USART_Init(USART1,&USART_InitStructure);
#if EN_USART1_RX
// 初始化NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 开启中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE)
#endif
//使能串口
USART_Cmd(USART1,ENBALE);
4.主函数配置
uart_init(9600);
NVIC_PriorityGroupCmd(NVIC_PriorityGroup_2);
STM32串口通信中断解析
正点原子历程中数据结束标志为0X0D,0X0A
void USART1_IRQHandler(void)
{
u8 Res; // 接受数据变量
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 判断是否开启中断
{
Res =USART_ReceiveData(USART1); //将串口接受数据传递给Res
// 此处为第三步
if((USART_RX_STA&0x8000)==0) // USART_RX_STA接收状态标志位,此时未完成数据传输
{
//此处为第二步
if(USART_RX_STA&0x4000) // 接收到数据是0X0D,判断下一位数据,如果为0x0a传输结束,否则从头进行传输
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}
else
{
if(Res==0x0d)USART_RX_STA|=0x4000; //接收到数据为0x0d,将状态位赋值为0X4000
else
{
// 整个函数在此处开始运行
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
串口通信波特率
串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bps(位/秒)常用的波特率有9600,19200,38400,67600以及115200等。
- 波特率计算1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2xPyc1a-1665844163796)(2022-10-15-22-23-29.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn63xNy4-1665844163798)(2022-10-15-22-24-11.png)]
STM32与K210通信
未完待续…
中…(img-p2xPyc1a-1665844163796)]
[外链图片转存中…(img-Fn63xNy4-1665844163798)]
STM32与K210通信
未完待续…
图片源于https://blog.csdn.net/k666499436/article/details/124354165?spm=1001.2014.3001.5506 ↩︎