当前位置:网站首页>0基础自学stm32(野火)——什么是寄存器?

0基础自学stm32(野火)——什么是寄存器?

2022-06-22 07:59:00 Fecter11

重点:
存储器映射
寄存器映射

首先学会分辨器件的1号引脚,注意是逆时针旋转。
##先搞清楚芯片内部结构
简略图
官方中文参考手册
“AHB,是Advanced High performance Bus的缩写,高级高性能总线;
APB,是Advanced Peripheral Bus的缩写,高级外设总线。”
在这里插入图片描述

系统结构
在这里插入图片描述

Icode
驱动单元:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
被动单元:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里引用一下
在这里插入图片描述
接下来查看官方数据手册(英文版)

在这里插入图片描述
ARM的内核是32位,那就是2的32次方,也就是4294967296byte(字节),1kb=1024byte,也就是那么就是4194304kB,1mb =1024kb,也就是4096mb,而1gb=1024mb ,最终就是4gb
所以arm内核可以访问4gb内容,arm则将这4g内存分为八块。
在这里插入图片描述
512mb*8=4096mb=4g

在这里插入图片描述

flash就在第一块里面
在这里插入图片描述
我们能够从芯片的外部封装上看出来野火采用的芯片是stm32f103zet6
其中的e代表了512k的flash
在这里插入图片描述
显然只用了一小部分
在这里插入图片描述
重点在于block2外设部分

在这里插入图片描述

存储器映射(重点)
什么是存储器映射?
存储器本身不具备地址信息,他的地址游戏片厂商或者用户分配,给存储器分配地址的过程就是存储器映射

在这里插入图片描述
寄存器映射
以stc51为例

# include <stdio.h>

sbit  LED = P0^0;

void main (void)
{
    
	P0 = 0xfe;
	LED =0;

}

注意看我们使用的P0,就包含在头文件当中,而头文件使用了sfr关键字让P0与对应的寄存器的地址相互对应。

而在stm32中让GPIOB端口的16个引脚输出高电平,要怎么实现??
通过绝对地址访问内存单元
//GPIOB 端口全部输出 高电平

*(unsigned int*(0x40010C0C) = 0xFFFF;

我们找到GPIOB的寄存器起始地址
在这里插入图片描述
在这里插入图片描述
我们查看ODR的地址偏移:0x0C,这里的偏移是相对于刚才找到的寄存器基地址的偏移。因为GPIOB的寄存器不止这一个。
那么GPIOB端口的地址是:GPIOB的基地址+地址偏移
我们就可以对IO进行操作

*(unsigned int*(0x40010C0C) = 0xFFFF;

其中0x40010C0C就是寄存器的地址
对于以上我们需要抓住几个重点:
1:0x40010C0C作为GPIOB输出数据寄存器ODR的地址是人如何找到的?
2:(unsigned int
)的作用是什么?
3:学会使用c语言的“*”号
*

*(unsigned int*(0x40010C0C) = 0xFFFF;

我们先强制转换0x40010C0C作为地址。
如果我们直接写成0x40010C0C = 0xFFFF;编译器并不知道0x40010C0C是地址,所以没法使用。我们就需要强制转换。

显然上面的方法比较麻烦。

通过寄存器别名方式访问内存单元:

//GPIOB端口全部输出高电平
# define GPIOB_ODR (unsigned int*(0x40010C0C) ;
* GPIOB_ODR = 0xFF;

为了操作方便还可以将“*”也定义到寄存器的别名里

//GPIOB端口全部输出高电平
# define GPIOB_ODR *(unsigned int*(0x40010C0C) ;
GPIOB_ODR = 0xFF;
原网站

版权声明
本文为[Fecter11]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Fecter11/article/details/125391587