ARM_cortex-A7核UART总线

news2024/11/25 2:02:45

实验一:键盘输入一个字符'a',串口工具显示'b‘

实验二:实现现象:键盘输入一个字符串,串口工具回显输入的字符串

uart4.h 

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化相关操作
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

uart4.h

#include "uart4.h"

//初始化相关操作
void hal_uart4_init()
{
	/*********RCC章节初始化***************/
	//RCC寄存器使能GPIOG组控制器[6] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 6);

	//RCC寄存器使能GPIOB组控制器 [1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	
	//RCC寄存器使能UART4组寄存器 [16] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 16);


	/*******GPIO章节初始化**************/

	//1、设置PB2引脚为复用功能模式
	//GPIOB_MODER寄存器初始化-->[5:4] = 10 复用功能模式
	GPIOB->MODER &= (~(0x3 << 4));
	GPIOB->MODER |= (0x1 << 5);

	//2、设置PB2引脚复用功能为UART4_RX	AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);

	//1、设置PG11引脚为复用功能模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0x3 << 22));
	GPIOG->MODER |= (0x1 << 23);

	//2、设置PG11引脚复用功能为 UART4_TX AFRH[15:12] = 0110
	//GPIOG_AFRH寄存器设置 PG11 引脚复用功能为UART4_TX [15:12] = 0110
	GPIOG->AFRH &= (~(0xf << 12));
	GPIOG->AFRH |= (0x3 << 13);


	/**********UART4章节初始化*********/
	//0、设置串口UE= 0
	USART4->CR1 &= (~(0x1 << 0));

	//1、设置1位的起始位,8位的数据位 M[1:0] = 00 28:M1 12:M0
	USART4->CR1 &= (~(0x1) << 12);
	USART4->CR1 &= (~(0x1) << 28);
	
	//2、没有奇偶校验位 CR[10] = 0
	USART4->CR1 &= (~(0x1 << 10));

	//3、设置1位的停止位 CR2[13: 12] = 00
	USART4->CR2 &= (~(0x3 << 12));

	//4、设置16倍采样率 CR1[15] = 0
	USART4->CR1 &=(~(0x1 << 15));

	//5、设置串口不分频  PRESC = 0000
	USART4->PRESC &= (~(0xf << 0));

	//6、设置串口波特率 为115200 BRR = 0x22b
	USART4->BRR &= (~(0xffff));
	USART4->BRR |= 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 str)
{
	//1、判断发送数据寄存器是否为空
	//特点:为空可以发送下一位的数据,为满需要等待
	//读0:满-->等待  读1:空-->发送数据
	while(!(USART4->ISR & (0x1 << 7)));
	
	//2、将发送的内容,赋值给发送数据寄存器
	USART4->TDR = str;

	//3、判断一帧数据是否发送完成  ISR[6]
	//读0:没有发送完成-->等待  读1:发送完成
	while(!(USART4->ISR & (0x1 << 6)));
}

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

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

	//2、将接收数据寄存器中的内容读出来
	char str = USART4->RDR;
	return str;

}


//接收一个字符串
char* hal_get_string()
{
	//循环进行接收
	//当键盘回车键按下之后,代表字符串输入完成-->'\r'
	static char string[32];
	char ch;
	int i=0;
	while(1)
	{
		ch = hal_get_char();
		if('\r' == ch)
		{
			break;
		}

		string[i++] = ch;
		if(i >= 31)
		{
			break;
		}

	}
	string[i] = '\0';  //字符串末尾赋 '\0'
	return string;

}

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(); //初始化

	char str;
	int i;
	while(1)
	{

		/*
		   char str = hal_get_char() + 1; //接收单个字符,并加1
 
 		   hal_put_char(str);    //发送单个字符
	    */

	char temp[32] = "";

	hal_put_char('\r'); //首字符输入
	while(1)
	{

		str = hal_get_char();   //接收单个字符
		hal_put_char(str);     //发送单个字符

		if('\r' == str)    //输入为回车时,跳出循环
		{
			break;
		}

			temp[i++] = str;   //存入字符串
		}

		hal_put_char('\n');	//换行

		//char *ptr = hal_get_string();

		hal_put_string(temp); //回显
		hal_put_char('\n');	  //换行

		i = 0;

	}

	return 0;
}

 实验一:

