ARM开发,stm32mp157a-A7核(UART总线实验)

news2024/9/25 1:21:47

1.目标:键盘输入一个字符'a',串口工具显示'b';

           键盘输入一个字符串"nihao",串口工具显示"nihao";

2.框图分析: 

 3.代码:

---.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
---.c功能实现文件---
#include "uart4.h"
extern void delay_ms(int ms);

//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 &= (~(0x15 << 8));
	GPIOB->AFRL |= (0x1 << 11);
	
	//1设置PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3 << 4));
	GPIOG->MODER |= (0x1 << 5);
	
	//2设置PG11引脚为复用功能为UART4_TX
	GPIOG->AFRH &= (~(0x15 << 12));
	GPIOG->AFRH |= (0x3 << 13);
	
	//UART4章节初始化
	//8N1 115200 使能
	//0 设置UE位为0x1
	if(USART4->CR1 & (0x1 << 0))
	{
		delay_ms(500);
		USART4->CR1 &= ~0x1;	
	}
	
	//1设置串口1位起始位 8位数据位
	USART4->CR1 &= ~(0x1 << 12);
	USART4->CR1 &= ~(0x1 << 28);

	//2设置串口16倍采样率
	USART4->CR1 &= ~(0x1 << 15);
	
	//3PRESC 串口分频初始化 
	//不分配,放在波特率前
	USART4->PRESC &= ~0x15;

	//4BRR 设置串口波特率
	USART4->BRR = 0x22B;

	//5设置串口无校验位
	USART4->CR1 &= ~(0x1 << 10);
	
	//6CR2 设置串口停止位
	USART4->CR2 &= ~(0x3 << 12);

	//7设置串口发送位使能
	USART4->CR1 |= (0x1 << 3);
	
	//8设置串口接收位使能
	USART4->CR1 |= (0x1 << 2);
	
	//9设置串口使能  放到最后!!!
	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 判断一帧数据是否发送完成
	//读0:没完成,等待
	//读1:完成
	while(!(USART4->ISR & (0x1 << 6)));
}

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

//接收一个字符函数
char hal_get_char()
{
	//1判断接收数据寄存器 是否收到数据
	//读0:没有接收到数据
	//读1:接收到数据
	while(!(USART4->ISR & (0x1 << 5)));

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

char buf[128] = "";
//接收一个字符串函数
char* hal_get_string()
{
	int i = 0;
	char ch;
	//循环接收
	//enter = '\r' 
	while((ch=hal_get_char()) != '\r')
	{
		buf[i] = ch;
		hal_put_char(buf[i]);
		i++;
	}
	buf[i] = '\0';
	hal_put_char('\n');
	hal_put_char('\r');

	return buf;
}
---.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;
}
结果:
字符: 
字符串: 

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

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

相关文章

1.Prometheus

文章目录 Prometheus概述存储特点生态组件Prometheus serverClient LibraryExportersService DiscoveryAlertmanagerPushgatewayGrafana 工作模式工作流程局限性 部署prometheus部署 Node Exporter部署mysqld_exporter部署nginx-exporter部署grafana 总结 Prometheus 概述 za…

Yolo系列-yolov1

YOLO-V1 经典的one-stage方法 YouOnlyLookOnce&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; Yolov1的核心思想是将对象…

Adapter Tuning Overview:在CV,NLP,多模态领域的代表性工作

文章目录 Delta TuningAdapter Tuning in CVAdapter Tuning in NLP Delta Tuning Adapter Tuning in CV 题目: Learning multiple visual domains with residual adapters 机构&#xff1a;牛津VGG组 论文: https://arxiv.org/pdf/1705.08045.pdf Adapter Tuning in NLP …

input输入框和按钮相关联

有了内容&#xff0c;提交按钮才会起作用&#xff01;&#xff01;&#xff01; 当input输入框中输入内容的时候&#xff0c;按钮从禁用状态变成可用状态&#xff01; 输入框中输入的内容会同步输出&#xff0c; 输入的内容被存放在e.detail.value中&#xff0c;将其提取出来赋…

MybatisPlus拦截器实战之数据的加解密和脱敏

文章目录 一、前言二、拦截器简介三、代码目录结构简介四、核心代码讲解4.1 application.yml文件4.2 自定义注解4.2.1 SensitiveEntity4.2.2 SensitiveData4.2.3 MaskedEntity4.2.4 MaskedField4.2.5 MaskedMethod 4.3 Mybatis-Plus 拦截器数据自动加密4.4 Mybatis 打印完整sql…

浅析Linux SCSI子系统:设备管理

文章目录 概述设备管理数据结构scsi_host_template&#xff1a;SCSI主机适配器模板scsi_host&#xff1a;SCSI主机适配器主机适配器支持DIF scsi_target&#xff1a;SCSI目标节点scsi_device&#xff1a;SCSI设备 添加主机适配器构建sysfs目录 添加SCSI设备挂载Lun 相关参考 概…

FTHR-G0001 新手小白的第一块keil开发板

