网站开发与设计前景,注册公司取名字,网站优化入门免费教程,seo排名系统源码存储器区域功能划分 4GB 的地址空间中#xff0c;ARM 已经粗线条的平均分成了 8 个块#xff0c;每块 512MB#xff0c;每个块也都规定了用途#xff0c;具体分类见表格 6-1。每个块的大小都有 512MB#xff0c;显然这是非常大的#xff0c;芯片厂商在每个块的范围内设计…存储器区域功能划分 4GB 的地址空间中ARM 已经粗线条的平均分成了 8 个块每块 512MB每个块也都规定了用途具体分类见表格 6-1。每个块的大小都有 512MB显然这是非常大的芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完都是只用了其中的一部分而已。
有 3个块非常重要也是我们最关心的三个块。Block0用来设计成内部 FLASHBlock1 用来设计成内部 RAMBlock2 用来设计成片上的外设。
寄存器映射
当我们控制这些单元时就可以驱动外设工作我们可以找到每个单元的起始地址然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址不好记忆且易出错。这时我们可以根据每个单元功能的不同以功能为名给这个内存单元取一个别名这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射。
0x4001 0C0C在我们看来是 GPIOB端口 ODR的地址但是在编译器看来这只是一个普通的变量是一个立即数要想让编译器也认为是指针我们得进行强制类型转换把它转换成指针即(unsigned int *)0x4001 0C0C然后再对这个指针进行 * 操作。刚刚我们说了通过绝对地址访问内存单元不好记忆且容易出错我们可以通过寄存器的方式来操作。 Bit-banding简称 位带有人也叫 位段。支持位带操作后可以使用普通的加载/存储指令来 对单一的比特进行读写。
很多朋友是从学习51单片机过来的都知道P1.1这个引脚可以单独控制我们操作的这个引脚就是一个Bit位。
我们都知道在STM32中 不能直接操作寄存器的某一个Bit位比如单独控制PA端口输出数据寄存器中的ODR1。
STM32F1内核 Cortex-M3早就考虑到了这个问题 为了能达到直接操作ODR1 这类Bit位就在内核中开辟了一块地址区域 位带别名 可以将ODR1这类Bit位 位带区映射到 位带别名区域对应的地址只需要操作映射后的 地址就可以实现操作这个ODR1位了。
在Cortex-M3中有 两个区实现了位带操作其中一个是 SRAM区的最低 1MB 范围第二个则是片内外设区的最低 1MB 范围。 位带操作
相比直接操作寄存器代码更简洁运行效率更高。避免在多任务或中断时出现紊乱等。 偏移地址例如GPIOA
#define GPIOA_IDR *(unsigned int *)(0x400108000x08 0x40010808)
取出PA3的值
unsigned char PA3 GPIOA_IDR 0x08 复位值代表寄存器默认值或者初始值。