一、STM32的USART窗口通讯程序
要求
1)设置波特率为115200,1位停止位,无校验位。
2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
硬件介绍
本人使用的是野火的野火MINI开发板,芯片是STM32F103RCT6
很方便的一点就是电脑安装CH340驱动后就可以实现USB转串口,用USB线就能实现串口通讯,不需要额外的购置串口线或者USB转串口的配件
USART介绍
通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据 组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。
寄存器标志位
状态SR常用:
数据DR常用:
波特率BRR常用:
还有
主要是发送/接受使能和中断使能(Enable)
串口初始化需要设置的(以本实验代码位例子):
步骤实例:
1. 串口时钟使能
2.忽略
3.GPIO端口模式设置
GPIO端口模式设置可以在上面提到的手册的8.1.11 查表
输入模式相关:上拉输入、下拉输入、浮空输入、模拟输入的区别
这里注意到GPIO_TX的模式设置的是推挽复用,原因如下:
因为是串口不在时普通的IO口所以复用,
因为没接上拉电阻所以推挽。
因为TX为发送数据端口所以输出。
这样,输出口的GPIO设置完成
接收口的GPIO,注意这里是pin_10,TX是pin_9,
接收口用到是浮空/带上拉 输入
4.串口参数初始化
//USART相关寄存器设置
void User_USART_Config(void)
{
USART_InitTypeDef USART_Config;
//使能USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//初始化USART_InitTypeDef结构体
USART_Config.USART_BaudRate = 115200; //波特率
USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制(此处不用)
USART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送和接收使能设置
USART_Config.USART_Parity = USART_Parity_No; //奇偶校验位 (此处不用)
USART_Config.USART_StopBits = USART_StopBits_1; //停止位
USART_Config.USART_WordLength = USART_WordLength_8b; //字长(可以是8或9位)
//设置USART1对应的寄存器
USART_Init(USART1, &USART_Config);
//使能USART1 数据接收RXEN中断寄存器,即接收数据寄存器有数据可读时,RXEN寄存器产生中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//使能串口USART1,使其进行工作
USART_Cmd(USART1, ENABLE);
}
USART_Init函数第二个参数是结构体类型指针,所有必须先定义一个结构体
2/3步无先后顺序
我们因为需要的是全双工的通讯
所有这里3的mode同时使能了发送TX和接收口RX
5.开启中断并且初始化NVIC
开启接收中断
ITConfig:中断使能函数
USART_IT_RXNE函数在上文已经说过了,为读取器寄存非空函数
跟GPIO类似初始化入口函数Init
并设置优先级组
初始化结构体
6.使能串口
使用Cmd函数
7.编写中断处理函数
这里我们要求中断发生的条件是接收到了数据
中断发生后,判断接收到的字符是否为“Stop Stm32”
如果是,则停止发送,如果不是则继续发送
8.串口数据收发
这里我不需要任何中断服务,就把原程序的回显函数删掉了
9.串口传输状态获取
主函数
int main(void)
{
DEBUG_UART_Config();
//USART_SendData(DEBUG_USARTx, 'a');
// printf->fputc->USART_SendData->µçÄÔµÄÉÏλ»ú
while(1)
{
uint8_t ucTemp;
uint8_t StopFlag[]="stop,stm32";
uint16_t len,i;
int Flag_s=1;
/************************/
uint8_t flag1=0;
delay(100000);
printf("hello windows!rn");
/****************************/
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
len=DEBUG_USARTx->DR & (uint16_t)0x01FF;
ucTemp = USART_ReceiveData(DEBUG_USARTx);
for(i=0;i
{
if(StopFlag
==ucTemp)Flag_s=0;
if(BeginFlag==ucTemp)Flag_s=0;
}
if(Flag_s==1)
{
flag1=1;
}
}
if(flag1==1)break;
}
}
一、STM32的USART窗口通讯程序
要求
1)设置波特率为115200,1位停止位,无校验位。
2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
硬件介绍
本人使用的是野火的野火MINI开发板,芯片是STM32F103RCT6
很方便的一点就是电脑安装CH340驱动后就可以实现USB转串口,用USB线就能实现串口通讯,不需要额外的购置串口线或者USB转串口的配件
USART介绍
通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据 组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。
寄存器标志位
状态SR常用:
数据DR常用:
波特率BRR常用:
还有
主要是发送/接受使能和中断使能(Enable)
串口初始化需要设置的(以本实验代码位例子):
步骤实例:
1. 串口时钟使能
2.忽略
3.GPIO端口模式设置
GPIO端口模式设置可以在上面提到的手册的8.1.11 查表
输入模式相关:上拉输入、下拉输入、浮空输入、模拟输入的区别
这里注意到GPIO_TX的模式设置的是推挽复用,原因如下:
因为是串口不在时普通的IO口所以复用,
因为没接上拉电阻所以推挽。
因为TX为发送数据端口所以输出。
这样,输出口的GPIO设置完成
接收口的GPIO,注意这里是pin_10,TX是pin_9,
接收口用到是浮空/带上拉 输入
4.串口参数初始化
//USART相关寄存器设置
void User_USART_Config(void)
{
USART_InitTypeDef USART_Config;
//使能USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//初始化USART_InitTypeDef结构体
USART_Config.USART_BaudRate = 115200; //波特率
USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制(此处不用)
USART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送和接收使能设置
USART_Config.USART_Parity = USART_Parity_No; //奇偶校验位 (此处不用)
USART_Config.USART_StopBits = USART_StopBits_1; //停止位
USART_Config.USART_WordLength = USART_WordLength_8b; //字长(可以是8或9位)
//设置USART1对应的寄存器
USART_Init(USART1, &USART_Config);
//使能USART1 数据接收RXEN中断寄存器,即接收数据寄存器有数据可读时,RXEN寄存器产生中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//使能串口USART1,使其进行工作
USART_Cmd(USART1, ENABLE);
}
USART_Init函数第二个参数是结构体类型指针,所有必须先定义一个结构体
2/3步无先后顺序
我们因为需要的是全双工的通讯
所有这里3的mode同时使能了发送TX和接收口RX
5.开启中断并且初始化NVIC
开启接收中断
ITConfig:中断使能函数
USART_IT_RXNE函数在上文已经说过了,为读取器寄存非空函数
跟GPIO类似初始化入口函数Init
并设置优先级组
初始化结构体
6.使能串口
使用Cmd函数
7.编写中断处理函数
这里我们要求中断发生的条件是接收到了数据
中断发生后,判断接收到的字符是否为“Stop Stm32”
如果是,则停止发送,如果不是则继续发送
8.串口数据收发
这里我不需要任何中断服务,就把原程序的回显函数删掉了
9.串口传输状态获取
主函数
int main(void)
{
DEBUG_UART_Config();
//USART_SendData(DEBUG_USARTx, 'a');
// printf->fputc->USART_SendData->µçÄÔµÄÉÏλ»ú
while(1)
{
uint8_t ucTemp;
uint8_t StopFlag[]="stop,stm32";
uint16_t len,i;
int Flag_s=1;
/************************/
uint8_t flag1=0;
delay(100000);
printf("hello windows!rn");
/****************************/
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
len=DEBUG_USARTx->DR & (uint16_t)0x01FF;
ucTemp = USART_ReceiveData(DEBUG_USARTx);
for(i=0;i
{
if(StopFlag
==ucTemp)Flag_s=0;
if(BeginFlag==ucTemp)Flag_s=0;
}
if(Flag_s==1)
{
flag1=1;
}
}
if(flag1==1)break;
}
}
举报