STM32F1串口2初始化和中断函数



#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.