物联网之STM32开发三(USART串口)

本文详细介绍了STM32微控制器中USART模块的工作原理及其应用。内容涵盖串行通信的基础概念、USART寄存器的功能解析、STM32串口数据的发送与接收流程,并演示了如何使用HAL库函数实现串口通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32-USART串口的应用

内容概要:

串行通信的基本概念

串口寄存器介绍

STM32实现串口数据的收发

HAL串口库函数的使用及printf的实现

串行通信的基本概念

内容概要

通信的基本概念

USART介绍

串口的电路连接

串口的通信协议

同步通信和异步通信

通信,最少要有两个对象,一个收,一个发。

同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。

 

异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布。

串行通信和并行通信的区别

串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行。

                         -串行传输:数据按位顺序传输。                                                                  -并行传输:数据各个位同时传输。

                         -优点:占用引脚资源少                                                                                  -优点:速度快

                         -缺点:速度相对较慢                                                                                      -缺点:占用引脚资源多

单工、半双工、全双工

单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机  

半双工:可以收,可以发,但是不能同时收发, 比如对讲机  

全双工:可以在同一时刻既接收,又发送。 手机

常见通信总结

USART基本概念

通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIR ENDEC规范,以及调制解调操作(CTS/RTS)。而且,它还支持多处理器通信。

USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式

串口电路连接

STM32f051串口:STM32F051内置多达两个通用同步 / 异步收发器( USART1 和 USART2 ),通信速度可达 6 Mbit / s

串口通信协议介绍

波特率

 在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。

国际上规定一个标准的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……

例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信

注意:实际的数据没这么多,还包括起始位,结束位,校验位

STM32 USART寄存器介绍

内容概要

控制寄存器——USART_CR  

状态寄存器——USART_SR  

数据寄存器——USART_DR  

波特率寄存器——USART_BRR

串口寄存器-USART_CR1

串口寄存器-USART_CR2

                                                         

串口寄存器-USART_BRR

串口寄存器-USART_ISR

串口数据的发送和接收

串口寄存器-USART_TDR

串口寄存器-USART_RDR

STM32实现串口数据的收发

内容概要

串口硬件原理图

CubeMX中串口的配置

串口发送一个字符

串口接收一个字符

串口硬件原理图

注意:如果无法识别串口,清装好ch340串口驱动

CubeMX中串口的配置

串口数据的发送和接收

串口发送一个字符

void  Uart_Putchar(uint8_t ch)
{
	while(!(USART1->ISR &(1<<7)));   //等待发送寄存器空
	USART1->TDR = ch;       //发送字符
}

void Uart_Putstring(uint8_t  *str)	
{
	while(*str != '\0')
	{
		Uart_Putchar(*str);		
		str++;
	}
}

串口接收一个字符

uint8_t Uart_Getchar(void)
{
	while(!(USART1->ISR & (1<<5)));  //等待收到一个字符的数据
	
	return  USART1->RDR;    //返回收到的字符
}

HAL串口库函数的使用及printf的实现

HAL库中串口的收发函数

Stm32f0xx_hal_uart.c  文件中

串口的发送函数

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

串口的接收函数

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

printf()实现串口重定向

​​printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。

int fputc(int ch,FILE *f){	
    while((USART1->ISR&(1<<7)) == 0);	
    USART1->TDR=(uint8_t)ch;
    return ch;
} 

 