前言 作为从未接触过这类板子的新手&#xff0c;从申请起就十分忐忑&#xff0c;拿到板子的第一印象就是小而又特别&#xff0c;既可以整块板使用&#xff0c;也可以掰开用杜邦线连接的形式具备了灵活与小巧的特点&#xff0c;而核心板的把排针围成一圈的设计就足以让它在树莓…

HRS--人力资源系统(Springboot+vue)--打基础升级--(五)编辑当条记录

今天开发第一步&#xff1a;当前条记录&#xff0c;点击编辑&#xff0c;可以修改数据 1. 首先点击编辑&#xff0c;获取到了当前条的数据&#xff0c;弹出了一个小窗口 这个窗口是不是很熟悉&#xff0c;&#xff0c;没错。。这个窗口跟新增按钮弹出的窗口是同一个的 bug1&am…

使用 Next.js、Langchain 和 OpenAI 构建 AI 聊天机器人

在当今时代&#xff0c;将 AI 体验集成到您的 Web 应用程序中变得越来越重要。LangChain 与 Next.js 的强大功能相结合&#xff0c;提供了一种无缝的方式来将 AI 驱动的功能引入您的应用程序。 在本指南中&#xff0c;我们将学习如何使用Next.js&#xff0c;LangChain&#xf…

【MongoDB系列】1.MongoDB 6.x 在 Windows 和 Linux 下的安装教程(详细)

本文主要介绍 MongoDB 最新版本 6.x 在Windows 和 Linux 操作系统下的安装方式&#xff0c;和过去 4.x 、5.x 有些许不同之处&#xff0c;供大家参考。 Windows 安装 进入官网下载 Mongodb 安装包&#xff0c;点此跳转&#xff0c;网站会自动检测当前操作系统提供最新的版本&…

线性代数的学习和整理14: 线性方程组求解

目录 1 线性方程组 2 有解&#xff0c;无解 3 解的个数 1 线性方程组 A*xy 3根直线的交点&#xff0c;就是解 无解的情况 无解&#xff1a; 三线平行无解&#xff1a;三线不相交 有解 有唯一解&#xff1a;三线相交于一点有无数解&#xff1a;三条线重叠 2 齐次线性方程组…

vector quantized diffusion model for text-to-image synthesis

CVPR 2022论文分享会 - 基于VQ-Diffusion的文本到图像合成_哔哩哔哩_bilibiliCVPR 2022论文分享会 - 基于VQ-Diffusion的文本到图像合成, 视频播放量 1438、弹幕量 2、点赞数 38、投硬币枚数 12、收藏人数 40、转发人数 13, 视频作者 微软科技, 作者简介 大家好我是田老师&…

【电源专题】单节锂离子电池的保护的基本原理

为什么需要保护 锂离子电池在使用中最重要的是要确保它不会被过度充电和放电,这两种行为对它的伤害都是不可修复的,甚至可能还是危险的。因为它的内部材料结构被破坏了,就什么问题都可能表现出来。 因此使用中首先要做的就是要给它加上保护电路,确保过度充放电的行为不会…

系统报错msvcp120.dll丢失的解决方法,常见的三种解决方法

今天为大家讲述关于系统报错msvcp120.dll丢失的解决方法。在这个信息爆炸的时代&#xff0c;我们每个人都可能遇到各种各样的问题&#xff0c;而这些问题往往需要我们去探索、去解决。今天&#xff0c;我将带领大家走进这个神秘的世界&#xff0c;一起寻找解决msvcp120.dll丢失…

LONG-TAILED RECOGNITION 精读

BackGround 解决类别不平衡问题一般的思路&#xff1a; re-sample the data 重采样design specific loss functions that better facilitate learning with imbalanced data 设计针对不平衡数据的损失函数enhance recognition performance of the tail classes by transferri…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(二)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

为啥外卖小哥宁愿600一月租电动车,也不花2、3千买一辆送外卖!背后的原因......

大家好&#xff01;我是菜哥&#xff01; 又到周末了&#xff0c;我们聊点非技术的东西。最近知乎“为何那些穿梭于城市大街小巷的外卖小哥&#xff0c;宁愿每月掏出600块租一辆电动车&#xff0c;也不愿意掏出2、3千买一辆呢&#xff1f;” 冲上热榜&#xff01; 听起来有点“…

redis学习笔记 - 进阶部分

文章目录 redis单线程如何处理并发的客户端&#xff0c;以及为何单线程快&#xff1f;redis的发展历程&#xff1a;redis单线程和多线程的体现&#xff1a;redis3.x单线程时代但性能很快的主要原因&#xff1a;redis4.x开始引入多线程&#xff1a;redis6/redis7引入多线程IO&am…

UDP通信、本地套接字

#include <sys/types.h> #include <sys/socket > ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);- 参数&#xff1a;- sockfd : 通信的fd- buf : 要发送的数据- len : 发送数据的长度…

leetcode 567. 字符串的排列(滑动窗口-java)

滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句…