上一篇中,我们完成了配置寄存器对引脚进行控制,代码如下

int main()
{*(unsigned int*)0x40021018 |=(1<<4);*(unsigned int*)0x40011004 &=~(0x0F<<(4*5));*(unsigned int*)0x40011004 |=(1<<(4*5));*(unsigned int*)0x4001100C &=~(1<<13);while(1);
}

但显然这么写有不少缺点,首先我们在写代码的过程中需要不断地查阅用户手册来获得地址,并且配置每个引脚时需要写的式子也稍显麻烦,在我们阅读自己的代码时也会造成困难,因此,我们需要将这些代码变成便于我们看懂的东西,思路也非常明显,将难以记忆的地址用名字来代替(宏定义)。

查看用户手册,我们可以将需要用到的寄存器地址与其名称对应起来,例如

#define RCC_APB2ENR *(unsigned int*)0x40021018

这样,我们上面的代码第第一句就可以改写为

RCC_APB2ENR |=(1<<4);

同样的,我们将*(unsigned int*)0x40011004用GPIOC_CRH来表示,将*(unsigned int*)0x4001100C用GPIOC_ODR来表示,完成后,上面的代码就变成了

int main()
{RCC_APB2ENR |=(1<<4);GPIOC_CRH &=~(0x0F<<(4*5));GPIOC_CRH |=(1<<(4*5));GPIOC_ODR &=~(1<<13);while(1);
}

但是我们这么定义的话,会发现工程量很大,需要写上很多的宏定义,因此,我们可以使用结构体来进行定义。例如,GPIOx中有7个寄存器进行使用,那么我们可以这么定义一个结构体:

typedef unsigned int uint32_t;typedef struct
{uint32_t CRL;uint32_t CRH;uint32_t IDR;uint32_t ODR;uint32_t BSRR;uint32_t BRR;uint32_t LCKR;
}GPIO_TypeDef;

这样,我们如果需要用到GPIOC,那么只需要将GPIOC的基地址给这个结构体的首地址,并命名为GPIOC即可

#define GPIOC ((GPIO_TypeDef*)GPIOC_BASE)

有了这个结构体,我们就可以使用例如GPIOC->ODR进行对应寄存器的使用了。

应当注意的是,这里是因为结构体中的变量地址是连续的,并且其中每个寄存器占用的地址与uint32_t一样大,才可以这么写,因此不是所有的结构体里面的元素的大小都是uint32_t的大小,应当根据相应地址大小选择。

现在,我们的代码是:

int main()
{RCC->APB2ENR |=(1<<4);GPIOC->CRH &=~(0x0F<<(4*5));GPIOC->CRH |=(1<<(4*5));GPIOC->ODR &=~(1<<13);while(1);
}

这比我们刚开始写的更好理解我们是使用了哪个时钟和哪个寄存器进行操作。

自己定义显然过于繁琐,因此这些在官方固件库中已经完成了,下载官方固件库就可以使用了。官方固件库可以在ST的官网下载,也可以在下面的分享链接中直接下载。下一篇中说明如何使用。

链接:https://pan.baidu.com/s/1Gu9weENpP0p-Yib-ibrh1Q 
提取码:6dwc

STM32F103-官方固件库相关推荐

  1. STM32F103构建固件库模板(PS固件库文件树介绍)

    参考:STM32F103ZE新建固件库模板 作者:追兮兮 发布时间:2020-10-14 10:31:45 网址:https://blog.csdn.net/weixin_44234294/artic ...

  2. STM32官方固件库

    1 基于标准外设库的软件开发 1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征 ...

  3. STM32如何下载官方固件库

    ST官网拥有好多权威的资料库和例程固件库.在ST官网获取stm32f103c8t6标准例程固件库 1)登陆ST官网 官网参考网页 2)点击右上角登陆或者注册 3)当登陆成功时,点击Products-& ...

  4. STM32官方固件库代码解读--GPIO

    最近闲得无聊,又把 stm32 拿了出来.之前学的时候是看的库函数版本,现在和寄存器版本的一起看感觉比一开始接触的时候看得顺畅多了,详细了解了底层寄存器的功能.之前用 stm32 只是调用函数,看了寄 ...

  5. 【STM32】获取STM32官方固件库

    以STM32F103ZET6为例: 第一步:进入ST官网  http://www.st.com/content/st_com/en.html 第二步:搜索需要下载固件库芯片型号,例如: 第三步:找到对 ...

  6. STM32F103标准固件库寄存器及常用函数整理

    学习STM32其实就是学习它的寄存器以及函数的使用,能用单片机的资源实现自己想要的功能,从最开始的点亮一个led,到使用按键,串口,ADC/DAC,定时器计时计数,输出PWM,驱动电机,使用IIC,S ...

  7. 1、新建基于标准固件库MDK5工程模板(STM32F103ZET6)

    新建基于标准固件库MDK5工程模板 1.STM32官方库文件夹介绍 如上图,是ST官方提供的STM32标准固件库的文件包结构: STM32官方固件库下载地址: "https://www.st ...

  8. 【STM32】新建基于STM32F40x 固件库的MDK5 工程

    00. 目录 文章目录 00. 目录 01. 前提条件 02. 创建工程步骤 03. 系统时钟配置 04. 添加其他功能函数 05. 附录 06. 声明 01. 前提条件 1.1 官方标准固件库 文件 ...

  9. STM32 寄存器库和固件库

    寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制 ...

  10. 结构体在固件库中的应用

    上次介绍了一般结构体的定义以及引用方法,那么接下来将对结构体在官方固件库是如何具体使用的做出简单说明. 结构体指针成员变量引用方法是通过"→"符号来实现,比如要访问student1 ...

最新文章

  1. shell指令可以直接在终端输入吗_shell不是LInux系统的壳吗?咋还能脚本编程了?...
  2. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf
  3. 【DEMO 0074】进程创建与消亡
  4. CSDN Github Markdown编辑常用功能符号补充
  5. 洛谷P1133 教主的花园 动态规划
  6. 時鐘,天氣預報--js
  7. uva10780 - Again Prime? No time
  8. 单链表实例之学生系统
  9. [react] 怎样有条件地渲染组件?
  10. 什么是分布式事务?2PC、XA、3PC、TCC
  11. l2tp pptp相关的一些记录
  12. 狸窝音频剪辑软件_干货资源之精选音频剪辑软件工具
  13. [学习][记录] c++语言:从放弃到入门 <一> c++11新关键字以及引入的新特性
  14. linux 使用rtl8153 USB网卡
  15. windows强制删除文件或者程序
  16. 组合数计算(从1000到1e9的组合数各类求法)
  17. Model性能相关操作:select_related
  18. 用JS生成声音,实现钢琴演奏
  19. kettle中报org.gjt.mm.mysql.Driver 解决办法
  20. python 按键精灵 离线_(番外篇)Python操纵网盘客户端批量离线下载电影

热门文章

  1. 信息安全之完美设置自己的密码
  2. 梅科尔工作室-HarmonyOS应用开发(三)
  3. 金华职业技术学院计算机教研室主任,兰州职业技术学院教研室主任考核办法.PDF...
  4. containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建
  5. Python(自学笔记1)
  6. rust怎么平分东西_腐蚀Rust游戏中有哪些物品 腐蚀Rust游戏所有物品汇总 (3) _游侠网...
  7. 回归返回2个以前标签_《浪姐2》强势回归,兵马未动标签先行,陈好、海清率先“中招”...
  8. 21.面向过程和面向对象
  9. Android单目手势识别,手势交互点亮智博会 微动手势识别技术瞩目C位
  10. 学校用的公寓床都有哪些尺寸?