STM32---UART

一、串口定义

定义:通用串行异步收发器

通用:UART的应用非常广泛,应用领域:工控行业,电力系统等

串行:处理器和外设之间只需连接一根信号线,处理器和外设数据传输是一个bit位一个bit位的传输

        切记:UART数据传输从低位开始传输

        例如:处理器给BT发送数据0x95(1001 0101)

                   最终处理器和BT之间的信号线的时序(高低电平序列):

                   高->低->高->低->高->低->低->高

                     1    0     1     0     1    0     0      1

         并行:处理器和外设之间的数据传输会连接多根数据线(8/16/32),一次可以传输多个字节

         行和并行对比:

                 传输速度:一般来说,并行要快于串行

                 抗干扰:串行优于并行

                 传输距离:串行优于并行

异步:计算机中,处理器的数据处理速度要远远快于外设的数据处理速度,势必要考虑数据同步的问题
问:何为数据同步呢?
答:处理器和外设的数据传输必须在同一个步调上保证双方数据传输无误,不能出现数据丢失现象
例如:CPU给BT外设发送1,2,CPU发送完1之后,BT只有将1接收完毕,CPU才能发送数据2

二、UART数据传输的协议

协议中相关的概念

空闲位:处理器和外设不进行数据传输时,数据线上持续发送空闲位空闲位的有效位数为一个

bit位,高电平有效

起始位:如果处理器和外设开始传输数据,首先传输起始位,有效位数为一个bt位,低电平有效

数据位:表示处理器和外设传输数据的有效位数数据位的有效位数:5/6/7/8,一般选择8位(表

示传输的数据有效位数为8个bt位)   注意:处理器和外设数据位保持一致

奇偶校验位:用于检测双方数据传输是否发送了错误,有效位数为一个bit位,如果不校验,则无

需发送校验位  注意:双方的校验方式保持一致

校验方式三种:奇校验(odd),偶校验(even),不校验(None)

        例如:处理器给BT发送数据0x95(1001 0101),采用奇校验方式

        处理器发送数据流程:

                首先处理器将0x95通过一根数据线发给bt
                然后处理器计算0x95中"1"的个数为4个,而现在采用的是奇校验,所以处理器此时心里就明白将来要发送的校验位的值为1,因为:4+1=5(奇数)

                最后处理器通过数据线再给BT发送一个校验位为1

BT接收数据的流程:

                首先BT从数据线上将处理器发送来的数据进行接收,0x95(10011010假设传输无误)

                然后BT计算0x95中"1"的个数为4,而BT也采用奇校验,所以BT心里明白待会儿处理器发送的校验位肯定是1

                最后BT从数据线上将处理器发送来的校验位1进行接收然后判断:
                        a.如果确实是1,则数据传输无误
                        b.如果是0,说明数据传输出错了

停止位:如果处理器和外设要结束数据的传输,只需发送停止位即可,有效位数为:1位或2位,有

效电平是高电平,注意:处理器和外设停止位保持一致

波特率:表示双方数据传输的速率,常用的两个波特率:115200bps/9600bps,(bps=bit per second=每秒传输多少位)        注意:双方的配置也要一致

总结:

        UART数据传输的协议流程空闲位->起始位->数据位->(校验位)->停止位->空闲位

        传输2字节或以上空闲位->起始位->低字节的8位数据->(校验位)->停止位->起始位->高字节的8位数据->(奇偶校验)->停止位.....->空闲位

三、硬件设计

四、UART控制器

发送数据流程

由于CPU核发送数据的速度,也就是向数据寄存器DR中写入数据的速度远远快于发送移位寄存器将数据一位一位的发送到TX引脚上的速度,所以首先判断TC位是否为1,如果为1表示发送数寄存器为空则CPU方可发送数据,否则采用轮询方式等待,直到发送数据寄存器为空也就是TC为1时才能发送下一个数据

如果TC为1,则CPU核软件上以指针或者采用库函数将数据放到数据寄存器DR中

发送数据寄存器的数据硬件上自动拷贝到发送移位器中

发送移位器根据给定的波特率将数据一位一位的按照UART协议发送到TX引脚上

接收数据流程

接收移位器首先根据给定的波特率将数据一位一位的按照UART协议从RX引脚上获取数据

接收移位寄存器中的数据硬件上自动拷贝到数据寄存器DR中

由于CPU核从数据寄存器DR中读取数据的速度远远快于接收移位器从RX引脚上一位一位接收数据的速度,所以当RXNE为1时,CPU核方可从数据寄存器DR中获取数据,否则CPU核轮询等待,直到数据寄存器DR中有数据也就是RXNE为1时CPU才能读取数据
如果RXNE为1,则CPU核软件上以指针或者采用库函数从数据寄存器DR中读取数据

