ARM(实验二)

 

uart4.h

#ifndef __H__
#define __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

#ifndef __H__
#define __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
ubuntu@ubuntu:~/ARM00/04uart_4/include$ cd ..
ubuntu@ubuntu:~/ARM00/04uart_4$ cd src
ubuntu@ubuntu:~/ARM00/04uart_4/src$ cat uart4.c
#include "uart4.h"

//RCC/GPIO/UART4章节初始化
void hal_uart4_init()
{
	//RCC章节初始化				
	//1.使能GPIOB组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 1);

	//2.使能GPIOG组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	
	//3.使能UART4组控制器
	RCC->MP_APB1ENSETR |= (0x1 << 16);


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

	//2.设置PB2引脚复位功能为UART4_RX
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);

	//1.设置PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3 << 22));
	GPIOG->MODER |= (0x1 << 23);
	
	//2.设置PG11引脚复位功能为UART4_TX
	GPIOB->AFRH &= (~(0xf << 12));
	GPIOB->AFRH |= (0x3 << 13);


	//UART4章节初始化	
	//0.设置UE=0
	USART4->CR1 |= (0X1);

	//1.设置UART4串口1位起始位,8位数据位 CR1[28][12]=00
	USART4->CR1 &= (~(0X1 << 12));
	USART4->CR1 &= (~(0X1 << 28));

	//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 &= (~(0Xffff));
	USART4->BRR |=(0X22B);

	//7.设置UART4串口发送器使能 CR1[3]=1
	USART4->CR1 |= (0X1 << 3);

	//8.设置UART4串口接收器使能CR1[2]=1 
	USART4->CR1 |= (0X1 << 2);

	//9.设置UART4串口使能 CR[0]=1
	USART4->CR1 |=(0X1);
	
}

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

	//判断一帧数据是否发送完成
	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()
{
	static char p[32]="";
	for(int i=0;i<sizeof(p);i++)
	{
		p[i]=hal_get_char();
		hal_put_char(p[i]);
		if(p[i]=='\r')
		{
			hal_put_char('\n');
			p[i+1]='\n';
			p[i+2]='\0';
			break;
		}
	}
	return p;
}

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.mfbz.cn/a/86370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习|CNN卷积神经网络

CNN卷积神经网络 解决的问题人类的视觉原理原理卷积层——提取特征池化层——数据降维全连接层——输出结果 应用图像处理自然语言处理 解决的问题 在CNN没有出现前&#xff0c;图像对人工智能来说非常难处理。 主要原因&#xff1a; 图像要处理的数据量太大了。图像由像素组…

solidity0.8.0的应用案例11:透明代理合约

选择器冲突 智能合约中,函数选择器(selector)是函数签名的哈希的前4个字节。例如mint(address account)的选择器为bytes4(keccak256("mint(address)")),也就是0x6a627842. 由于函数选择器仅有4个字节,范围很小,因此两个不同的函数可能会有相同的选择器,例如…

PMP如何备考?学习方式这里有

预习阶段&#xff1a;强烈建议跟着习课视频学习&#xff08;自己看书真的很难看懂&#xff09;&#xff0c;初步了解PMBOK&#xff0c;有个大致印象&#xff1b; 精讲阶段&#xff1a;这个时候就需要静下心来深入了解各个知识模块&#xff0c;不仅是看PMBOK&#xff0c;还要尽…

从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动…

线程池UncaughtExceptionHandler无效?可能是使用方式不对

背景 在业务处理中&#xff0c;使用了线程池来提交任务执行&#xff0c;但是今天修改了一小段代码&#xff0c;发现任务未正确执行。而且看了相关日志&#xff0c;也并未打印结果。 源码简化版如下&#xff1a; 首先&#xff0c;自定义了一个线程池 public class NamedThrea…

视频批量剪辑矩阵分发系统源码开源分享----基于PHP语言

批量剪辑视频矩阵分发&#xff1a; 短视频seo主要基于抖音短视频平台&#xff0c;为企业实现多账号管理&#xff0c;视频分发&#xff0c;视频批量剪辑&#xff0c;抖音小程序搭建&#xff0c;企业私域转化等&#xff0c;本文主要介绍短视频矩阵系统抖音小程序开发详细及注意事…

selenium +Jmeter 的性能测试

通过Jmeter快速将已有的Selenium 代码以性能测试的方式组织起来&#xff0c;并使用JMeter 丰富的报表展示测试结果 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver …

孟羽童:成为勇敢逆袭的职场女性

