[应用相关] stm32f10x单片机寄存器认识了解

[复制链接]
1248|32
 楼主| 自动化陈稳 发表于 2021-4-26 10:30 | 显示全部楼层 |阅读模式
本章了解知识有  stm32中文参考手册的2.3 小节 存储器映像    RCC时钟控制寄存器   GPIO

目标是自己编写一个简单的寄存器地址映射程序,来控制GPIO口输出高低电平

首先来简单的介绍一下控制stm32IO口的基本操作


 楼主| 自动化陈稳 发表于 2021-4-26 10:43 | 显示全部楼层
1.时钟初始化

2.配置GPIO模式

3.控制GPIO端口输出

 

时钟初始化  我们需要控制的是GPIOB.5端口  我们可以从下图了解到GPIOB端口是挂载到APB2总线上面的,需要初始化时钟的话就需要用到RCC寄存器  而RCC寄存器是挂载到AHB总线上的,所以接下来我们需要了解一下它们的地址。
 楼主| 自动化陈稳 发表于 2021-4-26 10:45 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-4-26 10:50 | 显示全部楼层
先来看2.3节的存储器映像图  每一个外设的功能都对应一个地址我们直接操作的话不方便每次操作都需要来查看手册所以我们自己定义一个映射的话操作起来就要方便很多。当然我这里只是简单的定义一下我们用32的话还是要用库函数因为这些地址的映射工作已经有人给您完成了,有白票的为什么不用。当然自己操作一下的话更容易理解,首先我们看到它对应的地址非常多我们没必要每一个都要去映射只需要映射我们要用到的寄存器就可以了。 
 楼主| 自动化陈稳 发表于 2021-4-26 10:51 | 显示全部楼层
1.我们看APB1的首地址是  0x4000 0000  在程序中就可以这样定义

  1. #define PERIPH_BASE           ((unsigned int)0x40000000)//强制转换为32位的
 楼主| 自动化陈稳 发表于 2021-4-26 10:54 | 显示全部楼层
2.在看一下APB2的首地址是 0x4001 0000 是不是跟我们定义的APB1的地址多了 0x1 0000  那么在程序中就是这样写
  1. /*APB2 总线基地址 */
  2. #define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
 楼主| 自动化陈稳 发表于 2021-4-26 10:55 | 显示全部楼层
我们看见我们要使用的GPIOB端口就是挂载在APB2总线上面的  它比APB2地址多了 0xc00
  1. /*GPIOB外设基地址*/
  2. #define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
 楼主| 自动化陈稳 发表于 2021-4-26 10:57 | 显示全部楼层
3.后面还有一个AHB的地址要定义 这个地址我们从 0x4002 0000 这个地址定义起走
 楼主| 自动化陈稳 发表于 2021-4-26 10:59 | 显示全部楼层
  1. /* AHB总线基地址 */
  2. #define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
 楼主| 自动化陈稳 发表于 2021-4-26 11:01 | 显示全部楼层
还有RCC的地址需要映射
  1. /*RCC外设基地址*/
  2. #define RCC_BASE      (AHBPERIPH_BASE + 0x1000)
 楼主| 自动化陈稳 发表于 2021-4-26 11:01 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-4-26 11:05 | 显示全部楼层
总结一下刚刚我们把 APB1  APB2  AHB  RCC  GPIOB的地址映射了接下来我们还需要映射几个地址
 楼主| 自动化陈稳 发表于 2021-4-26 11:08 | 显示全部楼层
RCC时钟寄存器我们了解一下 通过这里找到  RCC_APB2ENR寄存器还需要映射
9444860862e0ab96db.png
 楼主| 自动化陈稳 发表于 2021-4-26 11:09 | 显示全部楼层
下图中的偏移地址我们需要注意它的意思就是基于RCC的偏移地址

  1. /*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
  2. #define RCC_APB2ENR                 *(unsigned int*)(RCC_BASE+0x18)//这里是把这个数据强制转换为一个32位的指针地址   unsigned int  就是转换为32位的意思
 楼主| 自动化陈稳 发表于 2021-4-26 11:10 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-4-26 16:41 | 显示全部楼层
时钟部分我们介绍完了现在要讲解一下GPIO初始化了(首先初始化我们要知道使用的那几个寄存器)
下图我们了解到配置寄存器是    GPIOx_CRL,   GPIOx_CRH
9793360867cbfe52e1.png
 楼主| 自动化陈稳 发表于 2021-4-26 16:43 | 显示全部楼层
我们来详细的了解一下  图中我们需要了解的就是偏移地址
  1. /* GPIOB寄存器地址,强制转换成指针 */
  2. #define GPIOB_CRL                        *(unsigned int*)(GPIOB_BASE+0x00)
  3. #define GPIOB_CRH                        *(unsigned int*)(GPIOB_BASE+0x04)
 楼主| 自动化陈稳 发表于 2021-4-26 16:44 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-4-26 16:45 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-4-26 16:47 | 显示全部楼层
GPIO端口初始化好了我们还需要知道那个寄存器是控制它输出的   通过下图知道这三个寄存器可以控制输出。
2840760867e30003a3.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1380

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部