【ARM】Day6 cotex-A7核UART总线实验

news2024/9/20 3:10:24

cotex-A7核UART总线实验

1. 键盘输入一个字符‘a’,串口工具显示‘b’

2. 键盘输入一个字符串"nihao",串口工具显示“nihao”

uart.h

#ifndef __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"

//RCC/GPIO/UART4章节初始化
void hal_uart4_init();

void hal_put_char(const char str); 			//发送一个字符
void hal_put_string(const char* string); 	//发送一个字符串
char hal_get_char(); 						//接收一个字符
char* hal_get_string(); 					//接收一个字符串

#endif

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
	//2. 使能GPIOG组控制器,MP_AHB4ENSETR[6] = 1
	//3. 使能UART4组控制器,MP_APB1ENSETR[16] = 1
	RCC->MP_AHB4ENSETR |= (0x1<<1);  	//GPIOB使能
	RCC->MP_AHB4ENSETR |= (0x1<<6); 	//GPIOG使能
	RCC->MP_APB1ENSETR |= (0x1<<16); 	//UART4使能

//GPIO章节初始化: 
	//1.设置PB2引脚为复用功能 MODER[5:4] = 10
	//2.设置PB2复用功能为UART4_RX, AFRL[11:8]=1000	
	GPIOB->MODER &= (~(0x3<<4)) ; //复用
	GPIOB->MODER |= (0x1<<5);
	GPIOB->AFRL &= (~(0xf<<8));
	GPIOB->AFRL |= (0x1<<11);

	//1.设置PG11引脚为复用功能 MODER[23:22] = 10	
	//2.设置PG11复用功能为UART4_TX.AFRH[15:12]=0110
	GPIOG->MODER &= (~(0x3<<22));
	GPIOG->MODER |= (0X1<<23);
	GPIOG->AFRH &= (~(0xf<<12));
	GPIOG->AFRH |= (0x3<<13);


//UART4章节初始化:8N1  115200 使能
	//0.设置UE=0, CR1[1] = 0
	if(USART4->CR1 & (0x1))
	{
		delay_ms(1000);
		USART4->CR1 &= (~0x1);
	}
	//1.设置UART4串口1位起始位,8位数据位 CR1[28][12] = 00
	USART4->CR1 &= (~(0x1<<28));
	USART4->CR1 &= (~(0x1<<12));
	//2.设置UART4串口没有校验位 CR1[10] = 0
	USART4->CR1 &= (~(0x1<<10));
	//3.设置UART4串口1位停止位 CR2[13:12] = 00
	USART4->CR2 &= (~(0x3<<12));
	//4.设置UART4串口16倍采样率 CR1[15] = 0
	USART4->CR1 &= (~(0x1<<15));
	//5.设置UART4串口不分频 PRESC[3:0] = 0000
	USART4->PRESC &= (~0xF);
	//6.设置UART4串口波特率为115200, BRR = 0x22B
	USART4->BRR |= 0x22B;
	//7.设置UART4串口发送器使能 CR1[3] = 1
	USART4->CR1 |= (0x1<<3);
	//8.设置UART4串口接收器使能 CR1[2] =1
	USART4->CR1 |= (0x1<<2);
	//9.设置UART4串口使能 CR1[0] = 1
	USART4->CR1 |= (0x1);

}

void hal_put_char(const char str)	//发送一个字符
{
	//1.判断发送数据寄存器是否为空 ISR[7]
		//读0:发送数据寄存器满,需要等待
		//读1:发送数据寄存器不满,可以发送数据
	while(!(USART4->ISR & (0x1<<7)));
	//2.将要发送的数据,赋值给发送数据寄存器中
	USART4->TDR = str;
	//3.判断一帧数据是否发送完成 ISR[6] = 1
	while(!(USART4->ISR & (0x1<<6)));
}


void hal_put_string(const char* string)   //发送一个字符串
{
	//判断是否为'\0',字符串结束标志
	//一个一个字符进行发送
	while(*string)
	{
		hal_put_char(*string++);
	}
	hal_put_char('\n');  	//换行
	hal_put_char('\r'); 	//回到行首
}


