STM32F1串口通信-查询方式
STM32F1的串口有好几组,STM32的串口还有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。
虽然有这么多功能,但是这里为了总结串口的原理,采用最简单的查询的方式和电脑进行通信。
其实原子哥的《STM32F1开发指南-库函数版本》已经解释的非常详细了,这里只是按照我自己的风格叙述一遍而已。
使用串口的步骤
1,打开IO时钟
2,配置串口IO口模式,具体方式查看《STM32中文参考手册》8.1.11章节,接收引脚和发送引脚模式不一样的,所以要分别配置。
5,打开串口时钟
6,配置前最好复位下串口,这是个好习惯
7,配置串口,就是配置完串口初始化函数里面的选项就好了
8,使能串口
9,配置完成,下面可以正式使用了
本实验的功能;接收从电脑发送来的数据,然后发送回去
数据接收和发送的步骤;
1,不停地查询接收数据的状态标志位
2,当查询到有数据来时就接收数据放在变量中
3,发送接收到的数据,
4,等待数据发送完成,查询数据发送完成状态标志位
5,继续等待接收数据
注意;本实验只是示例,每次接收的数据长度是有限制的,本实验只是总结下串口的原理,估计项目中不会有人这样使用串口。
代码如下;
#include "sys.h"
#include "delay.h"
/************************************************************
功能;接收从电脑发送来的信息,并发送回电脑
串口接在PA9,PA10
串口配置步骤
为了更好的说明串口的本质,这里采用查询的方式,并没有使用中断
1,打开串口IO时钟
2,选择串口接收 引脚
3,选择接收引脚模式,这个模式要看《中文手册》8.1.11章节
4,配置IO翻转速度
5,配置串口发送引脚,方法同串口接收引脚,但是IO模式不一样
6,打开uart1时钟
7,选择串口波特率
8,选择是否需要硬件流控制
9,打开接收和发送模式
10,选择是否启用奇偶校验
11,选择停止位个数
12,选择数据长度
13,配置完成后一定要记得使能串口
14,不断查询接收状态位,然后该干嘛就干嘛去,发送数据的时候记得等待数据发送完成
****************************************************************/
void init__uart1()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
// 串口IO配置,PA9,PA10
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//IO时钟打开
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//IO方式具体看《中文手册》8.1.11章节
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//IO方式具体看《中文手册》8.1.11章节
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//配置串口1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开串口时钟
USART_DeInit(USART1);//在配置串口前复位下是个好习惯
USART_InitStruct.USART_BaudRate=115200; //波特率115200
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //接收和发送都使能
USART_InitStruct.USART_Parity=USART_Parity_No; //无奇偶校验
USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位1位
USART_InitStruct.USART_WordLength=USART_WordLength_8b; //数据长度8位
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1,ENABLE); //配置完成后一定要记得使能串口
}
int main(void)
{
char re_data=0;//为了接收字符,还是定义为字符类型吧
delay_init(); //延时函数初始化
init__uart1();//串口1初始化
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==1) //查询接收数据状态标志位
{
re_data=USART_ReceiveData(USART1); //接收数据
USART_SendData(USART1,re_data); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待数据发送完毕
}
}
}
STM32F1串口通信-查询方式
STM32F1的串口有好几组,STM32的串口还有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。
虽然有这么多功能,但是这里为了总结串口的原理,采用最简单的查询的方式和电脑进行通信。
其实原子哥的《STM32F1开发指南-库函数版本》已经解释的非常详细了,这里只是按照我自己的风格叙述一遍而已。
使用串口的步骤
1,打开IO时钟
2,配置串口IO口模式,具体方式查看《STM32中文参考手册》8.1.11章节,接收引脚和发送引脚模式不一样的,所以要分别配置。
5,打开串口时钟
6,配置前最好复位下串口,这是个好习惯
7,配置串口,就是配置完串口初始化函数里面的选项就好了
8,使能串口
9,配置完成,下面可以正式使用了
本实验的功能;接收从电脑发送来的数据,然后发送回去
数据接收和发送的步骤;
1,不停地查询接收数据的状态标志位
2,当查询到有数据来时就接收数据放在变量中
3,发送接收到的数据,
4,等待数据发送完成,查询数据发送完成状态标志位
5,继续等待接收数据
注意;本实验只是示例,每次接收的数据长度是有限制的,本实验只是总结下串口的原理,估计项目中不会有人这样使用串口。
代码如下;
#include "sys.h"
#include "delay.h"
/************************************************************
功能;接收从电脑发送来的信息,并发送回电脑
串口接在PA9,PA10
串口配置步骤
为了更好的说明串口的本质,这里采用查询的方式,并没有使用中断
1,打开串口IO时钟
2,选择串口接收 引脚
3,选择接收引脚模式,这个模式要看《中文手册》8.1.11章节
4,配置IO翻转速度
5,配置串口发送引脚,方法同串口接收引脚,但是IO模式不一样
6,打开uart1时钟
7,选择串口波特率
8,选择是否需要硬件流控制
9,打开接收和发送模式
10,选择是否启用奇偶校验
11,选择停止位个数
12,选择数据长度
13,配置完成后一定要记得使能串口
14,不断查询接收状态位,然后该干嘛就干嘛去,发送数据的时候记得等待数据发送完成
****************************************************************/
void init__uart1()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
// 串口IO配置,PA9,PA10
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//IO时钟打开
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//IO方式具体看《中文手册》8.1.11章节
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//IO方式具体看《中文手册》8.1.11章节
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//配置串口1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开串口时钟
USART_DeInit(USART1);//在配置串口前复位下是个好习惯
USART_InitStruct.USART_BaudRate=115200; //波特率115200
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //接收和发送都使能
USART_InitStruct.USART_Parity=USART_Parity_No; //无奇偶校验
USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位1位
USART_InitStruct.USART_WordLength=USART_WordLength_8b; //数据长度8位
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1,ENABLE); //配置完成后一定要记得使能串口
}
int main(void)
{
char re_data=0;//为了接收字符,还是定义为字符类型吧
delay_init(); //延时函数初始化
init__uart1();//串口1初始化
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==1) //查询接收数据状态标志位
{
re_data=USART_ReceiveData(USART1); //接收数据
USART_SendData(USART1,re_data); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待数据发送完毕
}
}
}
举报