(10)USART串口通信—基于铁头山羊的STM32标准库教程

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
		{
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值