STM32F407ZG(参考正点原子)
串口配置
一. 串口操作相关库函数(省略入口参数)
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志
二. 串口配置的一般步骤
- 串口时钟使能:RCC_APBxPeriphClockCmd();
GPIO时钟使能:RCC_AHB1PeriphClockCmd();
② 引脚复用映射:
GPIO_PinAFConfig();
③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF
④串口参数初始化:USART_Init();
⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
⑥使能串口:USART_Cmd();
⑦编写中断处理函数:USARTx_IRQHandler();
⑧串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
⑨串口传输状态获取:
FlagStatus USART_GetFlagStatus();
void USART_ClearITPendingBit();
比如
比如这段串口初始化函数
首先
- 输入 USART_Init,并右键查看其定义;
可以看出需要定义一个(串口号,USART初始化结构体)
注意:IS_USART_ALL_PERIPH(A)翻译过来,就是看括号里的输入值是否在输入范围内,如果是,就返回1,即true。
所以,右键,查看IS_USART_ALL_PERIPH的定义,我们就知道了输入的范围,我们这里用的USART1,则输入USART1;
2. 对于第二个输入量,我们需要定义一个结构体,按照入口函数的样子定义一个,
USART_InitTypeDef USART_InitStructure;
3. 这样,当我们输入USART_InitStructure.的时候,后面的结构体内部变量就会提示,一个个点击,并赋值就好了;
USART_InitStructure.USART_BaudRate=115200;
同样,你会想,怎么知道输入的应该是115200,或者说你知道是115200,但是不知道是什么格式,和上面的一样,右键USART_Init,并查看其定义;
右键IS_USART_WORD_LENGTH查看其定义,发现可以是USART_WordLength_8b或者是USART_WordLength_9b
上面这段代码看起来也比较清爽;
IS_USART_WORD_LENGTH(LENGTH),如果LENGTH在正确的范围内即等于8b或者9b
assert_param它的作用就是检测传递给函数的参数是否是有效的参数。
Stm32f4xx_conf.h里的注释说明如下:
The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
assert_param宏用于函数的参数检查。 @param expr:如果expr为false,则调用assert_failed函数,该函数报告源文件的名称和失败的调用的源行号。 如果expr为true,则不返回任何值。
ps: C语言知识:||是逻辑符号或。
\是连接符,不是换行,define需要定义都在同一行,而同一行写不下就可以用"\"表示连接在同一行里。