2021-12-13 14:03:17
初始化
GPIO_ConfAndInit(GPIOA,GPIO_Pin_9,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
GPIO_ConfAndInit(GPIOA,GPIO_Pin_10,GPIO_Mode_IN_FLOATING,GPIO_Speed_50MHz);
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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_Cmd(USART1,ENABLE);
步骤归纳:
初始化相关的Pin -> 使能外设时钟 -> 定义结构体变量 -> 结构体成员赋值 -> 初始化外设 -> 使能外设.
注意GPIO初始化后可以直接使用,类似串口这样的外设需要使用使能函数去开启.
上述代码中以USART1为例子,PA9是USART的TX端,PA10是USART的RX端.pin的模式选择很好理解,PA9因为不是做普通的IO使用,而是做USART的一部分功能,由USART去控制它,并且能够方便的使用高低电平,所以我们需要选择功能复用的推挽输出模式.输入同理.
参数整定
USART_BaudRate(波特率)
波特率是用来描述传输码元的速度的,也就是信号的调制速率,转换成比特率有固定的公式。在STM32中9600的波特率计算出来的比特率就是9600bps,也就是一秒钟传输9600个bit。常用的波特率有4800、9600、115200等。在异步串口中,只有两个相同波特率的设备才能进行正常通讯 。
USART_WordLength(字长)
数据长度,表示一次传输的实际数据长度,8b和9b可选,一般选8b。
USART_StopBits(停止位)
起始位是一帧数据起始的标志,停止位是一帧数据结束的标志,起始位固定1位。停止位0.5,1,1.5,2可选。一般设置为1.
USART_Parity(奇偶校验位)
奇偶校验是一种简单验证数据传输正确性的方式。
HardwareFlowControl(硬件流控制)
这个功能是用在RS232上,用于控制数据流收发,防止数据丢失用的。基本用不到。
USART_Mode(模式)
RX和TX两种模式,可以只选其一,很多情况下两个都开启。
发送和接收函数
在STM32F10x系列中,官方固件库给出的串口输入输出函数有如下:
//发送
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
//接收
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
从这两个函数的声明可以看出,官方的函数只提供单个字符的输入输出。具体实现查看“stm32f10x_usart.c”这个文件。
为了保证输入输出的有效性,我们可以通过USART_GetFlagStatus这个函数判断串口输入输出的状态。在发送完成和读取完毕的状态下才会退出。对于多字节的输出(例如连续输出“HELLO World”),循环输出单个字符的方式,下面给出了三个实现上述的自定义函数。
void Usart_SendByte(USART_TypeDef * pUSARTx,uint16_t ch)
{
USART_SendData(pUSARTx,ch);
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET);
}
void Usart_SendString(USART_TypeDef *pUSARTx,char *str)
{
unsigned int k=0;
do
{
Usart_SendByte(pUSARTx,*(str+k));
k++;
}while(*(str+k)!='