STM32 USART串口通信初探 ①

概览

STM32是一款由意法半导体研发的单片机,具有不少优点:

  • 高性能
  • 低成本
  • 低功耗
  • 嵌入式

最近和几位朋友一起开发制作一款适用于模拟类游戏的通话手咪,需要使用STM32进行开发,由于需要与上位机通信,需要使用USART相关内容,在此记录下STM32程序中一些串口方面的基础内容。

USART

USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。

使用USART在遵守各类USB协议的情况下可以很方便的与计算机进行数据交换,开发各类游戏外设。

一段代码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void USART_Init(uint16_t baud)
{
GPIO_InitTypeDef GPIO_InitStructure; //三个初始化配置结构体,用于存储
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
/*时钟使能*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART的时钟
/*USART1*/
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置引脚TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置引脚RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//两个引脚存入结构体内
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZ速度模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽方式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//端口上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 基本配置 */
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校验失能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //关闭硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //两种模式
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
USART_Cmd(USART1, ENABLE); //使能USART1
/* NVIC中断配置 */
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //中断函数
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02; //中断优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //中断使能
NVIC_Init(&NVIC_InitStruct);

}

坑点记录

我并不是很熟悉单片机开发的过程,而这也是我第一次进行STM32开发,讲真,我最小系统板都是前两天刚买回来的😕。和先前用的Arduino以及树莓派不同的是,STM32这类底层的开发需要预先配置的内容还是比较多的。端口使用前必须先要打开端口的时钟才能工作,这是因为STM32设计时想让用户更好地掌握功耗。同时对于这样一个底层的系统考虑堵塞也是必要的,而在这次的开发过程中,由于没有考虑堵塞问题,一开始也导致了前面字节码没有发完,后续覆盖掉了一部分内容(寄存器内容被覆盖)👀。
以上