char hal_get_char() 	//接收一个字符
{
	//判断接收数据寄存器中,是否接收到数据 ISR[5]=1,接收到数据,可以读
	while(!(USART4->ISR & (0x1<<5)));

	//将接收数据寄存器中内容,读出来
	return USART4->RDR;
}

char buf[50]={0};
char* hal_get_string() 	//接收一个字符串
{
	int i;
	for(i=0;i<49;i++)
	{
		buf[i]=hal_get_char();  //接收一个字符
		hal_put_char(buf[i]);   //发送一个字符,回显到串口工具
		if(buf[i] == '\r')  	//当enter按键按下时
		{
			break;
		}
	}
	buf[i] = '\0';
	hal_put_char('\n');

	return buf;
}

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(); //初始化
	while(1)
	{
		//hal_put_char(hal_get_char()+1);
		hal_put_string(hal_get_string());

	}
	return 0;
}

运行结果1:

 运行结果2:

 

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

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

相关文章

安卓系列机型-禁止安装某软件 防止“沉迷游戏的小孩”操作解析

如何禁止安装某软件。这里以好课帮app为例做个演示步骤说明。这个博文的目的在于可以阻止他人用手机安装你指定的一些软件。 &#x1f494;&#x1f494;&#x1f494;首先手机上安装好课帮这个软件。打开应用详情找到包名。或者使用第三方工具打开获取这个软件的包名。记住是…

Unity 物体固定屏幕尺寸(透视模式)

物体固定屏幕尺寸 &#x1f96a;效果图&#x1f371;食用方法 &#x1f96a;效果图 如图所示物体远离摄像机后会被放大&#xff0c;靠近相机会被缩小&#xff0c;使得在屏幕上的大小保持不变&#xff1b; &#x1f371;食用方法 导入插件后使用gameObject.SetFixedScreenSi…

c#中lambda表达式缩写推演

Del<string> ml new Del<string>(Notify);//泛型委托的实例化&#xff0c;并关联Nofity方法 Del<string> ml new Del<string>(delegate (string str) { return str.Length; });//将Nofity变更为匿名函数 Del<string> ml delegate(string str)…

15.树与二叉树基础

目录 一. 树&#xff0c;基本术语 二. 二叉树 &#xff08;1&#xff09;二叉树 &#xff08;2&#xff09;满二叉树 &#xff08;3&#xff09;完全二叉树 三. 二叉树的性质 四. 二叉树的存储结构 &#xff08;1&#xff09;顺序存储结构 &#xff08;2&#xff09;链…

港联证券|燃气板块午后走高,美能能源涨停,水发燃气大幅拉升

燃气板块21日午后快速拉升&#xff0c;到发稿&#xff0c;美能动力涨停&#xff0c;水发燃气涨超7%&#xff0c;蓝天燃气涨超5%&#xff0c;贵州燃气涨逾4%。 消息面上&#xff0c;受澳大利亚LNG工厂罢工忧虑影响&#xff0c;欧洲基准天然气价格一度大涨18%。 有报导称&#x…

音视频技术开发周刊 | 307

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 “视象新生”火山引擎视频云&AIGC技术大会邀你踏入新“视界” 8月22日&#xff0c;火山引擎视频云&AIGC技术大会即将开启&#xff01;本次大会以“视象新生”为主…

lvs-dr模式+keepalived

一&#xff0c;keepalived概述 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器&am…

如何创建和销售在线健身业务

快速轻松地创建您自己的线上健身网站&#xff01; 越来越多的人在家健身&#xff0c;在线健身业务也随之快速增长。 虽然这个生意很红火&#xff0c;但是真的像看起来那么容易上手吗&#xff1f; 有了MemberPress&#xff0c;确实如此&#xff01; 在这篇文章中&#xff0c…

【李宏毅机器学习】注意力机制

输出 我们会遇到不同的任务&#xff0c;针对输出的不一样&#xff0c;我们对任务进行划分 给多少输出多少 给一堆向量&#xff0c;输出一个label&#xff0c;比如说情感分析 还有一种任务是由机器决定的要输出多少个label&#xff0c;seq2seq的任务就是这种&#xff0c;翻译也…

