【微处理器系统原理与应用设计第十三讲】通用同/异步收发器USART轮询模式应用设计

USART提供两设备之间的串行双工通信,并支持中断和DMA工作。采用轮询、中断和DMA三种方式进行数据收发。

一、功能需求

实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART(串口)与用户设备(上位机)相连。上位机每次发送一个字符后等待测控设备将收到的字符回传到上位机。对于测控设备而言,提供一种回传功能,即收到一个字符就立刻发送出去。

二、设计思路

管脚PA2与PA3分别设置为USART2的TX和RX信号,在通信过程中,USART检查接受状态,一旦收到数据,立刻将新数据发送出去,如此反复执行。

三、程序设计

(1)USART初始化函数

PCLK为16MHz,波特率为9600,BRR寄存器的值为PCLK/RBaud = 1667。

cpp 复制代码
void UartInit(void)
{
	RCC->AHB1ENR|=1; //使能GPIOA时钟
	RCC->APB1ENR|=1<<17; //使能USART2时钟
	//配置PA2,PA3为复用、推挽输出、高速
	GPIOA->MODER = (GPIOA->MODER&~(0xF<<4))|(0xA<<4);
	GPIOA->OTYPER&=~(0xF<<4);
	GPIOA->OSPEEDR = (GPIOA->OSPEEDR&~(0xF<<4))|(0xA<<4);
	//设置AFRL寄存器,PA2,PA3复用模式为AF7,分别为USART的TX和RX
	GPIOA->AFR[0] = (GPIOA->AFR[0]&~(0xFF<8))|(0x77<8);
	USART2->BRR = 1667;
	USART2->CR1 = (1<<13)|(1<<3)|(1<<2); //使能收发功能
}

(2)串口数据接收函数

UartRx函数用来获取已经接收到的数据,仅当收到数据时才读取数据并成功返回,未收到返回时返回失败。

cpp 复制代码
int UartRx(char* prxd)
{
	if(!(USART2->SR&(0x1<<5)))
		return 0;
	*prxd = (char)USART2->DR; //对指针所指的变量赋值
	return 1;
}

(3)数据发送函数

UartTx函数用来发送数据,仅当发送数据寄存器空了才写入数据并成功返回,发送数据寄存器未空时返回失败。

cpp 复制代码
int UartTx(char txd)
{
	if(!(USART2->SR&(0x1<<7)))
		return 0;
	USART2-DR = txd;
	return 1;
}
相关推荐
国科安芯22 分钟前
【AS32系列MCU调试教程】SPI调试的常见问题解析
单片机·嵌入式硬件·性能优化·硬件架构·硬件工程
LS_learner1 小时前
同步(Synchronization)和互斥(Mutual Exclusion)关系
嵌入式硬件
Natsume17102 小时前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
MeshddY3 小时前
(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
c语言·数据库·单片机
m0_555762903 小时前
STM32常见外设
stm32·单片机·嵌入式硬件
森焱森3 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天3 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
天天爱吃肉82184 小时前
ZigBee通信技术全解析:从协议栈到底层实现,全方位解读物联网核心无线技术
python·嵌入式硬件·物联网·servlet
东风点点吹4 小时前
STM32F103的boot跳转APP不成功问题排除
stm32·单片机·嵌入式硬件
猫猫的小茶馆7 小时前
【STM32】预分频因子(Prescaler)和重装载值(Reload Value)
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机