- void USART1_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- /* config USART1 clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- /* USART1 GPIO config */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
- /* USART1 mode config */
- 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(USART1, &USART_InitStructure);
- /*使能中断*/
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
- USART_Cmd(USART1, ENABLE);
- }
还需要配置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。