ARM--day6(实现字符、字符串收发的代码和现象,分析RCC、GPIO、UART章节)

news2024/12/26 3:09:40

 

uart4.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

uart4.c

#include "uart4.h"

//RCC/GPIO/USART4章节初始化
void hal_uart4_init()
{
	//RCC章节初始化
	//1.使能GPIOB组控制器	
	//2.使能GPIOG组控制器
	//3.使能USART4组控制器
	RCC->MP_AHB4ENSETR |= (0x1<<1);
	RCC->MP_AHB4ENSETR |= (0x1<<6);
	RCC->MP_APB1ENSETR |= (0X1<<16);

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

	//1.设置PG11引脚为复用功能
	//2.设置PG11引脚复用功能为USART4_TX
	GPIOG->MODER &= (~(0x3<<22));
	GPIOG->MODER |= (0x1<<23);
	GPIOG->AFRH &= (~(0xf<<12));
	GPIOG->AFRH |= (0x3<<13);
	
	//USART4章节初始化
	//8N1 115200使能
	//0.设置UE=0,CR1[0]=0
	//1.设置USART41位的起始位,8位的数据位CR1[28][12]=00
	//2.设置USART4串口没有校验,CR1[10]=0
	//3.设置USART4串口1位停止位,CR2[13:12]=00
	//4.设置USART4串口16倍采样率,CR1[15]=0
	//5.设置USART4串口不分频,PRESC[3:0]=0000
	//6.设置USART4串口波特率 115200 BRR = 0x22B
	//7.设置USART4串口发送器使能 CR1[3] = 1
	//8.设置USART4串口接收器使能 CR1[2] =1
	//9.设置USART4串口使能,CR1[0]=1 
	USART4->CR1 |= (0X1);
	USART4->CR1 &= (~(0x1<<28));
	USART4->CR1 &= (~(0x1<<12));
	USART4->CR1 &= (~(0x1<<10));
	USART4->CR2 &= (~(0x3<<12));
	USART4->CR1 &= (~(0x1<<15));
	USART4->PRESC &= (~(0xf));
	USART4->BRR &= (~(0xffff));
	USART4->BRR |= (~(0x22B));
	USART4->CR1 |= (0x1<<3);
	USART4->CR1 |= (0x1<<2);
	USART4->CR1 |= (0x1);

}

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

//发送一个字符串函数
void hal_put_string(const char* string)
{
	//判断是否为'\0'
	//一个一个字符进行发送就可以
	for(int i=0;string[i]!=0;i++)
	{
		hal_put_char(string[i]);
	}
}

//接收一个字符函数
char hal_get_char()
{
	//判断接收寄存器中,是否接收到数据
	while(!(USART4->ISR & (0x1<<5)));
	//将接收数据寄存器内容,读出来
	return (char)USART4->RDR;
}

//接收一个字符串函数
char* hal_get_string()
{
	//循环
	//enter='\r'
	static char s[32]="";
	for(int i=0;i<sizeof(s);i++)
	{
		s[i]=hal_get_char();
		hal_put_char(s[i]);
		if(s[i]=='\r')
		{
			hal_put_char('\n');
			s[i+1]='\n';
			s[i+2]='\0';
			break;
		}
	}
	return s;
}

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()
{
	while(1)
	{
//		hal_put_char(hal_get_char()+1);
		hal_put_string(hal_get_string());
	}
	return 0;
}

现象:

 

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

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

相关文章

Roxy-Wi 命令执行漏洞复现

漏洞描述 Roxy-WI是开源的一款用于管理 Haproxy、Nginx 和 Keepalived 服务器的 Web 界面 Roxy-WI 6.1.1.0 之前的版本存在安全漏洞,该漏洞源于系统命令可以通过 subprocess_execute 函数远程运行,远程攻击者利用该漏洞可以执行远程代码。 免责声明 技术文章仅供参考,任…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

开发调试更便捷!火山引擎 DataLeap 提供 Notebook 交互式开发体验

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 Notebook 是一种支持 REPL 模式的开发环境。 所谓「REPL」&#xff0c;即「读取-求值-输出」循环&#xff1a;输入一段代码&#xff0c;立刻得到相应的结果&#x…

OpenCV图片校正

OpenCV图片校正 背景几种校正方法1.傅里叶变换 霍夫变换 直线 角度 旋转3.四点透视 角度 旋转4.检测矩形轮廓 角度 旋转参考 背景 遇到偏的图片想要校正成水平或者垂直的。 几种校正方法 对于倾斜的图片通过矫正可以得到水平的图片。一般有如下几种基于opencv的组合方…

机场项目:解决飞行物空间大小/纵横比、速度、遮挡等问题引起的实时目标检测问题...

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 Column of Computer Vision Institute 最近在arXiv中翻阅到一遍基于Yolov8的飞机实时目标检测论文&#xff…

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…

