STM32学习笔记

如何访问寄存器

这里我们以端口数据输出寄存器为例。端口输出数据寄存器 若想让端口输出1,就需要在寄存器中输入1。寄存器地址如下,Port B为地址。寄存器地址映射
地址偏移为0c,起始地址0x40010c00,所以寄存器的地址为0x40010c0c。星是取地址符号,如果p是指针(地址),那么*p就是p所指向的变量,(unsigned int星)是强制转化为指针变量。
在这里插入图片描述
但是这种做法也有缺点,就是很麻烦。
于是我们可以这样。在这里插入图片描述
通过宏定义,将地址赋值给GPIOB_ODR,这样我们定义的变量就是一个指针。
在这里插入图片描述
如果这样的话,那么我们定义的变量是指针指向的变量,由于我不清楚到底指向哪里,姑且叫他寄存器变量。

那我我们可以给寄存器下一个定义。
在这里插入图片描述
在这里插入图片描述

STM32寄存器映射

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
以上是数据手册中寄存器的映像,其中三条总线APB1(低速),APB2与AHP(高速),外设就连接在三条总线上。
在这里插入图片描述
外设地址相对总线基地址也就是0x4000 0000的偏移。
在这里插入图片描述
在这里插入图片描述

C语言对寄存器的封装

在这里插入图片描述
想让PB10输出1,那怎么办,我们可以用GPIO_ODR=(1<<10)实现,即1左移了10位。
在这里插入图片描述
这种操作的弊端,第一次给PB10赋1没问题,再想给PB1赋1,那么PB10就被消失了。
那么我们的解决方法就是GPIO_ODR |=(1<<0); 或上1左移0位,或就是加,那么原本的PB10为1的状态就不会消失,同时我们还将PB0赋值为1

在这里插入图片描述
如果我们需要赋值低电平,那么就需要用到与。
GPIO_ODR & =~(1<<10);
1左移10位再取反,那么只有这个是0其余位全是1,或运算之后其余位不变,而目标位变成0。以此实现低电平。

总结一下就是下面:
在这里插入图片描述

由于访问寄存器地址比较麻烦,加之寄存器地址也是连续排列,与C语言结构体类似,于是:
在这里插入图片描述
然后:
在这里插入图片描述
或者使用更先进的方法:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值