Vue.js知识点学习的一点笔记

一、虚拟DOM 1、原生JS是命令式编程&#xff0c;当渲染在页面的数据发生一点点变化&#xff0c;需要整个重新渲染一编。vue.js渐进式框架有个虚拟DOM的概念&#xff0c;运用diff算法&#xff0c;比较新旧数据&#xff0c;相同的数据不变不重渲染&#xff0c;不同的部分新数据…

CAD VCL Multiplatform Crack

CAD VCL Multiplatform Crack CAD VCL多平台是在Delphi和CBuilder中开发应用程序的一个组件。它允许创建、可视化、导入、导出、转换和打印图形。开发人员可以访问实体的属性。CAD VCL多平台支持大量矢量和3D格式&#xff0c;包括AutoCAD DWG/DXF、HPGL、STEP、IGES、STL、SVG、…

Excel带数值的计算公式

问题描述 如图&#xff0c;想实现在第三列单元格中实现带数值的计算表达式 解决方法 单元格 & "/" & 单元格 & "" & TEXT(单元格/单元格, "0.00%")& 为简单的 与 符号 最后设定单元格数值与格式&#xff08;保留两位小数…

[Mac软件]AutoCAD 2024 for Mac(cad2024) v2024.3.61.182中文版支持M1/M2/intel

下载地址&#xff1a;前往黑果魏叔官网 AutoCAD是一款计算机辅助设计&#xff08;CAD&#xff09;软件&#xff0c;目前已经成为全球最受欢迎的CAD软件之一。它可以在二维和三维空间中创建精确的技术绘图&#xff0c;并且可以应用于各种行业&#xff0c;如建筑、土木工程、机械…

天锐绿盾安全U盘系统

安全U盘系统 01 简介 天锐绿盾安全U盘系统&#xff0c;是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等&#xff0c;天锐绿盾安全U盘系统为您U盘的数据保驾护航&#xff0…

2023年京东儿童智能手表行业数据分析(京东销售数据分析)

儿童消费市场向来火爆&#xff0c;儿童智能手表作为能够实现定位导航&#xff0c;信息通讯&#xff0c;SOS求救&#xff0c;远程监听&#xff0c;智能防丢等多功能的智能可穿戴设备&#xff0c;能够通过较为精准的定位功能和安全防护能力保障儿童的安全&#xff0c;因而广受消费…

子集-回溯方法

class Solution {//题解思路//LinkedList<Integer> path new LinkedList<>(); List<List<Integer>> results new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {//主方法中调用方法同时传入指定的参数初始值bac…

酷开科技大屏营销,锁定目标人群助力营销投放

近日&#xff0c;中科网联发布《2023年中国家庭大屏白皮书》&#xff0c;数据显示智能电视近三年内使用人群增长平稳。全国4.94亿家庭户中&#xff0c;智能大屏渗透率近九成。不仅如此&#xff0c; CCData研究预测&#xff0c;2025年中国智能电视渗透率将达到95%以上。这与三年…

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构&#xff0c;以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架&#xff0c;它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础&#xff0c;架构原理可以分为以下四个部分&#xff1a;JobManager、TaskM…

华为云Stack的学习(一)

一、华为云Stack架构 1.HCS 物理分散、逻辑统一、业务驱动、运管协同、业务感知 2.华为云Stack的特点 可靠性 包括整体可靠性、数据可靠性和单一设备可靠性。通过云平台的分布式架构&#xff0c;从整体系统上提高可靠性&#xff0c;降低系统对单设备可靠性的要求。 可用性…

Shell编程及自动化运维实现

Linux Shell编程及自动化运维实现 变量 Linux Shell编程及自动化运维实现 判断 Linux Shell编程及自动化运维实现 循环 Linux Shell编程及自动化运维实现 数组和函数 Linux Shell编程及自动化运维实现 三剑客 Linux Shell编程及自动化运维实现 综合实战 什么是…