基础
CT117E开发板引出了两个串口,但是咱们只会用到串口2的电路,因为串口1连了一个九针的口,一般不用那个口。
串口配置步骤:
- 串口时钟使能,GPIO时钟使能
- 串口复位
- GPIO初始化
- 串口参数初始化
- 开启串口中断,并初始化中断
- 使能串口
- 编写串口中断服务函数,用于串口接收数据
- 串口数据发送函数
代码:
void usart2_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//PA2为发送引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PA3为接收引脚
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=9600;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不适用硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//发送和接受模式
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据为
USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位
USART_InitStructure.USART_Parity=USART_Parity_No;//不进行奇偶校验
USART_Init(USART2,&USART_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//串口接收中断
}
串口发送函数是需要自己写的,需要注意的是,在每次串口发送数据之后都要等到发送完成再进行下一次发送,在代码中的体现就是等到发送缓冲区为空再进行发送。
void USART2_SendString(u8 *str)//中断标志状态和一般状态是不一样的。
{
u8 index = 0;
do
{
USART_SendData(USART2,str[index]); //发送数据
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0); //发送缓冲区为空就是发送完成 //USART_FLAG_TC 表示传输完毕;USART_FLAG_TXE表示发送缓冲区空
index++;
}while(str[index] != 0);
}
串口的接收放在中断函数中:
u8 RXbuf[20];//初始化就是0
u8 RXover=0;
u8 RXcont=0;
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')
{
RXcont = 0;
RXover = 1;//接收到的标志
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//先把串口给关掉,处理接收到的数据,等需要的时候再打开。。
}else
{
RXbuf[RXcont] = temp;
RXcont++;
}
}
}
在主函数中的配置:
if(RXover)
{
USART2_SendString(RXbuf);
LCD_ClearLine(Line3);
LCD_DisplayStringLine(Line3,RXbuf);
for(i=0;i<20;i++)
{
RXbuf[i]=0;
}
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
RXover=0;
}