这章我们来讲下怎么初始化以及使用USART
现在我们也是先看一下固件库手册:
代码编写:
GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;// 定义GPIO初始化结构体变量
USART_InitTypeDef USART_InitStructure;// 定义USART初始化结构体变量
NVIC_InitTypeDef NVIC_InitStructure; // 定义NVIC(嵌套向量中断控制器)初始化结构体变量
// 使能USART1和GPIOA的时钟
// RCC_APB2Periph_USART1: USART1的时钟
// RCC_APB2Periph_GPIOA: GPIOA端口的时钟
// ENABLE: 使能这些时钟
// 这一步是必要的,因为在初始化外设之前需要确保它们的时钟已经被使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
初始化USART代码
// 设置USART的波特率,这里的`bound`是一个变量,代表具体的波特率值,一般设置为9600
USART_InitStructure.USART_BaudRate = bound;
// 设置USART的字长为8位数据格式
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// 设置USART的停止位为1个停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
// 设置USART的奇偶校验位为无,即不使用奇偶校验
USART_InitStructure.USART_Parity = USART_Parity_No;
// 设置USART的硬件流控制为无,即不使用硬件流控制
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// 设置USART的模式为收发模式,即USART可以进行接收和发送操作
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
// 使用前面的配置初始化USART1
USART_Init(USART1, &USART_InitStructure);
// 开启USART1的接收中断(USART_IT_RXNE),当接收到数据时,产生中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
// 使能USART1,此时USART1根据上面的配置开始工作,可以进行数据的接收和发送
USART_Cmd(USART1, ENABLE);
这里我用的是中断方式处理的 USART( USART_ITConfig中断使能函数),当STM32接收到USATR数据时候就会转跳到void USART1_IRQHandler(void){ } //串口1中断服务程序(固定的函数名不能修改)来处理
接收数据
USART_GetITStatus(USART1, USART_IT_RXNE)//检测中断状态
就可以通过判断USART_GetITStatus是否接受到了数据
USART_ReceiveData(USART1)//接收USART数据的返回值
发送数据
USART_SendData(USART1, (u8) buffer[i++]);
同时这里还要通过USART_ GetFlagStatus判断USART发送完成没
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //循环等待,直到传输完