【STM32】入门(五):串口TTL、RS232、RS485

【STM32】STM32单片机总目录

1、简述

1.1 电平

TTL :全双工 ,逻辑0对应0V,逻辑1对应3.3V或者5V,一般从单片机引脚直接引出,电平3.3或5V是与IO电平兼容;

RS232:全双工,逻辑0对应+3V至+15V,逻辑1对应-15V至-3V ,TTL经过电平转换芯片后可以输出RS232。

RS485:半双工,逻辑0对应-6V至-2V,逻辑1对应+2V至+6V,这里的电平指AB两线间的电压差,即差分方式传输,因此可以长距离传输

1.2 连接方式

除了电压不同,连接方式有所区别:

TTL、RS232只能一对一连接;
RS-485在总线上是允许连接多达128个收发器。

RS232常用DB9头的定义:
在这里插入图片描述

1.3 传输协议

一帧数据包由起始位、有效数据、校验位以及停止位组成。
在这里插入图片描述
协议参数有:波特率(9600、115200等)、有效数据长度(5~8)、校验(奇、偶、0、1、无)

2、手册

2.1 功能框图

在这里插入图片描述

2.2 中断控制

在这里插入图片描述

2.3 模式配置

在这里插入图片描述

2.4 寄存器映射

在这里插入图片描述

3、代码

3.1 初始化

  • 使能GPIO时钟:RCC_AHB1PeriphClockCmd
  • 使能UART时钟:RCC_APB2PeriphClockCmd
  • GPIO引脚复用为UART:GPIO_PinAFConfig
  • GPIO配置:GPIO_InitStructure、GPIO_Init
  • UART配置:USART_InitStructure、USART_Init
  • 中断配置;NVIC_InitStructure、NVIC_Init
void uart1_init(u32 bound)
{   
  	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	#a)使能时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 
	
	#b)引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	#c)GPIO配置
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;	//GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;      		//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 			//推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   			//上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);         	 		//初始化PA9,PA10
   
   	#d)UART配置
	USART_InitStructure.USART_BaudRate = bound;					//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;  	//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;			//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
  	USART_Init(USART1, &USART_InitStructure); 					//初始化串口1	
  	USART_Cmd(USART1, ENABLE);  								//使能串口1 
	USART_ClearFlag(USART1, USART_FLAG_TC);
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);				//开启相关中断
	
	#e)中断配置
  	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;      	//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;	//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		 	//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);
}

3.2 发送

发送一个字符:版本1

void uart1SendChar(u8 ch)
{      
	while((USART1->SR&0x40)==0);  
    USART1->DR = (u8) ch;      
}

发送一个字符:版本2

void uart1SendChar(uint8_t ch)
{
	#a) 等待发送数据寄存器为空 
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	
	
	USART_SendData(USART1,ch)}

发送数组

void Usart1SendArray(uint8_t *array, uint16_t num)
{
  	uint16_t i;
	
	#a)循环发送每个字符
	for(i=0; i<num; i++)
  	{
  		uart1SendChar(array[i]);
  	}
  	
  	#b)等待发送完成
  	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}

USART_FLAG_TXEUSART_FLAG_TC的详细说明

USART_FLAG_TXE:发送缓冲区空标志,说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。
USART_FLAG_TC:发送完成标志,这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。

这两个标志的区别在于,它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。

TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。
TC  表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。

所以,判定数据最终发送完成的标志是 TC,而不是 TXE.

3.3 接收

查询中断向量表,在代码文件startup_stm32f10x_hd.s中:
串口1USART1对应到中断函数为USART1_IRQHandler
对应上面的中断控制配置:NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

__Vectors       DCD     __initial_sp               ; Top of Stack
...
                DCD     USART1_IRQHandler          ; USART1
...

重载中断函数 USART1_IRQHandler,实现一个回显功能,即接收啥,发送啥

void USART1_IRQHandler(void)  
{
  	uint8_t ucTemp;
	if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
	{		
		ucTemp = USART_ReceiveData(USART1);
    	USART_SendData(USART1, ucTemp);  
    } 
} 
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

郭老二

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

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

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

打赏作者

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

抵扣说明:

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

余额充值