#define USART2_RX_BUF_LENTH 128
u8 USART2_Rx_Buf[USART2_RX_BUF_LENTH];
u8 USART2_Rx_Cnt = 0;
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//|RCC_APB2Periph_AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 0-3;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
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_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲中断
USART_Cmd(USART2, ENABLE); //使能串口
USART_ClearFlag(USART2, USART_FLAG_TC);
}
//////串口2处理接收到的数据
void USART2_Instructor(){
u8 i;
////这里写处理中断事件的函数
////下面是清除USART2_Rx_Buf 中的内容
USART2_Rx_Cnt = 0;
for(i=0;i<=USART2_Rx_Cnt;i++){
USART2_Rx_Buf[i] = 0x00;
}
}
/////////串口2中断函数 ,, 先是每收到一字节,就写入到USART2_Rx_Buf,然后当这一帧数据完成的时候就会触发空闲中断,空闲中断处理要做的事情,再清空USART2_Rx_Buf
void USART2_IRQHandler(void)
{
if(USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
{
USART2_Rx_Buf[USART2_Rx_Cnt] = USART_ReceiveData(USART2);//读取接收到的数据
USART2_Rx_Cnt++;
}
else if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)//接收完数据后进入空闲中断
{
USART2_Instructor();
// USART_ClearITPendingBit(USART2,USART_IT_IDLE);
// USART2->SR;
USART2->DR;
}
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //一定要清除接收中断
}
·关于我们·免责声明·服务条款·RSS订阅·dede168.com技术支持
Copyright © 1998-2015 All rights reserved.