五、函数实现

//uart.c
#ifndef _UART_H
#define _UART_H

#include "stm32f10x.h"
#include "system.h"

#define BOUND 115200 //波特率 - 串口1

extern void UART_Init(void); //串口1初始化函数
extern void UART_Putc(u8 c); //串口1发送字符函数
extern void UART_Puts(u8 *pstr); //串口1发送字符串函数
	
extern u8 UART_Getc(void);
extern void UART_Gets(u8 *buf,u32 len);

#endif
//uart.c
#include "uart.h"
#include "stdio.h"

//串口1初始化函数
void UART_Init(void){
	//配置串口1 GPIO
	GPIO_InitTypeDef GPIO_Config;
	//配置串口1控制器
	USART_InitTypeDef UART_Config;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//配置PA9引脚 - 发送 - 推挽复用
	GPIO_Config.GPIO_Pin = GPIO_Pin_9;//第9个引脚
	GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用
	GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;//最大输出速度
	GPIO_Init(GPIOA,&GPIO_Config);
	
	//配置PA10引脚 - 接收 - 浮空输入
	GPIO_Config.GPIO_Pin = GPIO_Pin_10;//第10个引脚
	GPIO_Config.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA,&GPIO_Config);
	
	//配置UART1的控制器
	UART_Config.USART_BaudRate = BOUND;//115200 - 波特率
	UART_Config.USART_WordLength = USART_WordLength_8b;//数据位8位
	UART_Config.USART_StopBits = USART_StopBits_1;//停止位1位
	UART_Config.USART_Parity = USART_Parity_No;//不校验
	UART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不采用硬件流控制
	UART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收
	USART_Init(USART1,&UART_Config);
	
	//使能串口1
	USART_Cmd(USART1,ENABLE);
	
	//对于NVIC控制器的配置
	NVIC_InitTypeDef NVIC_Config;
	NVIC_Config.NVIC_IRQChannel = USART1_IRQn;//指定串口1的中断通道
	NVIC_Config.NVIC_IRQChannelPreemptionPriority = 2;//抢占式优先级为2
	NVIC_Config.NVIC_IRQChannelSubPriority = 3;//指定响应式优先级为3
	NVIC_Config.NVIC_IRQChannelCmd = ENABLE;//打开串口1的中断通道
	NVIC_Init(&NVIC_Config);
	
	//开启串口1的接收中断功能
	//当UART1控制器接收到数据后会给CPU核发送一个中断信号
	//通知CPU核数据准备就绪,让其读取数据
	//CPU核读取结束,再回到被打断的位置继续执行
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}

//串口1发送字符函数
void UART_Putc(u8 c){
	//判断发送数据寄存器
	//有数据,轮询死等;没有数据,发送
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
	//发送数据 - 就是将c放到了发送数据寄存器中
	USART_SendData(USART1,c);
}

//串口1发送字符串函数
void UART_Puts(u8 *pstr){
	while(*pstr){
		UART_Putc(*pstr);
		pstr++;
	}
}

//接收字符函数
u8 UART_Getc(void){
	//判断接收数据寄存器是否非空
	//空 - 轮询等待 - RESET
	//非空 - 读取数据 - SET
	while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
	
	return (u8)USART_ReceiveData(USART1);
}