实验二:

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

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

相关文章

vue+relation-graph绘制关系图实用组件

先在终端执行命令 vue create relationgraph创建一个vue2的项目 然后在编辑器中打开新创建的项目 在终端中执行命令 npm install relation-graph --save引入依赖 这样 我们relation-graph就进来了 然后 我们在需要使用的组件中编写代码如下 <template><div>&…

【HTML5+Springboot】农产品质量溯源大数据管理系统源码

一、前言 1.技术框架说明 开发工具&#xff1a;idea或eclipse前端框架&#xff1a;easyui &#xff0c;开发语言&#xff1a;java后端框架&#xff1a;spring bootmybatismysql数 据 库&#xff1a;mysql移 动 端&#xff1a;h5(扫码溯源)技术架构&#xff1a;spring bootmyb…

React Dva项目引入antd UI框架

上文 React 搭建DvaJS开发环境中我们大家了一个Dva的开发环境 那么 下面 我们就用dva项目引入一下antd 我们平时做react开发 主要也都会选择它 我们直接在项目终端执行 npm install antd^4.24.2 babel-plugin-import --save这样 我们的依赖包就进来了 babel-plugin-import是…

【精致的美少女-InsCode Stable Diffusion 美图活动一期】

&#x1f4a7; 【精致的美少女 − I n s C o d e S t a b l e D i f f u s i o n 美图活动一期】 \color{#FF1493}{【精致的美少女-InsCode Stable Diffusion 美图活动一期】} 【精致的美少女−InsCodeStableDiffusion美图活动一期】&#x1f4a7; &#x1f337; 仰望…

青岛大学_王卓老师【数据结构与算法】Week04_07_双向链表的删除_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

Standalone是什么?Standalone集群的三类进程

Standalone是什么 Standalone模式是Spark自带的一种集群模式&#xff0c;不同于前面本地模式启动多个进程来模拟集群的环境&#xff0c;Standalone模式是真实地在多个机器之间搭建Spark集群的环境&#xff0c;完全可以利用该模式搭建多机器集群&#xff0c;用于实际的大数据处…

面向订单交付的ETO项目管理数字化解决方案︱高远科技PMO副总经理董方好

北京高远华信科技有限公司PMO副总经理董方好先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;面向订单交付的ETO项目管理数字化解决方案。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 订单…

机器学习洞察 | JAX,机器学习领域的“新面孔”

在之前的《机器学习洞察》系列文章中&#xff0c;我们分别针对于多模态机器学习和分布式训练、无服务器推理进行了解读&#xff0c;本文将为您重点介绍 JAX 的发展并剖析其演变和动机。下面&#xff0c;就让我们来认识一下 JAX 这一新崛起的深度学习框架—— 亚马逊云科技开发…

threejs课程笔记-20 向量点乘、叉乘

向量点乘dot 点乘是向量的一种运算规则&#xff0c;点乘也有其它称呼&#xff0c;比如点积、数量积、标量积。 threejs三维向量Vector3封装了一个点乘相关的方法.dot()&#xff0c;本节课主要目的就是让大家能够灵活应用点乘方法.dot() 已知向量a和向量b 已知两个向量a和b&…

设计模式3:单例模式:静态内部类模式是怎么保证单例且线程安全的?

上篇文章&#xff1a;设计模式3&#xff1a;单例模式&#xff1a;静态内部类单例模式简单测试了静态内部类单例模式&#xff0c;确实只生成了一个实例。我们继续深入理解。 静态变量什么时候被初始化&#xff1f; public class Manager {private static class ManagerHolder …

探索 Jetson Nano 为 myCobot 280 机械臂提供的强大功能

