蓝桥杯嵌入式——串口配置
作者:闫永成 QQ:793805481
串行接口,简称串口(USART),简单的理解就是指把数据按顺序一位一位地传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(例如 可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
蓝桥杯嵌入式的板子上有两个串口可供我们使用,分别是串口1和串口2,但是串口1是连接在9针串口上的,所以我们只能通过USB线去使用串口2。
通过原理图,可以知道串口2的发送和接收端分别对应PA2和PA3。 使用串口时,需要用到stm32f10x_usart.c这个文件,需要提前添加进去。然后,就可以开始配置了。
1.串口初始化函数
void USART2_Init(u32 bound)//USART初始化函数 参数为波特率
{
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
//开启时钟 USART2在APB1总线上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//发送端 配置为复用推挽输出
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //开启串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为最高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为最高
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//接收端 配置为浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate=bound;//设置波特率
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位
USART_InitStruct.USART_StopBits=USART_StopBits_1;//1位停止位
USART_InitStruct.USART_Parity=USART_Parity_No;//无奇偶校验位
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//接受和发送
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不需要开启硬件控制
USART_Init(USART2,&USART_InitStruct);//USART初始化
USART_Cmd(USART2,ENABLE);//使能串口
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断
}
USART_Init(USART2,&USART_InitStruct);
是stm32f10x_usart.c里边已经定义的函数,用来配置USART的基本参数——波特率(波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示)、数据位数、有无停止位、有无奇偶校验位等。在这里,波特率有初始函数参数给入,设置8位数据位、1位停止位、无奇偶校验、开启USART的发送和接收模式、不开启硬件控制。
同时,我们需要用到中断,当我们接收到数据时执行中断。(当然,如果我们只是想发送数据,不使用接收数据的话,就不用使用中断)
2.数据发送函数
void USART2_SendString(u8 *str)
{
u8 index=0;
do
{
USART_SendData(USART2,str[index]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0); //是否发送完成 等待上边数据发送完成的
index++;
}while(str[index]!=0);
}
这里,主要用到了USART_SendData(USART2,str[index]);
、USART_GetFlagStatus(USART2, USART_FLAG_TXE)
这两个函数。USART_SendData是用来发送数据的,每次发送1个8位的数据(当我们的板子和PC相连时就能实现向PC发送数据);USART_GetFlagStatus(USART2, USART_FLAG_TXE)是用来判断标志位的,当数据发送完成时返回为1。
3.中断函数(接收函数)
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
temp = USART_ReceiveData(USART2);//接收数据
if(temp == '\n')
{
RXCOUNT = 0;
RXOVER = 1;
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}else
{
RX_Str[RXCOUNT] = temp;
RXCOUNT++;
}
}
}
定义全局变量RXCOUNT(计数)、RXOVER(结束标志)、RX_Str[20](存放接收数据的数组)。如果接收到数据时即产生中断,然后判断是否为’\n’(这里我们设接收到’\n’时结束本次接收,即’\n’为结束标志),如果不是’\n’时,我们把接收到的数据存入数组中,否则计数值置零、结束标志置1,关闭中断。这样,我们就可以在主函数里边调用接收到的数据了。注意:中断函数名都是已经定义好的,在startup_stm32f10x_md.s里边可以找到。
4.调用
u8 RX_Str[20];
u16 RXOVER=0;
u16 RXCOUNT=0;
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
USART2_Init(19200);//设置波特率为19200
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetTextColor(Yellow);
LCD_SetBackColor(White);
while(1)
{
USART2_SendString("54811");
Delay_Ms(1000);
if(RXOVER)
{
u16 i;
//利用接收到的数据执行的操作
LCD_DisplayStringLine(Line0,RX_Str);
USART2_SendString(RX_Str);//重新发送回电脑
for(i=0;i<20;i++)//清空
{
RX_Str[i]=0;
}
RXOVER=0;//置零
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//重新开启中断
}
}
}
在主函数中,正常初始化函数后就可以使用发送和接收函数了,可以实现由板子向PC机发送数据和从PC机接收数据(接收后可以执行相关操作后重复接收)。这时,我们需要用到串口调试助手,用来实现板子与电脑的通信。关于串口调试助手的使用并不困难,留给大家自己琢磨。
关于串口通信,本篇文章就介绍到这里,欢迎大家私信交流!