MySQL | JDBC连接数据库

一、什么是JDBC 概念&#xff1a; JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成&#xff0c;它为Java开发…

八种架构演进

日升时奋斗&#xff0c;日落时自省 目录 1、单机架构 2、应用数据分离架构 3、应用服务集群架构 4、读写分离/主从分离架构 5、冷热分离架构 6、垂直分库架构 7、微服务架构 8、容器编排架构 9、小结 1、单机架构 特征&#xff1a;应用服务和数据库服务器公用一台服务…

HRS--人力资源系统(Springboot+vue)--打基础升级--(四)新增员工信息

今天的更新&#xff1a;在员工信息界面&#xff0c;点新增按钮&#xff0c;弹出一个请填写新增员工信息的窗口&#xff0c;然后保存数据 1. 先来看下窗口设计样式 嗯&#xff0c;感觉这窗口又细又长&#xff0c;果然排版不是我的强项&#xff0c;这里的新增属于管理员的权限界面…

SQL助你面大厂(N日留存率)

在一些游戏中比较关注的就是留存率&#xff0c;随着王者的更新&#xff0c;画质在不断的优化&#xff0c;可是匹配机制确实一成不变&#xff0c;导致很多人逐渐退游&#xff0c;那么我们的王者的官方是怎么知道有这么多人退游么&#xff1f;退游了是相当于删除玩家对应的那条数…

第 7 章 排序算法(4)(插入排序)

7.7插入排序 7.7.1插入排序法介绍: 插入式排序属于内部排序法&#xff0c;是对于欲排序的元素以插入的方式找寻该元素的适当位置&#xff0c;以达到排序的目的。 7.7.2插入排序法思想: 插入排序&#xff08;Insertion Sorting&#xff09;的基本思想是&#xff1a;把n个待排…

【令牌桶算法与漏桶算法】

&#x1f4a7; 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

机器学习深度学习——NLP实战(情感分析模型——RNN实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;情感分析模型——数据集&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&…

玩转红黑树:手把手教你实现和理解红黑树

玩转红黑树&#xff1a;手把手教你实现和理解红黑树 引言一、红黑树的定义1.1、理论知识1.2、代码实现1.3、代码优化 二、红黑树的旋转2.1、理论知识2.2、代码实现 三、红黑树插入节点3.1、理论知识3.2、代码实现 四、红黑树删除节点4.1、理论知识4.2、代码实现 五、红黑树的查…

04_17页回收问题和水位线和swap交换空间和oom,内存性能微调

前言 应用程序通过 malloc 函数申请内存的时候&#xff0c;实际上申请的是虚拟内存&#xff0c;此时并不会分配物理内存。 当应用程序读写了这块虚拟内存&#xff0c;CPU 就会去访问这个虚拟内存&#xff0c; 这时会发现这个虚拟内存没有映射到物理内存&#xff0c; CPU 就会…

基于STM32CubeMX和keil采用SPI通信实现轮询方式读写W25Q128获取设备ID

文章目录 前言1. SPI通信1.1 SPI硬件接口与连线1.2 SPI传输协议1.3 SPI的数据传输 2. W25Q1282.1 片选2.2 控制指令2.3 时序图分析 3. STM32CubeMX配置3.1 引脚配置3.2 时钟配置3.3 SPI配置3.4 工程配置 4. 代码编写4.1读ID函数 总结 前言 最近使用通信比较多&#xff0c;包含…

多仓库手机端erp进销存pc/h5开源版开发

多仓库手机端erp进销存pc/h5开源版开发 以下是多仓库手机端ERP进销存PC/H5的功能列表&#xff1a; 仓库管理&#xff1a;包括仓库的新增、编辑、删除、查询等功能&#xff0c;可以管理多个仓库的库存情况。 商品管理&#xff1a;可以对商品进行新增、编辑、删除、查询等操作&a…

【JavaSE】面向对象之多态

文章目录 多态的概念多态实现条件重写向上转型和向下转型向上转型向下转型 避免在构造方法中调用重写的方法 多态的概念 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 多态实现条件 必须要…

通过LD_PRELOAD绕过disable_functions

LD_PRELOAD 在UNIX的动态链接库的世界中&#xff0c;LD_PRELOAD就是这样一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff08;Runtime linker&#xff09;&#xff0c;它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态…

PANGOLIN写字

效果: 代码: #include <iostream> #include <pangolin/pangolin.h>// pangolin 绘制文字demousing namespace std;int main() {//创建一个窗口pangolin::CreateWindowAndBind("PangolinShowText", 640, 480);// 定义字体pangolin::GlFont * text_font …