ARM day7 (串口协议)

news2024/11/25 10:13:06

实验一

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

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化UART4
void hal_uart4_init();

//发送一个字符
void hal_put_char(const char str);

//发送一个字符串
void hal_put_string(const char * str);

//接收一个字符
char hal_get_char();

//接收一个字符串
char* hal_get_string();



#endif

uart4.c

#include "uart4.h"


//初始化UART4
void hal_uart4_init()
{
	/*************RCC*************/
	//1.GPIOB使能 MP_AHB4ENSETR[1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//2.GPIOG使能 MP_AHB4ENSETR[6] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//3.UART4使能 MP_APB1ENSETR[16] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 16);

	/************GPIO*************/
	//1.设置 FB2 引脚为复用模式 MODER[5:4] = 10
	GPIOB->MODER &= (~(0X3 << 4));
	GPIOB->MODER |= (0x2 << 4);

	//2.设置 FB2 引脚复用为 UART4_RX AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x8 << 8);
	
	//1.设置 FG11 引脚为复用模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0X3 << 22));
	GPIOG->MODER |= (0X2 << 22);
		
	//2.设置 FG11 引脚复用为 UART4_TX AFRL[15:12] = 1000
	GPIOG->AFRL &= (~(0XF << 12));
	GPIOG->AFRL |= (0X6 << 12);


	/***********UART4*************/
	//0.设置串口UE = 0
	USART4->CR1 &= (~0x1); 
	
	//1.设置1位起始位,8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));
		
	//2.没有奇偶校验
	USART4->CR1 &= (~(0x1 << 10));
	
	//3.设置1位停止位
	USART4->CR2 &= (~(0x3 << 12)); 
	
	//4.设置16倍采样位
	USART4->CR1 &= (~(0x1 << 15));

	//5.设置串口不分频
	USART4->PRESC &= (~0xF);
	
	//6.设置串口波特率为115200
	USART4->BRR &= (~0xFFFF);
	USART4->BRR |= (0x22B);

	//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.判断一帧数据是否发送完成ISR[6]
	//0未完成,1已完成
	while(!(USART4->ISR & (0x1 << 6)));

}


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

	//2.将数据读取
	return USART4->RDR;


}


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)
	{
		char arr = hal_get_char();	
		hal_put_char(arr+1);
	}
	return 0;
}

 

 

实现二

键盘输入一个字符串,串口工具回显输入的字符串

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化UART4
void hal_uart4_init();



//发送一个字符
void hal_put_char(const char str);

//发送一个字符串
void hal_put_string(const char * str);

//接收一个字符
char hal_get_char();

//接收一个字符串
char* hal_get_string();



#endif

uart4.c

#include "uart4.h"


//初始化UART4
void hal_uart4_init()
{
	/*************RCC*************/
	//1.GPIOB使能 MP_AHB4ENSETR[1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//2.GPIOG使能 MP_AHB4ENSETR[6] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//3.UART4使能 MP_APB1ENSETR[16] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 16);

	/************GPIO*************/
	//1.设置 FB2 引脚为复用模式 MODER[5:4] = 10
	GPIOB->MODER &= (~(0X3 << 4));
	GPIOB->MODER |= (0x2 << 4);

	//2.设置 FB2 引脚复用为 UART4_RX AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x8 << 8);
	
	//1.设置 FG11 引脚为复用模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0X3 << 22));
	GPIOG->MODER |= (0X2 << 22);
		
	//2.设置 FG11 引脚复用为 UART4_TX AFRL[15:12] = 1000
	GPIOG->AFRL &= (~(0XF << 12));
	GPIOG->AFRL |= (0X6 << 12);


	/***********UART4*************/
	//0.设置串口UE = 0
	USART4->CR1 &= (~0x1); 
	
	//1.设置1位起始位,8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));
		
	//2.没有奇偶校验
	USART4->CR1 &= (~(0x1 << 10));
	
	//3.设置1位停止位
	USART4->CR2 &= (~(0x3 << 12)); 
	
	//4.设置16倍采样位
	USART4->CR1 &= (~(0x1 << 15));

	//5.设置串口不分频
	USART4->PRESC &= (~0xF);
	
	//6.设置串口波特率为115200
	USART4->BRR &= (~0xFFFF);
	USART4->BRR |= (0x22B);

	//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.判断一帧数据是否发送完成ISR[6]
	//0未完成,1已完成
	while(!(USART4->ISR & (0x1 << 6)));

}

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

}

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

	//2.将数据读取
	return USART4->RDR;


}


//接收一个字符串
char* hal_get_string()
{
	//循环接收
	char* arr='\0';
	int i=0;
	while(1)
	{
	//'\n'回车表示接收完成
	*(arr+i) = hal_get_char();
	hal_put_char(*(arr+i));
	if(*(arr+i) != '\n') break;
	i++;
	}
	return arr;
}


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)
	{
		char* arr = hal_get_string();	
		hal_put_string(arr);

	}
	return 0;
}

 

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

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

相关文章

MBD开发 STM32 CAN

Matlab/Simulink之STM32开发-CAN接收 - 知乎 Matlab/Simulink之STM32开发-CAN发送 - 知乎 目录 can发送 can接收 can发送 一直报这个错误&#xff0c;不用管 手动指定信号 can接收 CAN通讯中断选择&#xff1a;USB low priority or CAN RX0 interrupts CAN报文的接收模型主…

Mysql-事务及索引

