STM32寄存器结构体详解
一、寄存器结构体详解
对于STM32而言,使用一个结构体将一个外设的所有寄存器都放到一起
二、修改驱动
1、添加清除bss段代码
2、添加寄存器结构体
在寄存器结构体中添加寄存器的时候一定要注意地址的连续性,如果地址不连续的话,要添加占位,数组
#define CCM_BASE (0x020c4000) /*CCM外设基地址*/
/*CCM外设*/
typedef struct
{
volatile unsigned int CCR;
volatile unsigned int CCDR;
volatile unsigned int CSR;
volatile unsigned int CCSR;
volatile unsigned int CACRR;
volatile unsigned int CBCDR;
volatile unsigned int CBCMR;
volatile unsigned int CSCMR1;
volatile unsigned int CSCMR2;
volatile unsigned int CSCDR1;
volatile unsigned int CS1CDR;
volatile unsigned int CS2CDR;
/* data */
}CCM_Type;
#define CCM ((CCM_Type*)CCM_BASE)
结构体指针:
#include <stdio.h>
#include <stdlib.h>
//结构体化寄存器,并将寄存器地址定义为结构体指针
//(1)编写外设结构体:我定义了一个结构体,结构体里的变量用于存放什么
typedef struct
{//volatile的意义为什么:需要搞清楚volatile unsigned int CCR;volatile unsigned int CCDR;
}CCM_Type;
//(2)定义寄存器的基地址
#define CCM_BASE (0X020C4000)
//(3)定义访问指针,此时结构体和基地址之间并无关系
#define CCM ((CCM_Type *)CCM_BASE)
//能否理解为在CCM地址范围内分配了,struct CCM_Type结构体变量进行存储呢?
//CCM_Type是一个结构体,CCM_BASE的数值指向,CCM_TPye结构类型,表示什么CCM_Type结构体的指针指向 CCM_BASE吗?
//例如:int *p; p的指针是int型 p是指针变量,存放地址
/*网上找的一个感悟#define GPIOA((GPIO_typedef")GPIOA_BASE基地址结构体指针#define GPIOA((GPIO typedef*)GPIOA BASE此预处理将GPIOA变成GPIOtypedef类型的结构体指针,默认指向了GPIOA的基地址首。在调用->指向不同结构体成员时,指针就会根据成员变量类型的大小跳不同的步进,进而访问到不同的成员地址,对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作 GPIO。这是我最近理解结构体指针的感悟。结构体压入地址中?
*/
int main()
{//定义结构体变量return 0;
}
1
2
3
4
5
6
7
8
9
10
11
1
通过自己的理解,我觉得这是一个最好不过的总结了,值得反复读取几遍
通过宏定义,使用typedef定义的结构体其指针指向基地址读写寄存器状态,结构体中变量保证与寄存器地址对齐。
2.#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U 的解释
#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U
扩展到:
0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U
此段代码最好理解需要看函数
IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /* 复用为GPIO1_IO03 */
函数参数通过define完成了参数的简化:
* @param muxRegister The pin mux register.* @param muxMode The pin mux mode.* @param inputRegister The select input register.* @param inputDaisy The input daisy.* @param configRegister The config register.* @param configValue The pin config value.*/
static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t configValue)
通过这样,即可理解为:
应该是常量替换,要不参数太多了,可读性变差,整个0x02290000U, 0x5U, 0x00000000U, 0x0U, 0x02290044U,理解成一个常量,随着函数传参直接带入,降低传参个数
初始化IO复用为GPIO引脚的代码和下面初始化GPIO的代码就是利用结构体指针控制寄存器。
相关文章:
STM32寄存器结构体详解
一、寄存器结构体详解 对于STM32而言,使用一个结构体将一个外设的所有寄存器都放到一起 二、修改驱动 1、添加清除bss段代码 2、添加寄存器结构体 在寄存器结构体中添加寄存器的时候一定要注意地址的连续性,如果地址不连续的话,要添加占位…...
如何建立devops?
要建立DevOps系统,可以遵循以下步骤: 一、明确目标与确立原则 明确目标:确定DevOps系统的总体目标,例如提高软件发布频率、缩短反馈时间、提升软件质量等。确立原则:确立DevOps的核心原则,包括持续集成&a…...
shell基础(3)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
2024年11月16日Github流行趋势
项目名称:opendatalab / MinerU 项目维护者:myhloli, dt-yy, Focusshang, drunkpig, papayalove等项目介绍:一站式开源高质量数据提取工具,支持PDF/网页/多格式电子书提取。项目star数:16,398项目fork数:1,…...
k8s更新
k8s更新 1.30 升级了 Metrics Server 到 v0.7.0 kubectl get cronjob命令增加了时区列显示 kubectl describe命令在描述VolumeAttributesClass、作业、Pod 模板等时提供了更多信息,有助于深入排查问题。 改进了kubectl logs命令,当 Pod 未找到时会显示所…...
ES6进阶知识一
目录 一、ES6构建工具与模块化 1.1.构建工具 1.1.1.Webpack 安装 Webpack 配置 Webpack 使用 Webpack 1.1.2.Babel 安装 Babel 配置 Babel 1.2.ES6模块化 1.命名导出导入 导出模块 导入模块 2. 默认导出与导入 导出模块 导入模块 1.3.完整案例展示 1. 项目结构…...
C#/WinForm拖拽文件上传
一、首先创建一个上传文件的类,继承Control类,如下: public class UploadControl : Control{private Image _image;public UploadControl(){this.SetStyle(ControlStyles.UserPaint | //控件自行绘制,而不使用操作系统的绘制Cont…...
IT运维的365天--019 用php做一个简单的文件上传工具
前情提要:朋友的工作室,有几个网站分布在不同的服务器上,要经常进行更新,之前是手动复制压缩包到各个服务器去更新(有写了自动更新的Shell脚本)。但还是觉得太麻烦,每次还要手动传输压缩包到各个…...
详细的oracle rac维护命令集合
一、查看命令 所有实例和服务的状态 $srvctl status database -d orcl Instance orcl1 is running on node db1 Instance orcl2 is running on node db2 单个实例的状态 $ srvctl status instance -d orcl -i orcl2 Instance orcl2 is running on node db2 单个节点的应用程序…...
23 种设计模式详解
设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、 组合模…...
Python毕业设计选题:基于django+vue的二手物品交易系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 店铺管理 二手物品管理 广告管理 留言反馈 订单…...
VMware 17虚拟Ubuntu 22.04设置共享目录
VMware 17虚拟Ubuntu 22.04设置共享目录 共享文件夹挂载命令!!!<font colorred>配置启动自动挂载Chapter1 VMware 17虚拟Ubuntu 22.04设置共享目录一、卸载老版本二、安装open-vm-tools<font colorred>三、配置启动自动挂载四、添…...
Rust学习(五):泛型、trait
Rust学习(五):泛型、trait 1、泛型: 相信小伙伴们一定还记得,之前我们实现了一个add函数,并指定了参数类型为:i32: fn add(x:i32, y:i32) ->i32 {x y }这里我们就会遇到一个问…...
智能零售柜商品识别
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...
2024智能机器人与自动控制国际学术会议 (IRAC 2024)
主办,承办,支持单位 会议官网 www.icirac.org 大会时间:2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 (IRAC 2024)由华南理工大学主办,会议将于2024年11月29日-12月1日在中国广…...
计算机组成原理:总线与微命令
实验四 总线与微命令实验 一、实验目的 1) 理解总线的概念和作用。 2) 连接运算器与存储器,熟悉计算机的数据通路。 3) 理解微命令与微操作的概念。 二、实验要求 1) 做好实验预习,在实验之前填写好…...
10月回顾 | Apache SeaTunnel社区动态与进展一览
各位热爱 Apache SeaTunnel 的小伙伴们,社区10月份月报来啦,请查收! 这里将记录Apache SeaTunne社区每月动态和进展,欢迎关注。 月度Merge之星 感谢以下小伙伴上个月为 Apache SeaTunnel 所做的精彩贡献(排名不分先…...
网络基础(4)传输层
既然是传输层首先就要明确实在层状结构的哪里,除开物理层之外分成了四层协议: 到这里上层(应用层)的使用已经没有问题,之前使用的套接字都是在应用层的。 再说端口号 到一个主机收到一个报文的时候,这个报文中一定存在这个报文需要到的主机的ip号。如果…...
计算机的错误计算(一百五十六)
摘要 探讨 MATLAB 中双曲反余切函数 acoth(x) 在 附近数的计算精度问题。 Acoth(x)函数的定义为 例1. 已知 计算 与 直接贴图吧: 另外,16位的正确值分别为 0.1110083774360105e2 与 -0.1110083774360105e2(ISRealsoft 提供。通过计算…...
爬虫开发工具与环境搭建——开发工具介绍
第二章:爬虫开发工具与环境搭建 第一节 开发工具介绍 爬虫开发需要一些合适的工具和框架来高效地抓取网页数据。在这节中,我们将介绍常用的开发工具,帮助开发者快速搭建爬虫开发环境。 1. Python与爬虫框架选择 Python因其简洁、易学的语法…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
