| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路 -> 正文阅读 |
|
[嵌入式]0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路 |
首先,从参考手册可知,程序存储器(flash)、数据存储器(SRAM)、寄存器(外设控制)和输入输出端口被组织在同一个4GB的线性地址空间内。 数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。可访问的存储器空间被分成8个主要块,每个块为512MB。 ?????????说白了,寄存器就是一个有着控制外设能力的存储器单元,我们要使用片上外设的功能,就需要按照规定(参考手册),向这些寄存器中写入对应的二进制数值。 ? ? ? ? 而我们向这些寄存器写入数据,就需要知道它的地址,参考手中也给出了这些寄存器的地址,但是每次写都要查手册就显得太麻烦了,效率低并且容易出错,除了错也不好查。 ? ? ? ? 而如果用别名来指代这些地址,就会降低编程的难度,并且可以提高程序的可读性。C语言用#define 就可以做到。而STM32的库函数其实也是这么做的: ?从STM32的存储器和总线架构可知,外设寄存器都挂在AHB,APB1,APB2这三条总线上,并且在32中的寄存器都是32位的,也就是4个字节,相当于一个Int。而存储器的地址是呈线性的,通过地址偏移的方法,可将每个寄存器的地址都指代为一个名字。 还有一点也很重要,就是同一个外设的寄存器是连续的,这样我们就可以通过定义一个结构体,这个结构体包含了一块连续的内存空间,这个连续内存空间的长度正好和对应外设寄存器的长度相等,这样一来,只要将结构体首地址设置为寄存器的首地址,那么我们对结构体的赋值,就相当于对外设寄存器的赋值。我们就可以提前将设置参数写入一个专用的赋值结构体中,然后用这个结构体的成员来初始化外设寄存器。并且这一步是可以用函数来完成的,只要再函数接口上预留出接口,我们将寄存器地址和结构体地址传入,即可完成对外设寄存器的配置。这就是STM32固件库函数的构建思路。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:46:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |