C语言 cortex-A7核 UART总线 实验

news2024/11/26 9:57:30

一、C

1)uart4.h

#ifndef __UART4_H__                       
#define __UART4_H__                       
                                          
#include "stm32mp1xx_rcc.h"               
#include "stm32mp1xx_gpio.h"              
#include "stm32mp1xx_uart.h"              
                                          
//PB2 ---> UART4_RX                       
//PG11 ---> UART4_TX                      
                                          
//RCC/GPIO/UART4章节初始化                
void hal_uart4_init();                    
//发送一个字符                            
void hal_put_char(const char ch);         
//发送一个字符串                          
void hal_put_string(const char* string);  
//接收一个字符                            
char hal_get_char();                      
//接收一个字符串                          
char* hal_get_string();                   
                                                                           
#endif

2)uart.c

#include "uart4.h"
extern void delay_ms(int ms);
//RCC/GPIO/UART4章节初始化
void hal_uart4_init()
{
	//RCC章节初始化
	//1.使能GPIOB组控制器  MP_AHB4ENSETR[1] = 1  0x50000A28[1]
	RCC->MP_AHB4ENSETR |= (0X1 << 1);
	//2.使能GPIOG组控制器  MP_AHB4ENSETR[6] = 1  0x50000a28[6]
	RCC->MP_AHB4ENSETR |= (0X1 << 6);
	//3.使能UART4组控制器  MP_AHB4ENSETR[11] = 1 PB2 PG11---> 0x500000A00[16] 
	RCC->MP_APB1ENSETR |= (0X1 << 16);

	//GPIO章节初始化
	//1.设置PB2引脚为复用功能模式 MODER[5:4] = 10
	GPIOB->MODER &= (~(0x1 << 4));
	GPIOB->MODER |= (0x1 << 5);
	//2.设置PB2引脚复用功能为UART4_RX功能 AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);
	//设置PG11引脚为复用功能模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0x1 << 22));
	GPIOG->MODER |= (0x1 << 23);
	//设置PG11引脚复用功能为UART4_TX功能 AFRH[15:12] = 0110
	GPIOG->AFRH &= (~(0xf << 12));
	GPIOG->AFRH |= (0x6 << 12);

	//UART4章节初始化
	//8N1 115200 使能位 代码编写逻辑
	//0.设置串口UE=0 CR1[0] = 0
	if(USART4->CR1 & (0x1 << 0))
	{
		delay_ms(500);
		USART4->CR1 &= (~(0x1 << 0));
	}
	//1.设置1位起始位,8位数据位 CR1[28][12] = 00
	USART4->CR1 &= (~(0x1 << 12));
	USART4->CR1 &= (~(0x1 << 28));
	//2.设置串口1位停止位 CR2[13:12] = 00
	USART4->CR2 &= (~(0x3 << 12));
	//3.设置串口无校验位 CR1[10] = 0
	USART4->CR1 &= (~(0x1 << 10));
	//4.设置串口16倍采样率 CR1[15] = 0
	USART4->CR1 &= (~(0x1 << 15));
	//5.设置串口不分频 PRESC[3:0] = 0000
	USART4->PRESC &= (~(0xf << 0));
	//6.设置串口波特率为115200 BRR = 0X22b
	//USART4->BRR &= (~(0xffff)); //可以不清零
	USART4->BRR |= (0x22b); //直接置0x22b // |= :按位赋值,  =  直接赋值
	//7.设置串口发送位使能 CR1[3] = 1
	USART4->CR1 |= (0x1 << 3);
	//8.设置串口接受位使能 CR1[2] = 1
	USART4->CR1 |= (0x1 << 2);
	//9.设置串口使能 CR1[0] = 1
	USART4->CR1 |= (0x1 << 0);
}
//发送一个字符
void hal_put_char(const char ch)
{
	//1.判断发送数据寄存器是否为空 ISR[7]
		//读0:发送数据寄存器满,需要等待 for while
		//读1:发送数据寄存器空,可以发送数据
	while(!(USART4->ISR & (0X1 << 7)));
	//2.将参数ch传递过来的内容,赋值给TDR寄存器
	USART4->TDR = (volatile unsigned int)ch;	
	//3.判断一帧数据是否发送完成 ISR[6]
		//读0:一帧数据没有发送完成,需要等待 for while
		//读1:一帧数据发送完成,可以发送下一帧数据
	while(!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串
void hal_put_string(const char* string)
{
	//判断字符串是否为\0
	while(*string)
	{
		//一个字符一个字符进行发送
		hal_put_char(*string++);
	}
	hal_put_char('\r');
	hal_put_char('\n');
}

//接收一个字符
char hal_get_char()
{
	char ch;
	//1.判断接收数据寄存器是否不为空 ISR[5]
	//读0:没有接收到数据,需要等待 for while
	//读1:接收到数据,可以将数据读出
	while(!(USART4->ISR & (0x1 << 5)));
	//2.将接收数据寄存器中RDR,读出来
	ch = (char)USART4->RDR;
	return ch;
}

char buffer[50] = {0};
//接收一个字符串
char* hal_get_string()
{
	int i=0;
	for(i=0;i<49;i++)
	{
		buffer[i] = hal_get_char(); //开发板接收一个字符
		hal_put_char(buffer[i]); 	//发送一个字符显示串口工具
		if(buffer[i] == '\r')
			break;
	}
	buffer[i] = '\0';
	hal_put_char('\n');
	return buffer;
}

3)main.c

#include "uart4.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{
	int i,j;

	for(i = 0; i < ms;i++)

		for (j = 0; j < 1800; j++);
}



int main()

{

	hal_uart4_init();

	hal_put_string("hello");

	while(1)

	{
		//单个字符

		//hal_put_char(hal_get_char() + 1);

		//字符串

		hal_put_string(hal_get_string());

	}
	return 0;
}

4)效果

实验一:收发字符

实验二:收发字符串

二、函数实现

1)uart4.h

2)uart.c

3)main.c

4)效果

实验一:收发字符

实验二:收发字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前缀、中缀、后缀表达式相互转换工具

目录 1. 界面一览 2. 使用说明 3. 实例演示 3.1 输入中缀 3.2 输入前缀 3.3 输入后缀 3.4 选择错误的类型 4. 代码 5. 资源地址 关于什么是前缀、中缀、后缀表达式&#xff0c;相信你不知道这个东西&#xff0c;那你也不会点进来这篇博客&#xff0c;当然&#xff0c;…

BACnet/IP协议采集网关支持modbus RTU采集

楼宇自动化在现代建筑中扮演着重要的角色&#xff0c;它可以集成和控制各种设备和系统&#xff0c;提高建筑的能效和舒适性。然而&#xff0c;不同的设备和系统通常使用不同的通信协议&#xff0c;这给楼宇自动化的实施带来了一定的挑战。为了解决这个问题&#xff0c;BACnet和…

怎样使用 NFTScan Solana API 快速创建 NFT 应用程序?

之前&#xff0c;Solana 凭借其超高的性能和低廉的费用&#xff0c;已然成为 NFT 项目最青睐的公链之一&#xff0c;众多知名 NFT 项目如 DeGods、Okay Bears、Degenerate Ape Academy 等都选择在 Solana 上发行。意味着 Solana 链上每天都会产生海量的 NFT 交易数据&#xff0…

路由器和路由到底啥区别?

在Vue中会有路由&#xff08;Route&#xff09;的概念&#xff0c;一些伙伴还不知道嘞&#xff0c;这就给大家讲解一下 我们日常出行都会碰到导航这个概念。 导航系统会给出从当前位置到目标位置的建议路径,这就是路由。 而 GPS 导航仪根据路由提供的路径,告诉我们每个路口是…

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图&#xff0c;是预先计算的环境卷积贴图&#xff0c;但这次考虑了粗糙度。因为随着粗糙度的增加&#xff0c;参与环境贴图卷积的采样向量会更分散&#xff0c;导致反射更模糊&#xff0c;所以对于卷积的每个粗糙度级别&#xff0c;我们将按顺序把模…

计算机等级考试—信息安全三级真题七

目录 一、单选题 二、填空题 三、综合题 一、单选题

SAP从入门到放弃系列之QM主检验特征

文章目录 一、概述二、系统操作2.1、创建主检验特征-QS212.1.1、初始界面2.1.2、 内容页面控制数据一般信息 2.2、主检验特征有效期管理和历史管理 一、概述 检验特征是对检验内容的描述。很多相同的产品的检验内容是由重复和相通性的&#xff0c;所以将这一类在物料的检验任务…

