当前位置: 首页 > news >正文

C语言 cortex-A7核UART总线实验

一、C

1)uart4.h

#ifndef __UART4_H__                       
#define __UART4_H__                       #include "stm32mp1xx_rcc.h"               
#include "stm32mp1xx_gpio.h"              
#include "stm32mp1xx_uart.h"              //PB2 ---> UART4_RX                       
//PG11 ---> UART4_TX                      //RCC/GPIO/UART4章节初始化                
void hal_uart4_init();                    
//发送一个字符                            
void hal_put_char(const char ch);         
//发送一个字符串                          
void hal_put_string(const char* string);  
//接收一个字符                            
char hal_get_char();                      
//接收一个字符串                          
char* hal_get_string();                   #endif

2)uart.c

#include "uart4.h"//RCC/GPIO/UART4章节初始化
void hal_uart4_init()
{//RCC章节初始化//1.使能GPIOB组控制器  MP_AHB4ENSETR[1] = 1  0x50000A28[1]RCC->MP_AHB4ENSETR |= (0X1 << 1);//2.使能GPIOG组控制器  MP_AHB4ENSETR[6] = 1  0x50000a28[6]RCC->MP_AHB4ENSETR |= (0X1 << 6);//3.使能UART4组控制器  MP_AHB4ENSETR[11] = 1 PB2 PG11---> 0x500000A00[16] RCC->MP_APB1ENSETR |= (0X1 << 16);//GPIO章节初始化//1.设置PB2引脚为复用功能模式 MODER[5:4] = 10GPIOB->MODER &= (~(0x1 << 4));GPIOB->MODER |= (0x1 << 5);//2.设置PB2引脚复用功能为UART4_RX功能 AFRL[11:8] = 1000GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x1 << 11);//设置PG11引脚为复用功能模式 MODER[23:22] = 10GPIOG->MODER &= (~(0x1 << 22));GPIOG->MODER |= (0x1 << 23);//设置PG11引脚复用功能为UART4_TX功能 AFRH[15:12] = 0110GPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x6 << 12);//UART4章节初始化//8N1 115200 使能位 代码编写逻辑//0.设置串口UE=0 CR1[0] = 0USART4->CR1 &= (~(0x1 << 0));//1.设置1位起始位,8位数据位 CR1[28][12] = 00USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));//2.设置串口1位停止位 CR2[13:12] = 00USART4->CR2 &= (~(0x3 << 12))	;//3.设置串口无校验位 CR1[10] = 0USART4->CR1 &= (~(0x1 << 10));//4.设置串口16倍采样率 CR1[15] = 0USART4->CR1 &= (~(0x1 << 15));//5.设置串口不分频 PRESC[3:0] = 0000USART4->PRESC &= (~(0xf << 0));//6.设置串口波特率为115200 BRR = 0X22bUSART4->BRR &= (~(0xffff));USART4->BRR |= (0x22b);//7.设置串口发送位使能 CR1[3] = 1USART4->CR1 |= (0x1 << 3);//8.设置串口接受位使能 CR1[2] = 1USART4->CR1 |= (0x1 << 2);//9.设置串口使能 CR1[0] = 1USART4->CR1 |= (0x1 << 0);
}
//发送一个字符
void hal_put_char(const char ch)
{//1.判断发送数据寄存器是否为空 ISR[7]//读0:发送数据寄存器满,需要等待 for while//读1:发送数据寄存器空,可以发送数据while(!(USART4->ISR & (0X1 << 7)));//2.将参数ch传递过来的内容,赋值给TDR寄存器USART4->TDR = (volatile unsigned int)ch;	//3.判断一帧数据是否发送完成 ISR[6]while(!(USART4->ISR & (0x1 << 6)));
}//发送一个字符串
void hal_put_string(const char* string)
{//判断字符串是否为'\0'int i=0;while(string[i] != '\0'){//一个字符一个字符进行发送hal_put_char(string[i]);i++;}
}//接收一个字符
char hal_get_char()
{char ch;//1.判断接收数据寄存器是否不为空 ISR[5]//读0:没有接收到数据,需要等待 for while//读1:接收到数据,可以将数据读出while(!(USART4->ISR & (0x1 << 5)));//2.将接收数据寄存器中RDR,读出来ch = (char)USART4->RDR;return ch;
}char buffer[50] = {0};
//接收一个字符串
char* hal_get_string()
{for(int i=0;buffer[i]!='\0'; i++){buffer[i]='\0';}//判断键盘enter是否按下'\r'int i = 0;char ch;while(1){ch = hal_get_char();hal_put_char(ch);buffer[i] = ch;i++;if(ch == '\r'){hal_put_char('\n');	break;			}}buffer[i] = '\n';return buffer;
}

3)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)                                                          {                                                                 //单个字符                                                    //hal_put_char(hal_get_char() + 1);                           //字符串                                                      hal_put_string(hal_get_string());                             }                                                                 return 0;                                                         
}                                                                    

4)效果

实验一:收发字符

实验二:收发字符串

二、函数实现

1)uart4.h

2)uart.c

3)main.c

4)效果

实验一:收发字符

实验二:收发字符串

相关文章:

C语言 cortex-A7核UART总线实验

一、C 1&#xff09;uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…...

asp.net C#免费反编译工具ILSpy