事务 概述 用来统一sql语句的操作 防止删了这种情况的发生 删了部门&#xff0c;但是删员工的出错了没删成 事务中的语句要么全部都运行成功&#xff0c;要么全部都不运行成功 且可以撤销事务的操作&#xff1a;叫事务回滚 介绍 正常不开启事务 就每一条语句都是一个事务 …

安装jupyter notebook及插件

pip命令 pip install jupyter notebook 安装插件的pip pip install jupyter_nbextensions_configurator pip install jupyter_contrib_nbextensions jupyter nbextensions_configurator enable --user jupyter contrib nbextension install --user 输入jupyter notebook &…

vue 递归

目录 1. 树结构递归效果图 2. 代码&#xff1a; 1. 树结构递归效果图 ps &#xff1a;递归说白了就是自己掉自己。 2. 代码&#xff1a; //1. 调查询表格的接口_this.$API.departmentGetTreeList().then((res) > {if (res.data.code 200) {this.loading false;let temp…

long类型值与bytes数组互转

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

对于float或者double的集合求解交集

对于一般的集合求解交集&#xff0c;我们直接使用std::set_intersection即可&#xff0c;但是float和double都有精度问题&#xff0c;如果直接求交集&#xff0c;会认为比如0.9999和1.0001是两个数&#xff0c;造成并没有真正取得交集&#xff0c;其实这个函数实现也很容易&…

【UnityDOTS 十一】SharedComponent介绍

SharedComponent介绍 SharedComponent内存图 共享组件的值数组在单独的SharedComponentDataArrary中。每个Chunk中有一个单独的Handle指向这个值。 所以这个Chunk中放的不只是ArcheType相同的Entity&#xff0c;他们所指向的ShareComponent值也是相同的。 同时修改一个Entity…

网络知识点之-STP协议

STP&#xff08;Spanning Tree Protocol&#xff09;是生成树协议的英文缩写&#xff0c;可应用于计算机网络中树形拓扑结构建立&#xff0c;主要作用是防止网桥网络中的冗余链路形成环路工作。但某些特定因素会导致STP失败&#xff0c;要排除故障可能非常困难&#xff0c;这取…

❤ VUE3 项目具体配置(二)

❤ VUE3 项目具体配置&#xff08;二&#xff09; 一、create-vue快速生成项目原理 介绍&#xff1a; 前段时间我们有去探索了一下vue-cli、cra的原理&#xff0c;生成项目的过程&#xff0c;他是基于webpack的&#xff0c;但是今天我们的主角是create-vue&#xff0c;他是基…

用final修饰java方法的参数

当Java方法的参数用final修饰&#xff1a; 如果输入参数是简单类型&#xff0c;那么在被调用函数内部不能修改参数的值。如果输入参数是对象的引用&#xff0c;那么在被调用函数内部不能改变对象的引用&#xff0c;即必须引用同一个对象&#xff0c;但可以修改对象的属性。 代…

数据预处理之数据规约

目录 一、前言 二、PCA的主要参数&#xff1a; 三、数据归约任务1 四、数据规约任务2 一、前言 PCA(Principal Component Analysis)&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上&#xff0c;这k维是全新…

第三十九章Java成员方法的声明和调用

声明成员方法可以定义类的行为&#xff0c;行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是用方法来实现的&#xff0c;属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型&#xff0c;其结构…

9、动手学深度学习——使用块的网络(VGG)

1、VGG块 虽然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&#xff0c;我们将介绍一些常用于设计深层神经网络的启发式概念。 与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程…

element input,一个中文占3个字符

思路&#xff1a;标记字符的下标&#xff0c;截取&#xff0c;重新赋值 代码如下&#xff0c;可直接复制预览 <template><div class"form-item"><el-inputv-model"testValue":maxlength"maxlength"input"handleInput"…

Kafka入门, 消费者组案例(十九)

pom 文件 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency></dependencies>独立消费者案例&#xff08;订阅主语&a…

简单认识LVS-DR负载群集和部署实例

文章目录 一、LVS-DR负载群集简介1、DR模式数据包流向分析2、DR 模式的特点 二、DR模式 LVS负载均衡群集部署 一、LVS-DR负载群集简介 1、DR模式数据包流向分析 1、客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff0…

放大器的基本知识

文章目录 1.反向输入&#xff08;引出&#xff1a;反向器&#xff09;1.反向输入例子 2.同向输入&#xff08;引出&#xff1a;电压跟随器&#xff09;2.同向输入例子 3.加法运算 1.反向输入&#xff08;引出&#xff1a;反向器&#xff09; 1.反向输入例子 —————————…

基于Java网上药品售卖系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【MYSQL基础】基础命令介绍

基础命令 MYSQL注释方式 -- 单行注释/* 多行注释 哈哈哈哈哈 哈哈哈哈 */连接数据库 mysql -u root -p12345678退出数据库连接 使用exit;命令可以退出连接 查询MYSQL版本 mysql> select version(); ----------- | version() | ----------- | 8.0.27 | ----------- 1…

HA使用Node-RED推送消息到手机

目录 1.一个简单示例(1).注入使用个inject节点&#xff0c;用来触发(2).手机通知是call service节点(3).保存-部署&#xff0c;看效果 2.消息-添加变量 1.一个简单示例 (1).注入使用个inject节点&#xff0c;用来触发 (2).手机通知是call service节点 Node-RED需要提前和Home A…