【二】STM32F4 USART1 中断方式接收再将字符打印出来

来源:互联网 发布:凯聪网络摄像机设置 编辑:程序博客网 时间:2024/05/22 13:52
  1. void USART1_Config(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     USART_InitTypeDef USART_InitStructure;

  5.     /* config USART1 clock*/
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  8.     /* USART1 GPIO config*/
  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  11.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.   GPIO_Init(GPIOB,&GPIO_InitStructure);

  13.   GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
  14.   GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);    
  15.     /* USART1 mode config*/
  16.     USART_InitStructure.USART_BaudRate = 115200;
  17.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  18.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  19.     USART_InitStructure.USART_Parity = USART_Parity_No ;
  20.     USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;
  21.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  22.     USART_Init(USART1,&USART_InitStructure);
  23.    /*使能中断*/
  24.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  25.     USART_Cmd(USART1, ENABLE);
  26. }

还需要配置NVIC

void NVIC_Config(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

在以上函数中,NVIC_IRQChannel 是中断源,可以到STM32F4XX.H的140行处找,

第二项Preemption是中断组,中断组之间可以嵌套,0代表最高。

第三项是每个中断组里的中断成员,成员之间区分优先级,但一个组里的不可以嵌套。

第四项代表使能中断。

好了,NVIC配置好了后,就可以在stm32f4xx_it里添加中断服务函数了。

void USART1_IRQHandler(void)
{
char c;
 if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
 {
   c = USART_ReceiveData(USART1);
     USART_SendData(USART1,c);
 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
 GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
 }
}

中断服务函数工作很简单,就是将接收到的数据再通过SendData发送出去。

同时为了便于观察是否进入中断,添加了取反GPIOD14的操作,对应discovery板子上的红色LED。

0 0
原创粉丝点击