STM32基础

一.存储器地址重映射
(1)程序的位置放在Flash中

复位之后总是从地址0x04取复位代码的其实地址,以及从地址0x0取堆栈指针,开始执行复位程序
(2)三块可用于启动的存储器物理地址
片上SRAM起始地址:0x20000000
片上用户闪存起始地址:0x08000000
片上系统闪存(bootloader)起始地址:0x1FFF0000
二.位带操作
(1)地址的值对应位带区

[1]Cortex-M3在SRAM区和片上外设区都开有一个1MB的“位带区”和32MB的“位带别名区”。位带别名区的每个字(只有LSB有效)对应位带区的一个比特位(即位与字节像 对应)
[2]对位带别名区没个字的操作最终都变换成对位带区对应比特位的操作。
[3]对位带别名区的访问操作,将原有的“读-改-写”做成一个硬件级别支持的原子操作,不能够被中断打断。

(2)映射地址计算
bit_word_addr=bit_band_base+(yte_offset32)+(bit_number4),指定SRAM上的位带区一个字节上的某一位,对应位带别名区的地址计算公式
bit_band_base:位带别名区的起始地址
byte_offset:包含目标比特位的字节在位带区的偏移值(字节数)
bit_number:目标比特位在字节中的位置(0~7)
内置SRAM区的未带别名区首地址 = 0x22000000
外设寄存器区的位带别名区首地址 = 0x42000000
在SRAM的0x20004000地址定义一个长度为512字节的数组:

pragma location=0x20004000

__root_no_init u8 Buffer[512];
数组首字节的BIT0对应的位带地址为:
0x22000000+(0x400032)+(04)=0x22080000
数组第二个字节的BIT3对应的位带地址为:
0x22000000+(0x400132)+(04)=0x2208002c
GPIOA的端口输出数据寄存器(ODR)地址0x4001080c,对于PA.0来说控制其输出电平的比特位的位带操作地址为:
0x42000000+(0x1080c32)+(04)=0x42210180

例:讲前页数组中的数据通过PA.0端口输出

不使用位带操作:

for(u16 cnt=0;cnt<512;cnt++)
    for(u8 num=0;nm<8;num++)
        if((Buffer[cnt]>>num)&0x01)
            GPIOA->BSRR=1;
        else
            GPIOA->BRR=1;* * 

位带操作:
U32+pBuffer=((u32*)0*22080000)
U16 cnt=512*8;
While(cnt--)
{
  (*((u32*)0*42021018))=*pBuffer++;
}
posted @ 2021-04-08 17:29  肆月黄妙之  阅读(284)  评论(0编辑  收藏  举报