串口初始化IO引脚
目录
1.USART模块有哪些引脚
2.引脚分布图
3.重映射表
4.IO配置表
5.编写代码(默认PA9 PA10)
6.编写代码(重映射默认PB6 PB7)
学原理还挺枯燥的,这狗奥子不知道跑哪里耍去了
Tx是发射引脚
Rx是接收引脚
在使用串口之前,需要对这两个引脚初始化
1.USART模块有哪些引脚
下面三个目前不会使用到
2.引脚分布图
在数据手册28页,有太多引脚,而STM32F103C8T6 是LQFP48,所以只看那一行就行
主功能(复位后默认)表示如果单片机上电之后,不做任何配置,默认的引脚。
通用模式下,是通过CPU直接控制引脚
复用模式下,是将控制器交给了其他的片上外设
Tx是发射引脚
Rx是接收引脚
USARTTx和Rx引脚默认情况下是PA9 PA10,当PA9和PA10不能用的时候,这个芯片重映射给他准备了备用引脚PB6 PB7
3.重映射表
重映射表在参考手册120
USART1为例,USART1_REMAP=0不进行重映射,TX和RX就是PA9 PA10
USART1_REMAP=1进行重映射,TX和RX就是PA6 PA7
4.IO配置表
参考手册110面
一般,TX选用全双工模式推挽复用输出,RX选用全双工模式上拉输入
USARTx_RX GPIO配置可以选择浮空输入或者带上拉输入,但是最好选用带上拉输入,因为RX引脚是负责接收数据的,如果这根线意外的断开了,RX引脚就悬空了,如果选用输入上拉模式,就可以给RX引脚提供一个默认的高电压,这样就避免外接的电磁波直接输入到这个引脚里面,对这个程序的运行造成影响
全双工:表示数据传输全部都是双向的
半双工:表示数据传输虽然是双向的,但是共用一条线不能同时进行
同步:在标准的串口基础上增加了一根CK线,CK线负责在两个设备之间传输时钟信号,时钟信号就可以把这两种社保同步起来
硬件流控:在标准的串口基础上增加了CTS和RTS两个引脚,也是交叉连接
5.编写代码(默认PA9 PA10)
一般,TX选用全双工模式推挽复用输出,RX选用全双工模式上拉输入
#include "stm32f10x.h" // Device headerint main(void)
{//1.串口初始化//开启USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//定义结构体USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //双向USART_InitStruct.USART_WordLength=USART_WordLength_8b; //8数据位USART_InitStruct.USART_Parity=USART_Parity_No; //无校验位USART_InitStruct.USART_StopBits=USART_StopBits_1; //1位停止位USART_Init(USART1,&USART_InitStruct);//2.初始化IO引脚//初始化USART1引脚 TX发送 PA9 复用推挽输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//复用推挽输出GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//最大速度GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化USART1引脚 RX接收 PA10 输入上拉RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式不用设置速度GPIO_Init(GPIOA,&GPIO_InitStruct);//3.USART模块的总开关USART_Cmd(USART1,ENABLE);while (1){}
}
6.编写代码(重映射默认PB6 PB7)
一般,TX选用全双工模式推挽复用输出,RX选用全双工模式上拉输入
#include "stm32f10x.h" // Device headerint main(void)
{//1.串口初始化//开启USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//定义结构体USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //双向USART_InitStruct.USART_WordLength=USART_WordLength_8b; //8数据位USART_InitStruct.USART_Parity=USART_Parity_No; //无校验位USART_InitStruct.USART_StopBits=USART_StopBits_1; //1位停止位USART_Init(USART1,&USART_InitStruct);//2.初始化IO引脚//使用重映射 使能AFIO模块的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//GPIO_Remap_USART1=1GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;//复用推挽输出GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//最大速度GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化USART1引脚 RX接收 PA10 输入上拉RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式不用设置速度GPIO_Init(GPIOA,&GPIO_InitStruct);//3.USART模块的总开关USART_Cmd(USART1,ENABLE);while (1){}
}