//接收字符串函数
//u8-char
//char buf[32];
void UART_Gets(u8 *buf,u32 len){
	int i;
	for(i=0;i<len-1;i++){
		buf[i]=UART_Getc();
		if(buf[i]=='\n')
			break;
	}
	//此时buf[i-1]='\r'
	//上位机串口工具发送过来的字符串格式-"hello\r\n"
	buf[i-1]='\0';//表示字符串的结束
}

  • 40
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32-ISO是一种特殊的STM32微控制器系列,其设计用于在噪声环境下提供高级别的电气隔离。这种电气隔离机制可以防止电感耦合、电容耦合和共模干扰等问题,从而增强系统的稳定性和可靠性。 使用零角度玩STM32-ISO,首先需要了解STM32-ISO的特点和功能。这些特点包括:双核设计、电气隔离技术、安全表面和故障保护等。双核设计使得STM32-ISO同时具备应用处理器和实时核,可以分别处理不同种类的任务,提高系统性能。电气隔离技术则确保信号在不同部分之间传输时不会相互干扰。安全表面保护系统免受未经授权的访问和攻击。故障保护机制可以防止系统在电气隔离失效时毁坏。 零角度玩STM32-ISO可以通过以下步骤实现: 1. 学习STM32-ISO的技术文档和参考手册,了解其硬件结构、内部模块和功能特性。同时要熟悉相关的开发工具和软件。 2. 了解使用STM32-ISO的典型应用场景。根据自己的需求,选择适合的开发板和模块。 3. 使用STM32CubeMX等工具进行代码生成和项目配置。根据实际应用需求,选择合适的外设模块和接口,配置GPIO、串口、定时器等功能。 4. 编写应用程序代码。使用C语言或其他支持的编程语言,结合STM32的开发库和驱动程序,实现特定的功能和算法。 5. 调试和测试应用程序。使用调试器或仿真器连接开发板,逐步调试代码并验证功能的正确性和稳定性。 6. 进一步优化和完善应用程序。根据测试结果和实际应用反馈,修复bug、改进性能或增加新功能。 通过以上步骤,我们可以全面了解STM32-ISO的特性,并在零角度上进行开发。这样能够最大限度地发挥STM32-ISO的性能优势,且保证系统的稳定性和可靠性,为特定的应用问题提供解决方案。 ### 回答2: STM32-ISO是一种基于ST Microelectronics的STM32微控制器的开发板,它专门设计用于开发与隔离有关的应用。隔离是指在电气和功能上分离电气系统的一种技术,以提高系统的安全性和可靠性。 使用STM32-ISO,可以便捷地实现对外部设备的隔离,从而保护主控器和其他关键部件免受电气干扰、过电压和过电流等问题的影响。这可以在很多应用场景中派上用场,比如工业自动化、医疗仪器、电力系统等。 要零角度玩STM32-ISO开发板,首先需要了解其硬件和软件特性。硬件方面,STM32-ISO集成了隔离电源电路和可编程逻辑电源电路,以分离主控器和外部设备。它还提供了丰富的接口,包括GPIO、I2C、SPI、UART等,方便与其他设备进行通信。 在软件方面,可以使用STM32Cube软件开发套件来编写代码。STM32Cube提供了丰富的开发工具和例程,可以帮助开发者快速上手。此外,还可以使用Keil MDK或者IAR Embedded Workbench等集成开发环境来进行开发。 零角度玩STM32-ISO可以从简单的实验开始,比如点亮LED灯。可以配置GPIO口为输出模式,并将其连接到板上的LED灯。通过编写相应的代码,可以控制LED灯的亮灭。 对于更复杂的应用,可以结合不同的外设模块,如传感器和执行器,同时进行阻隔控制和数据通信。例如,可以使用I2C接口与温度传感器进行通信,并将读取到的温度数据显示在液晶显示屏上。 总结而言,要零角度玩STM32-ISO,首先需要熟悉开发板的硬件和软件特性,然后通过简单的实验来熟悉开发流程。逐渐加深对开发板的理解,探索更多的应用场景,并结合外设进行更复杂的控制和通信操作。请开发者尝试使用STM32-ISO来实现自己感兴趣的项目,并通过不断学习和实践,进一步提高技术水平。 ### 回答3: STMicroelectronics的STM32系列是一款广泛应用于嵌入式系统的32位微控制器,具有高性能、低功耗和强大的扩展能力。而STM32-ISO则是基于STM32系列的特殊版本,能够实现隔离和保护,提供高级别的抗干扰能力和可靠性。 首先,STM32-ISO采用了进一步优化的硬件设计,以实现电气隔离,即通过在电路中添加隔离层来避免信号干扰和电气噪声的影响。这样可以确保系统在电气噪声较大的环境中仍能正常工作。 其次,STM32-ISO还配备了特殊的接口电路和通信协议,以实现与外部设备之间的隔离和保护。这些接口包括CAN总线、UART、SPI等,能够使STM32-ISO与其他设备进行安全可靠的通信。 另外,STM32-ISO还具备高级别的抗干扰能力,能够有效地抵御来自外界的电磁干扰和电气噪声。这是通过在电路设计中采用抗干扰措施和高质量的隔离材料来实现的。 最后,STM32-ISO支持丰富的软件开发工具和资源。开发者可以使用ST提供的官方开发环境和软件库来进行开发,同时还可以借助ST社区和论坛获取更多的技术支持和资源。 综上所述,STM32-ISO是一款强劲的嵌入式微控制器,通过电气隔离、接口保护、抗干扰能力以及软件开发工具的支持,能够在想要保证系统稳定性和可靠性的应用中发挥重要作用。无论在工业自动化、通信设备还是其他领域,STM32-ISO都是一个值得选择和使用的芯片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值