- 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。
本文介绍STM32微控制器USART串口模块的初始化配置过程,包括时钟设置、GPIO配置及中断服务函数实现,并详细解释了NVIC中断优先级配置方法。
4907

被折叠的 条评论
为什么被折叠?