<think>我们正在处理一个关于8051单片机UART中断服务程序语法的问题。用户提供的代码片段是:`void Uart1_Isr() interrupt 4 using 2`,要求解释其语法。 根据引用[4]:`__interrupt void P0_ISR(void)` 在IAR编译器里用关键字`__interrupt`来定义一个中断函数。用`#pragma vector`来提供中断函数的入口地址。但是,用户提供的语法是Keil C51编译器特有的。 在Keil C51中,中断函数的声明格式为: ``` void function_name() interrupt interrupt_number [using register_bank] ``` 其中: - `interrupt` 是关键字,表明这是一个中断服务程序。 - `interrupt_number` 是一个0-31的整数,表示中断源。对于UART1中断,在8051中,中断号4对应串行口中断(UART0,但通常称为UART1?注意:标准8051只有一个串口,所以中断号4就是串口中断。在一些增强型51中,可能有多个串口,但中断号4通常还是分配给第一个串口)。 - `using register_bank` 是可选的,指定使用的工作寄存器组(0-3)。这里使用的是寄存器组2(using 2)。 因此,对于用户提供的代码: `void Uart1_Isr() interrupt 4 using 2` 解释如下: - `Uart1_Isr`:中断服务函数的名称。 - `interrupt 4`:表示这个函数是处理中断号为4的中断,即串行口中断(通常指UART0,但在一些单片机中可能标记为UART1,具体取决于芯片,但中断号4是标准8051串口中断)。 - `using 2`:表示该中断服务程序使用第2组工作寄存器(R0-R7)。这样可以在中断发生时,避免保存和恢复原来的寄存器组,从而减少中断响应时间。 关于中断服务程序的一些注意事项: 1. 中断函数不能有参数,也不能有返回值。 2. 在中断服务程序中,应尽量保持代码简短,避免长时间占用中断。 3. 使用`using`关键字可以指定不同的寄存器组,从而避免保存和恢复寄存器状态,提高中断响应速度。但是,使用不同的寄存器组时,需要注意主程序和中断程序之间的数据传递(通常通过全局变量)。 另外,参考引用[3]中的串口处理函数,用户之前可能已经接触过串口发送和接收的代码。在串口中断服务程序中,通常需要检查中断标志位(TI和RI)来确定是发送中断还是接收中断,并相应地处理。 例如,一个典型的串口中断服务程序可能如下: ```c void Uart1_Isr() interrupt 4 using 2 { if (RI) { RI = 0; // 清除接收中断标志 // 处理接收到的数据,通常是将数据存入缓冲区 } if (TI) { TI = 0; // 清除发送中断标志 // 处理发送,例如从发送缓冲区取下一个字节发送 } } ``` 注意:在8051中,串口中断(中断号4)同时对应发送和接收。因此,在中断服务程序中需要判断是发送中断(TI置位)还是接收中断(RI置位),并分别处理。 总结:用户提供的代码行声明了一个串口中断服务函数,使用中断号4和寄存器组2。在函数内部,需要编写处理串口中断的代码,包括清除中断标志和进行数据收发操作。 现在,根据要求,生成相关问题。</think>### UART中断服务程序语法解释 在8051单片机中,`void Uart1_Isr() interrupt 4 using 2` 的语法结构解析如下: 1. **函数声明** `void Uart1_Isr()` - `void`: 表示中断函数无返回值 - `Uart1_Isr`: 自定义的中断服务程序名称 2. **中断关键字** `interrupt 4` - `interrupt`: 声明该函数为中断服务程序(ISR) - `4`: 指定中断源编号(8051中4号中断对应UART串口中断) 3. **寄存器组选择** `using 2` - 指定使用第2组工作寄存器(R0-R7) - 避免中断与主程序寄存器冲突,提高响应速度[^4] ### 典型UART中断处理流程 ```c void Uart1_Isr() interrupt 4 using 2 { if (RI) { // 接收中断标志检查 RI = 0; // 清除接收标志 // 处理接收数据(如存入缓冲区) } if (TI) { // 发送中断标志检查 TI = 0; // 清除发送标志 // 处理后续数据发送 } } ``` ### 关键机制说明 1. **中断触发条件** - 接收中断:当数据存入SBUF寄存器时,硬件置位`RI`标志[^1] - 发送中断:当SBUF数据发送完毕时,硬件置位`TI`标志[^3] 2. **标志位处理** - 必须手动清除`TI`/`RI`标志(如`TI=0;`),否则会持续触发中断 - 清除操作应在中断服务程序内完成[^2] 3. **寄存器组选择优势** - 使用`using 2`可避免保存/恢复8个寄存器(约16个时钟周期) - 特别适用于实时性要求高的场景[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值