探索 Jetson Nano 为 myCobot 280 提供的强大功能&#xff0c;机器人技术的一个有前途的组合 介绍 近年来&#xff0c;科学技术的发展给我们的生活带来了许多新的产品和服务&#xff0c;包括机器人在各个领域的集成。机器人已经成为我们生活中必不可少的一部分&#xff0c;从…

C语言求鸡兔同笼问题案例讲解

前言&#xff1a; 作者本人在今年4月份参加了一个C语言考试&#xff0c;编程大题里有一道鸡兔同笼问题&#xff1b;本来以为简简单单&#xff0c;几分钟搞定&#xff0c;拿个满分&#xff1b;结果翻车了&#xff0c;因为我在考场的时候想着&#xff0c;母鸡到底有几只脚呢&…

FlinkCDC第二部分-搭建Flink单机服务,ctrl就完事~

Flink版本&#xff1a;1.16 环境&#xff1a;Linux CentOS 7.0、jdk1.8 基础文件&#xff1a;flink-1.16.2-bin-scala_2.12.tgz、flink-connector-jdbc-3.0.0-1.16.jar、flink-sql-connector-mysql-cdc-2.3.0.jar 1. 在目录/home/flink下解压flink-1.16.2-bin-scala_2.12.tg…

基于 R 对卫星图像进行无监督 kMeans 分类

一、前言 本文将向您展示如何使用 R 对卫星图像执行非常基本的 kMeans 无监督分类。我们将在 Sentinel-2 图像的一小部分上执行此操作。 Sentinel-2 是由欧洲航天局发射的一颗卫星&#xff0c;其数据可在此处免费访问。 我要使用的图像显示了 Neusiedl 湖的北部&#xff08;奥地…

系统移植 根文件系统的移植 7.5

根文件系统的移植 根文件系统&#xff1a;根目录下的所有文件和工具的集合 根文件系统是内核启动后挂载的第一个文件系统系统引导程序会在根文件系统挂载后从中把一些基本的初始化脚本和服务等加载到内存中去运行文件系统层次结构标准 文件具体的属性只能在内核中看到&#xf…

django-vue-admin curd_demo 快速crud教程

django-vue-admin curd_demo 快速crud教程 快速CRUD开发教程&#xff1a;https://bbs.django-vue-admin.com/article/9.html 如何在 env.py 文件配置Mysql数据库&#xff1a;https://bbs.django-vue-admin.com/question/4.html 导入导出配置教程&#xff1a;https://bbs.djang…

Linux MySQL三种安装方式

MySQL 三种常用安装方式&#xff1a; 离线安装&#xff1a; 在mysql官网进行下载&#xff0c;步骤如下&#xff1a; 然后找到这个&#xff1a; 因为我这里使用的OS为CentOS7&#xff0c;大家可以按自己的系统进行选择。 最后通过XFTP/SCRTXF将文件传到虚拟机上。 然后将…

剑指 Offer 15. 二进制中1的个数 / LeetCode 191. 位1的个数(位运算)

题目&#xff1a; 链接&#xff1a;剑指 Offer 15. 二进制中1的个数&#xff1b;LeetCode 191. 位1的个数 难度&#xff1a;简单 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的…

MYSQL04高级_逻辑架构剖析、查询缓存、解析器、优化器、执行器、存储引擎

文章目录 ①. 逻辑架构剖析②. 服务层 - 查询缓存③. 服务层 - 解析器④. 服务层 - 优化器⑤. 服务层 - 执行器 ①. 逻辑架构剖析 ①. 服务器处理客户端请求 ②. 连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接经过三次握手建立连接成功后,MySQL服务器对…

安装centos报错usb2-port3: Cannot enable. Maybe the USB cable is bad?的垃圾解决办法

使用U盘安装系统&#xff0c;用Rufus烧录&#xff0c;建议使用DVD版本&#xff0c;MINIMAL没有图形界面&#xff0c;同时安装的时候也要选安装GNOME联想P330在开机Lenovo出现时狂按F12&#xff0c;选USB UEFI partition1进入&#xff0c;差不多这个界面&#xff0c;还有一些BIO…