chalk

今天在看antd-design&#xff0c;发现一个叫chalk的东西 https://juejin.cn/post/6973102969076219941https://juejin.cn/post/6973102969076219941

算法通过村第十关-并归|黄金笔记|手撕并归排序

文章目录 前言并归排序的原理总结 前言 提示&#xff1a;有时我会担心你们发现我其实很普通。爱并不需要你与众不同。--查理麦克西《男孩、鼹鼠、狐狸和马》 并归排序算是经典的分治思想中的问题&#xff0c;这个非常典型的题目。 并归排序的原理 并归排序&#xff0c;简单来说…

预测算法6|BP_adaboost算法原理及其实现

BPNN是一种根据误差反向传播算法训练的多层前馈网络&#xff0c;具有很强的非线性处理能力&#xff0c;是目前应用最广泛的神经网络之一。但BPNN的泛化能力相对较差&#xff0c;在优化过程中易陷入局部极小值&#xff0c;同时&#xff0c;它的鲁棒性差&#xff0c;学习过程的收…

【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(1,二维连续型和离散型随机变量基本概念与性质)

文章目录 引言一、二维随机变量及分布1.1 基本概念1.2 联合分布函数的性质 二、二维离散型随机变量及分布三、多维连续型随机变量及分布3.1 基本概念3.2 二维连续型随机变量的性质 写在最后 引言 隔了好长时间没看概率论了&#xff0c;上一篇文章还是 8.29 &#xff0c;快一个…

一个人可以开发游戏吗?

在今天的数字时代&#xff0c;游戏产业已经成为全球最具活力的领域之一。从大型游戏开发工作室到独立游戏制作人&#xff0c;游戏开发已经变得更加多样化和容易进入。然而&#xff0c;对于许多梦想成为游戏开发者的人来说&#xff0c;一个关键问题一直挥之不去&#xff1a;一个…

组网行动指南:打造对跨国企业友好的专用网络环境

在全球数字化转型的浪潮下&#xff0c;越来越多的企业跨国发展业务&#xff0c;由于跨域网络的复杂性和自建网络架构的各种限制&#xff0c;导致分散在不同地理位置的站点无法实现数据互通和协作。 跨国企业组网常见痛点 痛点一&#xff1a;自建网络方案经常掉线&#xff0c;影…

No128.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

CompletableFuture-线程池运行选择

如果没有传入自定义线程池&#xff0c;都用默认线程池ForkJoinPool 传入一个线程池&#xff0c;如果你执行第一个任务时&#xff0c;传入了一个自定义线程池&#xff0c; 调用thenRun方法执行第二个任务时&#xff0c;则第二个任务和第一个任务时共用同一个线程池 调用thenRun…

26559-2021 机械式停车设备 分类

声明 本文是学习GB-T 26559-2021 机械式停车设备 分类. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了机械式停车设备的分类及有关的型式、型号和适停汽车组别、尺寸及质量。 本文件适用于 GB/T 3730.1—2001定义的乘用车及商用…

K8sGPT,基于 AI 的云原生终极工具

随着人工智能和机器学习的兴起&#xff0c;企业和组织越来越多地寻找创新方法来利用这些技术来获得竞争优势。 该领域最强大的工具之一便是 K8sGPT&#xff0c;即基于 Kubernetes 的 GPT&#xff0c;它将 Kubernetes 编排的优势与 GPT 模型的高级自然语言处理能力结合在一起。 …

人工智能AI 全栈体系(八)

第一章 神经网络是如何实现的 神经网络只是提供了一个一般性方法&#xff0c;具体用它求解什么问题&#xff0c;根据问题的特点&#xff0c;定义好输入输出以及损失函数就可以了。 在介绍神经网络语言模型结构的时候&#xff0c;每个词 w 都对应一个长度为 m 的向量 C(w)&…

深度学习(1)---卷积神经网络

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

化妆品微针贴片,全球市场总体规模,前12大厂商排名及市场份额

化妆品微针贴片全球市场总体规模 化妆品微针贴片是一种新型的美容护肤产品&#xff0c;它采用微针技术&#xff0c;将微针嵌入贴片中&#xff0c;通过将贴片贴在皮肤表面&#xff0c;使微针穿透皮肤表层&#xff0c;将活性成分输送到皮肤深层&#xff0c;从而达到美容护肤的效…