串口配置基本步骤(USART2为例):
1.配置时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_CAN, ENABLE);
2.IO口配置:TX配置为复用推挽型,RX配置为悬浮输入型
//USART2 输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART 输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
3.NVIC中断配置,开启USART2的全局中断
VIC_InitStructure.NVIC_IRQChannel=USART2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPrioriiority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
4.串口通信寄存器配置,设置波特率,数据长度,停止位,奇偶校验等等,同时使能串口的各种中断,最后使能串口模块
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART2, &USART_InitStructure);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2, ENABLE);
}
串口的接收和发送可以通过普通的查询模式实现,在程序结构简单,对实时性要求不高的情况下,可以采用这种方法。需要注意的是,在发送前要确认发送寄存器为空,同样,在判断接收寄存器有值后,才能读取接收寄存器,stm32强大函数库提供了很便捷的方法来实现这种查询。
查询方法实现:
接收:
while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET){}
data=USART_ReceiveData(USART2);
发送:
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}
USART_SendData(USART2,data);
从命名上大概可以猜出:
USART_FLAG_RXNE 接收寄存器not empty标志
USART_FLAG_TXE 发送寄存器 empty标志
中断方法实现:
使能全局中断,使能接收中断,发送中断
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART2,USART_IT_TXE,ENABLE);
判断中断源,再进行相应的处理
void USART2_IRQHandler(void)
{
u8 data_receive,data_send;
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断发生接收中断
{
data_receive=USART_ReceiveData(USART2);
//其他操作。。。。。。。。。。。
}
if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)
{
USART_SendData(USART2,tx_buffer[l]);
l++;
if(tx_buffer[l]=='\0')
USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
}
}
/************************************************************************/
几个问题:
1.在网上看到有的程序在接收中断中已经调用USART_ReceiveData(USARTx)函数,但还是用USART_ ClearITPendingBit函数对RXNE进行清零操作,其实这是多余的,因为对接收寄存器的读操作后RXNE中断标志会自动清零的。
2.TXE 软件对该位清零时是没用的,发送数据寄存器为空时即为1,在发送中断开时就会进入中断响应函数,只有要发送的数据写入发送寄存器时该位为0。
只有连续发送数据时发送中断寄存器才比较有用。
3.发送完成中断,及其他几个标志位必须软件清零,具体参考datasheet。
文章评论(0条评论)
登录后参与讨论