常用的串口相关的寄存器 USART_SR 状态寄存器 发送或接受完成 5 读取数据空不空 RXNE 6 发送完成寄存器 库函数中:USART_GetFlagStatue(UASART_TypeDef* USARTx , USART_FLAG) 这个用来获取串口的状态
USART_DR 数据寄存器 发送或者接受数据的地方 0-8 就是数据值的存储地方 USART_SendData() 发送数据 USART_ReciveData() 接收数据
USART_BRR 波特率寄存器 用了16位 0-3 小数部分 4-15 整数部分 有具体的波特率计算方式 fpclk /usartdiv /(8*(2-over8)) over8取0 fpclk pclk1 用于 usart2-5 pclk2 用于 usart2,usart6 pclk2 84M(k=1000 M=1000*1000=1000000) Tx/Rx的波特率=fpclkx/(16*usartdiv) usartdiv=fpclk/(16*Brr波特率) 得到的usart整数部分直接写到 BRR的4-15 小数部分*16 写到0-3 USART_Init()
具体代码如下
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
void Usart1Init(){
GPIO_InitTypeDef gpioinit ;
USART_InitTypeDef initusart;
NVIC_InitTypeDef nvicinit;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口一的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能引脚的时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIO引脚复用配置映射pa9映射到串口
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIO引脚复用配置映射pa10映射到串口
gpioinit.GPIO_Pin = GPIO_Pin_9; // 引脚9
gpioinit.GPIO_Mode = GPIO_Mode_AF; // 模式位复用模式
gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上下拉
gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度
GPIO_Init(GPIOA , &gpioinit);
gpioinit.GPIO_Pin = GPIO_Pin_10; // 引脚9
gpioinit.GPIO_Mode = GPIO_Mode_AF; // 模式位复用模式
gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上下拉
gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度
GPIO_Init(GPIOA , &gpioinit);
initusart.USART_BaudRate=115200; //波特率
initusart.USART_HardwareFlowControl= USART_HardwareFlowControl_None ; //硬件流 TEC CTC 什么一些鬼东西哦
initusart.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //模式,使能发送或者接受
initusart.USART_Parity = USART_Parity_No; //奇偶校验位
initusart.USART_StopBits = USART_StopBits_1 ; //停止位
initusart.USART_WordLength = USART_WordLength_8b; //字长
USART_Init(USART1,&initusart); //进行串口的初始化
USART_Cmd(USART1,ENABLE); // 串口使能函数
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口接受完成中断
// 初始化中断
nvicinit.NVIC_IRQChannel= USART1_IRQn ;//通道
nvicinit.NVIC_IRQChannelCmd= ENABLE ;//
nvicinit.NVIC_IRQChannelPreemptionPriority= 1 ;//
nvicinit.NVIC_IRQChannelSubPriority = 1 ;//
NVIC_Init(&nvicinit);
}
//中断服务函数
void USART1_IRQHandler(void){
u8 data;
//判断是不是接受中断
if(USART_GetITStatus(USART1,USART_IT_RXNE)){
data=USART_ReceiveData(USART1);
USART_SendData(USART1,data);
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Usart1Init();
while(1);
}
/*
手册中讲解到步骤15的时候的main.c源码如下:
#include "stm32f4xx.h"
//ALIENTEK 探索者STM32F407开发板 实验0
//STM32F4工程模板-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
while(1){
GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
Delay(0x7FFFFF);
GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
Delay(0x7FFFFF);
}
}
*/