需要添加的固件库文件有 stm32f4xx_gpio.c、stm32f4xx_rcc.c、 misc.c、 stm32f4xx_usart.c 四个。
1) 串口时钟和 GPIO 时钟使能。
串口3是挂载在 APB1 下面的外设,, 对应着芯片引脚 PB10、PB11,所以使能函数为:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能 GPIOB 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//使能 USART3 时钟
2) 设置引脚复用器映射
引脚复用器映射配置,调用函数为:
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10, GPIO_AF_USART3); // //PB10 复用为 USART3
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11, GPIO_AF_USART3); // //PB11 复用为 USART3
因为串口使用到 PB10,PB11,所以我们要把 PB10 和PB11 都映射到串口3。所以这里调用两次函数。 对于 GPIO_PinAFConfig 函数的第一个和第二个参数很好理解,就是设置对应的 IO 口,如果是 PB10那么第一个参数是GPIOB,第二个参数就是 GPIO_PinSource10。第二个参数,实际不需要去记忆,只需去相应的配置文件找到外设对应的 AF 配置宏定义标识符即可,串口 3为 GPIO_AF_USART3。
3) GPIO 端口模式设置: PB10,PB11 要设置为复用功能。
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 |GPIO_Pin_11; //PB10 PB11
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用模式
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化
4) 串口参数初始化并使能:设置波特率,字长,奇偶校验等参数
串口初始化是调用函数 USART_Init 来实现的,具体设置方法如下:
USART_InitStructure.USART_BaudRate=bound; //设置波特率
USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_InitStructure.USART_Parity= USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_StopBits= USART_StopBits_1;//一个停止位
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为 8 位数据格式
USART_Init(USART3, &USART_InitStructure); //初始化串口
USART_Cmd(USART3, ENABLE); //使能串口3
5) 开启中断并且初始化 NVIC,使能相应中断
这一步如果我们要开启串口中断才需要配置 NVIC 中断优先级分组。通过调用函数NVIC_Init 来设置。
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级 3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器
同时,我们还需要使能相应中断,使能串口中断的函数是:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么开启中断的方法是:
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
这里还要特别提醒,因为实验开启了串口中断,所以在系统初始化的时候需要先设置系统的中断优先级分组,是在main 函数开头设置的,代码如下:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
设置分组为 2,也就是 2 位抢占优先级,2 位响应优先级。
6) 中断服务函数
当发生中断的时候,程序就会执行中断服务函数。然后在中断服务函数中编写我们相应的逻辑代码即可。
void