USART的结构:
串口接线方式例1:蓝牙模块通过USB转TTL模块接到电脑上
串口接线方式例2:STM32通过USB转TTL模块接到电脑上
安装串口调试助手:
USART常用的五个函数,以下是使用方法:
函数19:USART的初始化
USART InitTypeDef USARTInitStruct;
USARTInitStruct.USART_WordLength = USART_WordLength_xb;// 表示数据位的个数,x为数字,如8b,9b
USARTInitStruct.USART_Parity = USART_Parity_值1;/* 选择奇校验还是偶校验,值1可以是:
No (不使用校验)
Odd (偶校验)
Even(奇校验)*/
USARTInitStruct.USART_StopBits = USART_StopBits_值2;/* 停止位的个数,值2比如可以是:
0_5 (0.5位停止位)
1 (1位停止位)
1_5 (1.5位停止位)
2 (2位停止位)*/
USARTInitStruct.USART_Mode = USART_Mode_值3;/*设置传输方向,值3可以是:
USART_Mode_TX(数据发送)
USART_Mode_RX(数据接收)
USART_Mode_TX|USART_Mode_RX(既接收也发送)*/
USARTInitStruct.USART_BaudRate = 值4;/*设置波特率,值4可以是:
USARTInitStruct.USART_HardwareFlowControl = 值5;/*表示硬件流控的模式,值5可以是:
USART HardwareFlowControl RTS
USART_HardwareFlowControl_CTS
USART_HardwareFlowControL_RTS_CTS
USART HardwareFlowControl None*/
USART Init(USARTx,&USARTInitStruct),//x取数字,如USART1
函数20:USART的总开关
USART_Cmd(USARTx,值1);//x为数字,比如USART1;值1为ENABLE或DISABLE
函数21:发送数据
USART_SendData(USARTx,值1);//x为数字,如USART1;值1为要发送的数据,如0x5a
函数22:读取接收到的数据
USART_ReceiveData(USARTx);//x为数字,如USART1
此函数在使用时一般如下使用:uint8_t a = USART ReceiveData(USART1);//表示把USART1接收到的数据传给变量a
函数23:获取中断标志位的值,值为SET(1)或者RESET(0)
USART_GetFlagStatus(USARTx, 值1);/*值1可以是:
USART_FLAG TXE
USART_FLAG RXNE
USART_FLAG ORE
USART_FLAG TC
USART_FLAG PE
USART_FLAG PE
USART_FLAG FE
USART_FLAG NE
函数24:使能USART的时钟
使能USART1的时钟,要注意USART1挂在APB2外设总线上
RCC_APB2PeriphclockCmd(RCC_APB2Periph_USART1, ENABLE);
使能USART2~5的时钟,要注意USART2~5挂在APB1外设总线上
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTX, ENABLE);//x取2~5
USART的配置和使用流程:
在为USART初始化IO引脚时,要想知道IO引脚的配置参数,需要查阅中文参考手册的8.1.11节,这一节里列举了TIM定时器,USART等等外设配置IO引脚所需要的设置
以下是查询到的USART所需IO引脚配置:
常用的配置方式:
配置完成后即可收发数据
串口调试助手的设置要与USART的配置完全一致
发送数据的步骤:
接收数据的步骤:
【例程】发送单个字节,字节数组,字符,字符串
接收数字,收到数字1板载LED亮起,收到数字0板载LED熄灭
#include "stm32f10x.h"
#include <string.h>
int main(void)
{
GPIO_InitTypeDef GPIOInitStruct;
// 初始化Tx PB6 AF_PP 10MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIOInitStruct);
// 初始化Rx PB7 IPU
GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIOInitStruct);
// 重映射USART1的Tx和Rx引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO的时钟
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
// 使能USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 设置USART1的参数
USART_InitTypeDef USARTInitStruct;
USARTInitStruct.USART_BaudRate = 9600;
USARTInitStruct.USART_WordLength = USART_WordLength_8b;
USARTInitStruct.USART_StopBits = USART_StopBits_1;
USARTInitStruct.USART_Parity = USART_Parity_No;
USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USARTInitStruct);
// 闭合USART1的总开关
USART_Cmd(USART1, ENABLE);
// // 1. 等待TDR寄存器清空
// while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
//
// // 2. 写入要发送的数据
// USART_SendData(USART1, 0x5a);
//
// // 3. 等待数据发送完成
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}
// uint8_t a[] = {0,1,2,3,4,5};
// uint32_t i;
//
// for(i=0;i<sizeof(a) / sizeof(uint8_t);i++)
// {
// // 1. 等待TXE置位
// while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// // 2. 数据写入TDR
// USART_SendData(USART1, a[i]);
// }
//
// // 3. 等待数据发送完成
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// USART_SendData(USART1, 'a');
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// const char *str = "Hello world";
// uint32_t i;
// for(i=0; i<strlen(str);i++)
// {
// // 1. 等待TXE置位
// while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// // 2. TDR
// USART_SendData(USART1, str[i]);
// }
// // 3. TC置位
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIOInitStruct);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭LED
uint8_t c;
while(1)
{
// 1. RXNE
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
c = USART_ReceiveData(USART1);
if(c == '0')
{
// 熄灭
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
else if(c=='1')
{
//点亮
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
else
{
}
}
}