相信职场中的小伙伴几乎都听过孟羽童这个名字&#xff0c;她从籍籍无名的应届毕业生到现如今摇身一变职场女强人&#xff0c;相信一定有职场人值得借鉴的地方。那么今天小编就给大家分享一下孟羽童的职场经历带给我的启发。 该图片来自网络&#xff0c;侵删 1、年龄并不是成功的…

java八股文面试[java基础]——final 关键字作用

为什么局部内部类和匿名内部类只能访问final变量&#xff1a; 知识来源 【基础】final_哔哩哔哩_bilibili

【Redis】Redis 的主从同步

【Redis】Redis 的主从同步 很多企业都没有使用 Redis 的集群&#xff0c;但是至少都做了主从。有了主从&#xff0c;当主节点(Master) 挂掉的时候&#xff0c;运维让从节点 (Slave) 过来接管&#xff0c;服务就可以继续&#xff0c;否则主节点需要经过数据恢复和重启的过程&a…

xcode15 change

jump to define 由原先的 control command left click 改为command left click

NLP与大模型主题全国师资培训班落地,飞桨持续赋能AI人才培养

为了推动大模型及人工智能相关专业人员的培养&#xff0c;8月11日-8月13日&#xff0c;由中国计算机学会主办、机械工业出版社、北京航空航天大学、百度飞桨联合承办 “CCF群星计划之文心高校行- NLP与大模型”主题师资培训班&#xff08;以下简称培训班&#xff09;在北京天信…

怎样压缩mp4视频大小?

怎样压缩mp4视频大小&#xff1f;由于视频文件的体积通常比其他类型的文件更大&#xff0c;因此它们需要更多的存储空间来保存。但是&#xff0c;如果我们的设备、应用程序或平台不支持某些视频格式或分辨率&#xff0c;或者我们没有足够的存储空间来容纳这些大型视频文件&…

产品流程图是什么?怎么做?

产品流程图是什么&#xff1f; 产品流程图是一种图形化的表达方式&#xff0c;用于描述产品开发、制造、销售、使用等各个阶段中涉及的流程、步骤和关系。它通过图形符号、箭头、文本等元素&#xff0c;展示了产品的各个环节之间的关联和顺序&#xff0c;通常被用于可视化产…

Vivado2018的工程迁移到Vivado2019上

Vivado2018的工程迁移到Vivado2019上 说明&#xff1a; 迁移很简单直接打开以后直接更新IP核后&#xff0c;即可重新编译工程 1、打开Vivado2019软件&#xff0c;准备打开工程 2、更新IP核 3、重新编译即可

Cesium.Entity图片纹理在不同观察角度有不同亮度

Cesium.Entity图片纹理在不同观察角度有不同亮度 测试代码&#xff1a; viewer.entities.add({rectangle: {coordinates: Cesium.Rectangle.fromDegrees(-92.0, 30.0, -76.0, 40.0),material: "../images/rect.png",} }); 测试图片&#xff1a; rect.png 这个图片…

制作一个专属于安防监控业的小程序商城

随着科技的发展和人们生活水平的提高&#xff0c;安防监控设备在我们的日常生活中起到了越来越重要的作用。因此&#xff0c;建立一个安防监控设备商城小程序就变得尤为重要。下面将介绍如何建立这样一个小程序。 第一步&#xff0c;登录乔拓云平台后台&#xff0c;进入商城管理…

智慧工地:安防监控EasyCVR智慧工地视频监管风险预警平台的应用

智慧工地方案是一种结合现代化技术与工地管理实践的创新型解决方案。它通过实时监控、数据分析、人工智能等技术手段&#xff0c;使工地管理更加高效、智能化。在建设智慧工地的过程中&#xff0c;除了上述提到的利用物联网技术实现设备互联、数据采集及分析以外&#xff0c;还…

jmeter CSV 数据文件设置

创建一个CSV数据文件&#xff1a;使用任何文本编辑器创建一个CSV文件&#xff0c;将测试数据按照逗号分隔的格式写入文件中。例如&#xff1a; room_id,arrival_date,depature_date,bussiness_date,order_status,order_child_room_id,guest_name,room_price 20032,2023-8-9 14:…

【JavaSE】详解final关键字

在Java中&#xff0c;final可以用来修饰类、方法和变量。final修饰类&#xff0c;表示该类无法被继承&#xff0c;并且此类的设计已被认为很完美而不需要进行修改或扩展。final修饰类中的方法&#xff0c;表示不可以被重写&#xff1b;也就是把该方法锁定了&#xff0c;以防止继…
最新文章