stm32学习笔记1:寄存器的映射

#映射
重新取一个名字
##e.g.令PF输出高电平
让PF口对应地址对应的口(就是PF口)等于0xffff
地址:查找参考文件,地址是40021400偏移14=40021414

*(unsigned int * 40021414) = 0xffff;

即可,由于查找地址过于麻烦,可以预先宏定义

#define GPIOF_ODR *(unsigned int * 40021414)

给地址取别名,就可以直接给io口配置高低电平
取别名的过程就是映射
#c语言对寄存器的封装
每一个io口对应以下寄存器
1.端口模式寄存器MODER 32位
2.输出类型寄存器OTYPER 32位
3.输出速度寄存器OSPEEDR 32位
4.上拉下拉寄存器PUPDR 32位
5.输入数据寄存器IDR 32位
6.输出数据寄存器ODR 32位
7.置位复位寄存器BSRR 32位
8.配置锁定寄存器LCKR 32位
9.复用低位寄存器AFRL 16位
10.复用高位寄存器AFRH 16位
每八位一个字节,因此偏移量是4,4+4,4+4+4,4+4+4+4,4+4+4+4+4,4+4+4+4+4+4,4+4+4+4+4+4+4,4+4+4+4+4+4+4+4,4+4+4+4+4+4+4+4+2,4+4+4+4+4+4+4+4+2+2
定义时

#define GPIOF_MODER *(unsigned int * 40021400)
#define GPIOF_OTYPER *(unsigned int * 40021404)
#define GPIOF_OSPEEDR *(unsigned int * 40021408)
#define GPIOF_PUPDR *(unsigned int * 4002140C)
#define GPIOF_IDR *(unsigned int * 40021410)
#define GPIOF_ODR *(unsigned int * 40021414)
/*……此后省略……*/

相对麻烦
显然,所有寄存器在地址里顺序排列,在c语言中,结构体变量在地址里顺序排列
故,可以定义

typedef unint32_t unsigned int
typedef unint16_t unsigned short int
struct GPIO
{
uint32_t MODER;
uint32_t OTYPER;
uint32_t OSPEEDR;
uint32_t PUPDR; 
uint32_t IDR; 
uint32_t ODR; 
uint32_t BSRR; 
uint32_t LCKR; 
uint16_t AFRL; 
uint16_t AFRH; 
} GPIO_Typedef;

在此之后,所有GPIO的定义就可以

#define GPIOA (GPIO_Typedef*)GPIOA_BASE
#define GPIOB (GPIO_Typedef*)GPIOB_BASE
#define GPIOC (GPIO_Typedef*)GPIOC_BASE
#define GPIOD (GPIO_Typedef*)GPIOD_BASE
#define GPIOE (GPIO_Typedef*)GPIOE_BASE
#define GPIOF (GPIO_Typedef*)GPIOF_BASE

这样,GPIOX_BASE 可以指向X的io口整个结构体,但是,在这之前,要先确保GPIOX_BASE的地址是对应io的地址

#define GPIOA_BASE *(unsigned int * 40020000)
#define GPIOB_BASE *(unsigned int * 40020400)
#define GPIOC_BASE *(unsigned int * 40020800)
#define GPIOD_BASE *(unsigned int * 40020C00)
#define GPIOE_BASE *(unsigned int * 40021000)
#define GPIOF_BASE *(unsigned int * 40021400)

此时就完成了寄存器的封装。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值