找回密码
 立即注册
首页 业界区 安全 STM32寄存器操作、模板构建

STM32寄存器操作、模板构建

后仲舒 昨天 09:30
2024年7月18日 发布于博客园, 本文涉及到STM32F4XX和STM32F1XX系列

目录

  • 外设寄存器查找

    • ① 名称
    • ② 偏移地址
    • ③ 寄存器位表
    • ④ 位功能说明

  • 寄存器基本操作

    • C语言的置位和清零

      • 具体方法

    • 设置GPIO流程
    • 给寄存器赋值
    • 带参数宏

  • STM32F1xx

    • 芯片识别
    • 存储器映射
    • 寄存器映射
    • 让GPIOB端口的16个引脚输出高电平,要怎么实现?
    • STM32寄存器映射
    • C语言对寄存器的封装

  • 新建寄存器(REG)模板

    • 创建工程


外设寄存器查找


在XX 外设的地址范围内,分布着的就是该外设的寄存器。以GPIO 外设为例,GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把GPIO 的引脚连接到LED 灯的阴极,LED 灯的阳极接电源,然后通过STM32 控制该引脚的电平,从而实现控制LED 灯的亮灭。
GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。
1.png

2.png

① 名称

寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSRR)(x=A⋯I)”这段的意思是该寄存器名为“GPIOx_BSRR”其中的“x”可以为A-I,也就是说这个寄存器说明适用于GPIOA、GPIOB 至GPIOI,这些GPIO 端口都有这样的一个寄存器。
② 偏移地址

偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是0x18,从参考手册中我们可以查到GPIOA 外设的基地址为0x4002 0000 ,我们就可以算出GPIOA 的这个GPIOA_BSRR 寄存器的地址为:0x4002 0000+0x18;同理,由于GPIOB 的外设基地址
为0x4002 0400,可算出GPIOB_BSRR 寄存器的地址为:0x4002 0400+0x18 。其他GPIO 端口以此类推即可。
③ 寄存器位表

3.png

紧接着的是本寄存器的位表,表中列出它的0-31 位的名称及权限。表上方的数字为位编号,中间为位名称,最下方为读写权限,其中w 表示只写,r 表示只读,rw 表示可读写。本寄存器中的位权限都是w,所以只能写,如果读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位只读,一般是用于表示STM32 外设的某种工作状态的,由STM32 硬件自动更改,程序通过读取那些寄存器位来判断外设的工作状态。
④ 位功能说明

位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本寄存器中有两种寄存器位,分别为BRy 及BSy,其中的y 数值可以是0-15,这里的0-15 表示端口的引脚号,如BR0、BS0 用于控制GPIOx 的第0 个引脚,若x 表示GPIOA,那就是控制GPIOA 的第0 引脚,而BR1、BS1 就是控制GPIOA 第1 个引脚。
其中BRy 引脚的说明是“0:不会对相应的ODRx 位执行任何操作;1:对相应ODRx 位进行复位”。
这里的“复位”是将该位设置为0 的意思,而“置位”表示将该位设置为1;说明中的ODRx 是另一个寄存器的寄存器位,我们只需要知道ODRx 位为1 的时候,对应的引脚x 输出高电平,为0 的时候对应的引脚输出低电平即可(感兴趣的读者可以查询该寄存器GPIOx_ODR 的说明了解)。所以,如果对BR0 写入“1”的话,那么GPIOx 的第0 个引脚就会输出“低电平”,但是对BR0 写入“0”的话,却不会影响ODR0 位,所以引脚电平不会改变。要想该引脚输出“高电平”,就需要对“BS0”位写入“1”,寄存器位BSy 与BRy 是相反的操作。
4.png

具体查对应的手册和系统库函数的封装, 注意, 要看数据手册, 查找对应的资源才能知道具体的位置. 重点是掌握方法.
寄存器基本操作

C语言的置位和清零

若直接赋值0或1, 会将所有位都变为0或1
例如:*(unsigned int*)(0x40010C0C)=1; 或 *(unsigned int*)(0x40010C0C)=0;
任何数&1,值不变  任何数&0,均为0
故而只对目标位操作
  1. //清零  &=~
  2. //置位  |=
复制代码
具体方法

[code]/*对某寄存器某些位清零*/        // 配置IO口为输出        GPIOB_CRL &=  ~( (0x0f)
您需要登录后才可以回帖 登录 | 立即注册