介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向。
STM32F407 串口配置说明
STM32F4 的串口资源相当丰富的,功能也相当强劲,STM32F407ZGT6 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。
串口寄存器介绍在手册第26章
GPIO口复用功能引脚配置
F407串口对应的引脚
配置复用功能的寄存器
串口时钟频率配置分析
Usart.c代码示例:
#include "usart.h"
/*
函数功能:串口1初始化
函数形参:
u32 clock :时钟频率(默认*1000000HZ) 注意:APB1最大时钟频率为42MHZ APB2最大时钟频率为84MHZ
u32 baud :波特率
硬件连接:
PA9--- >TX
PA10-- >RX
*/
void USART1_Init(u32 clock,u32 baud)
{
/*1. 开时钟*/
RCC- >AHB1ENR|=1< < 0;//使能PORTA时钟
RCC- >APB2ENR|=1< < 4;//使能USART1时钟
/*2. 复位串口时钟*/
RCC- >APB2RSTR|=1< < 4; //使能USART1复位时钟
RCC- >APB2RSTR&=~(1< < 4); //关闭USART1复位时钟
/*3. 配置GPIO口模式*/
GPIOA- >MODER&=~(0x3< < 9*2); //清除模式
GPIOA- >MODER|=0x2< < 9*2; //配置复用功能模式
GPIOA- >MODER&=~(0x3< < 10*2); //清除模式
GPIOA- >MODER|=0x2< < 10*2; //配置复用功能模式
GPIOA- >OTYPER&=~(0x1< < 9); //0表示推挽输出
GPIOA- >OSPEEDR&=~(0x3< < 9*2); //清除之前配置
GPIOA- >OSPEEDR|=0x2< < 9*2; //50MHZ输出速度
GPIOA- >PUPDR&=~(0x3< < 10*2); //清除之前配置
GPIOA- >PUPDR|=0x1< < 10*2; //配置上拉
GPIOA- >AFR[1]&=~(0xF< < 4*1); //清除PA9配置
GPIOA- >AFR[1]|=0x7< < 4*1; //配置PA9复用功能模式为串口1
GPIOA- >AFR[1]&=~(0xF< < 4*2); //清除PA10配置
GPIOA- >AFR[1]|=0x7< < 4*2; //配置PA10复用功能模式为串口1
/*4. 配置USART-CR寄存器*/
USART1- >BRR=(clock*1000000)/baud;//配置波特率
USART1- >CR1|=1< < 3; //使能发送
USART1- >CR1|=1< < 2; //使能接收,并开始搜寻RX引脚上的起始位
USART1- >CR1|=1< < 13; //USART模块使能。
}
/*
函数功能:串口字符串发送
函数形参:
USART_TypeDef *USARTx :串口的类型 (USART1 USART2 USART3)
u8 *str:将要发送的字符串
*/
void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
{
while(*str!='\\0')
{
USARTx- >DR=*str;
while(!(USARTx- >SR&1< < 7)){} //等待发送完成
str++;
}
}