STM32F103C8T6串口发送字符串与代码详细讲解说明

本文详细介绍了STM32串口1的初始化配置过程,包括时钟开启、GPIO设置、USART初始化及NVIC配置。重点讲解了发送和接收引脚的复用推挽和浮空输入模式,并解释了发送字符串的实现原理。同时强调了波特率、校验位和停止位等参数与串口助手的匹配。
摘要由CSDN通过智能技术生成

先上代码:

#include "stm32f10x.h"                  // Device header
void Usart1_Init(uint32_t bound)
{
    /*开启USART1、GPIOA时钟USART1*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStructure);
	
	
	USART_Cmd(USART1,ENABLE); //使能USART1
	USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送溢出标志位
}
void put_s(uint8_t *s)  //发送字符串函数
{
	while(*s)
	{
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
		USART_SendData(USART1,*s);
		s++;
	}


}
int main(void)
{
	Usart1_Init(9600);  //波特率
	while (1)
	{
		put_s("桂林航天工业大学\r\n");
		put_s("我是大帅比dj\r\n");
		
	}
}

学习的时候踩过几个坑,按照我自己的理解来说一说吧。

1、因为GPIOA与USART1都属于片上外设,所以使用前必须开启相应时钟;像NVIC属于内核的,就不用开启时钟,直接定义结构体就能使用。

2、PA9和PA10分别作为串口的发送和接收端,这是固定的,中文数据手册可以查得到。要想使用PA9作为串口的发送引脚,而且它必须具有发送1和0的能力,那就要设置端口模式为复用推挽输出。否则若使用其他输出模式PA9就只能作为普通IO口使用了。同理,PA10作为接收端,只能设置为输入模式,设置成上拉输入?下拉输入?显然不行,因为不管是上拉还是下拉,只要一上电,上位机不停向单片机发送1或0了,所以我们必须设置成浮空输入,浮空输入上电后不会发送1或0。要想发送1的时候接个上拉电阻,要发送0的时候接个下拉电阻,这在单片机内部已经做好了,你只管设置成浮空输入就可以了。

3、记得使能一下USART1,这个就跟水龙头开关一样。

4、至于发送字符串,我看到网上有很多种不同的写法,我觉得我这个比较简单,我说说我自己的理解吧。总所周知,操作指针就是操作变量的地址,有时候我们不用直接操作变量,通过操作它的地址间接的操作变量,能省很多事,这就是指针。

对上面发送字符串函数中,我们首先定义一个八位的形参指针,*s可以看成一个常量,一开始它的值为第一个字符的首地址,只要没发送完字符,*s就不为0,while(*s)就一直循环,while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET)中,USART_GetFlagStatus()返回为0时,就代表此时这个字符没发送完成,就在while()里面一直循环;USART_GetFlagStatus()返回为1时,就代表此时这个字符发送完成,跳出while()循环; 然后这个函数USART_SendData(USART1,*s)是发送此时指针地址所对应的那个字符,发送完这个字符后,指针变量 s++,就挪到了下一个字符的地址,这样,重复循环,直到发送完字符串为止。发送完字符串后,s再加1,此时 *s 就为0了,则跳出while(*s),不再执行下面的语句了。

5、最后,代码的初始化配置要与串口助手的一致,比如说校验位、停止位等等,尤其是波特率!上位机和下位机一定要保持一致。

实验结果图:


 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋骗鸡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值