开时钟
1.首先确定要用usart1去收发数据,那么我们先找到他挂在哪个总线上
确定他在apb2上,然后要看usart1的TX,RX在哪个引脚上相连,这些引脚属于哪个GPIO,因为
USART 内部 TX 移位寄存器 → 片内复用选择器 → GPIO 引脚 → 外部硬件
外部电平 → GPIO 引脚 → 复用选择器 → USART 内部 RX 接收移位寄存器
我们由图已知,tx与p9相连,rx与p10相连,
2.所以我们接下来要把p9与p10进行初始化
例:创建一个名叫 S1 的结构体变量,专门存 USART1 要用的 GPIO 配置信息。GPIO_InitTypeDef S1
然后引用这个创建的S1,对引脚的功能模式,输出类型,,配置引脚进行完善
S1.GPIO_Mode=GPIO_Mode_AF;S1.GPIO_OType=GPIO_OType_PP;S1.GPIO_Pin=GPIO_Pin_9;GPIO_Init(GPIOA,&S1);然后同理对p10进行初始化
3.现在只是对引脚进行初始化,我们要让对应的引脚与对应的tx,rx相接,我们用函数
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);第一个参数 GPIOA:操作 A 端口
第二个 GPIO_PinSource9:针对第 9 号引脚
第三个 GPIO_AF_USART1:把这个引脚的复用通道,绑定给 USART1 外设
p10同理
4.配置串口
USART_InitTypeDef S3;S3.USART_BaudRate=115200;//波特率S3.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控S3.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式S3.USART_Parity=USART_Parity_No;//校验S3.USART_StopBits=USART_StopBits_1;S3.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&S3);5.串口向pc发数据
分为两种方式:printf重定向,senddata函数
printf重定向:`int fputc(int ch,FILE *f)
{
while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )==0); USART_SendData(USART1,ch);}`
``
printf 底层会循环调用 fputc 输出单个字符,改写这个函数就能把打印内容转到串口。USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )==0)用来判断状态寄存器中的TXE的值从而判断发送寄存器是否为空,USART_SendData(USART1,ch);标准库中有,不用自己写
sendstring函数
`
void SendString(char * string)
{
while(*string != '\0'){ while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )==0); USART_SendData(USART1,*string ++); }}
6.主函数中写接收数据 用while循环(别的也可以,此文章以本人代码为例) 其中你首先要判断接收寄存器中是否为空,如果不为空那你就一个一个读出来,这里可增加如果内容为open就打出open(涉及字符串相比) 