在维护一个没有源码的C#项目&#xff0c;只能反编译了。 项目主页 https://github.com/icsharpcode/ILSpy 使用方法 中文界面使用简单&#xff0c;把你要反编译的dll拖过去就可以了。好使&#xff01;&#xff01;&#xff01;...

演讲实录:DataFun 垂直开发者社区基于指标平台自主洞察北极星指标

在7月14日举办的 Kyligence 用户大会的数智新应用论坛上&#xff0c;DataFun COO 杜颖女士为大家带来了《垂直开发者社区基于指标平台自主洞察北极星指标》的主题演讲。接下来&#xff0c;我们一起看看 DataFun 如何在没有专门的 IT 团队的情况下&#xff0c;实现对北极星指标的…...

ffmpeg编译 Error: operand type mismatch for `shr‘

错误如下&#xff1a; D:\msys2\tmp\ccUxvBjQ.s: Assembler messages: D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:470: Error: operand type mismatch…...

【Windows Server 2012 R2搭建FTP站点】

打开服务器管理器——添加角色和功能 下一步 下一步 下一步 选择FTP服务器&#xff0c;勾上FTP服务和FTP扩展&#xff0c;点击下一步 安装 安装完成关闭 打开我们的IIS服务器 在WIN-XXX主页可以看到我们的FTP相关菜单 右键WIN-XXXX主页&#xff0c;添加FTP站点 输入站点名称-FT…...

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…...

借助reCAPTCHA实现JavaScript验证码功能

前言 验证码&#xff08;CAPTCHA&#xff09;是一种常见的安全验证机制&#xff0c;常用于区分真实用户和机器人。使用验证码可以有效防止恶意登录、自动注册或者密码爆破等攻击。本文将借助reCAPTCHA第三方库来实现JavaScript验证码功能。 验证码的原理 验证码的核心思想是要…...

监控数据的采集方式及原理

采集方法使用频率从高到低依次是读取 /proc目录、执行命令行工具、远程黑盒探测、拉取特定协议的数据、连接到目标对象执行命令、代码埋点、日志解析。 读取 /proc目录 /proc是一个位于内存中的伪文件系统&#xff0c;而在该目录下保存的不是真正的文件和目录&#xff0c;而是…...

Vue路由与node.js环境搭建

目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…...

腾讯云16核服务器性能测评_轻量和CVM配置大全

腾讯云16核服务器配置大全&#xff0c;CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xff0c;…...

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载&#xff1a;https://www.postman.com/ 访问链接后&#xff0c;进入首页&#xff0c;根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件&#xff0c;会默认安装在C盘&#xff0c;安装完会…...

uni-app混合开发 navigateTo、reLaunch、redirectTo、switchTab区别

1.navigateTo 保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 要注意的是navigateTo只能跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数&#xff1b;如果跳转url参数为tabBar的路径则无法进行跳转 2.redir…...

专业软件测评中心:关于软件性能测试的实用建议

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用&#xff0c;它包括的测试内容丰富多样。 一、软件性能测试的实用建议   1、制定清晰的测试目标&#xff1a;明确测试目标…...

vue项目通过json-bigint在前端处理java雪花id过长导致失去精度问题

这里 我简单模仿了一个接口 这里 我单纯 返回一个long类型的雪花id 然后 前端 用 axios 去请求 大家知道 axios 会对请求数据做一次处理 而我们 data才是拿到我们java这边实际返回的东西 简单说 就是输出一下我们后端返回 的内容 这里 我们网络中显示的是 35866101868095488…...

【全志V3s】SPI NAND Flash 驱动开发

文章目录 一、硬件介绍V3s的启动顺序 二、驱动支持U-Boot驱动主线 Linux 驱动已经支持 三、烧录工具 xfel四、构建U-Boot&#xff08;官方的Uboot&#xff09;先编译一下开始spi nand flash 代码层面的适配修改menuconfig配置ARM architecture配置Support for SPI Nand Flash o…...

【二叉树】二叉树展开为链表-力扣 114 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

NLP文本生成全解析:从传统方法到预训练完整介绍

目录 1. 引言1.1 文本生成的定义和作用1.2 自然语言处理技术在文本生成领域的使用 2 传统方法 - 基于统计的方法2.1.1 N-gram模型2.1.2 平滑技术 3. 传统方法 - 基于模板的生成3.1 定义与特点3.2 动态模板 4. 神经网络方法 - 长短时记忆网络(LSTM)LSTM的核心概念PyTorch中的LST…...

OpenBA:开源模型家族再添一员!从头训练的15B中英非对称Encoder-Decoder结构双语模型...

苏州大学从头训练的双语非对称Encoder-Decoder模型OpenBA已正式开源&#xff01; 主要亮点包括&#xff1a; 亮点一&#xff1a;此模型为中文开源社区贡献了一个有代表性的编码器解码器大语言模型&#xff0c;其训练过程&#xff08;包括数据收集与清洗、模型构建与训练&#x…...

安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…...

基座向量施密特正交化

最近再次细细的阅读了向量施密特正交化&#xff0c;重新系统梳理一下 一、正交基地与向量的正交分解 二、基化成标准正交基&#xff0c;是什么意思 将一个向量空间中的基向量通过某种方式转化为一组标准正交基&#xff0c;是指将原有的基向量进行调整&#xff0c;使得它们满足…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...