2.1 系统构架
在小容量、中容量和 大容量产品中,主系统由以下部分构成: ● 四个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus) ─ 通用DMA1和通用DMA2
● 四个被动单元
─ 内部SRAM
─ 内部闪存存储器 ─ FSMC
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备 这些都是通过一个多级的AHB总线构架相互连接的,如下图图1所示:
图1 系统结构
1
在互联型产品中,主系统由以下部分构成: ● 五个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus) ─ 通用DMA1和通用DMA2 ─ 以太网DMA ● 三个被动单元 ─ 内部SRAM
─ 内部闪存存储器
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备 这些都是通过一个多级的AHB总线构架相互连接的,如图2所示: 图2 互联型产品的系统结构
AHB------Advanced High Performance Bus(先进的高性能总线) APB------Advanced Peripheral Bus(先进的外围设配总线)
系统总线时钟关系(缺省配置): Core_Clock = System_Clock = AHB_Clock = APB2_Clock = 72MHz APB1_Clock = AHB_Clock/2 = 36MHz
2
2.2 外设存储器映像
AHB总线外围设配
APB2总线外围设配
3
APB1总线外围设配
2.3 存储器组织
程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。每个模块的功能划分如下:
代码区 0x00000000-0x1FFFFFFF(512MB)
SRAM区 0x20000000-0x3FFFFFFF,其中从0x20000000起始的1M字节可位寻址
4
SRAM位别名区 0x22000000-0x23FFFFFF(32MB)
外设区 0x40000000-0x5FFFFFFF,其中从0x40000000起始的1M字节可位寻址 外设位别名区 0x42000000-0x43FFFFFF(32MB) 外部RAM 0x60000000-0x7FFFFFFF(512MB) 外部RAM 0x80000000-0x9FFFFFFF(512MB) 外部设备 0xA0000000-0xBFFFFFFF(512MB) 外部设备 0xC0000000-0xDFFFFFFF(512MB) 专用外设总线 0xE0000000-0xE00FFFFF(512MB) 系统保留 0xE0100000-0xFFFFFFFF
2.4 可寻址位段
Cortex-M3存储器映射包括两个可寻址位段。它们分别为SRAM 和外设存储区域中的最低的1M字节(8M位)。通过将这些可寻址位段中的一个位映射到别名存储器区中的一个字的方法实现位寻址。
● SRAM可寻址位区
可寻址位区:<0x20000000--0x200FFFFF>1MB(8M位) 别名字区: <0x22000000--0x23FFFFFF>32MB(8M字)
别名字地址 = SRAM别名区基址 + (SRAM变量地址 - SRAM基址)*32 + 4*位号 = 0x22000000 + ((u32)&Variable - 0x20000000)*32 + 4*bn
= SRAM_BB_BASE + ((u32)&Variable - SRAM_BASE)*32 + 4*bn
注:SRAM_BASE和SRAM_BB_BASE定义于 可寻址位区:<0x40000000--0x400FFFFF>1MB(8M位) 别名字区: <0x42000000--0x43FFFFFF>32MB(8M字) 别名字地址=外设别名区基址+(外设寄存器地址-外设存储区基址)*32+ 4*位号 =0x42000000+((u32)&PeriReg-0x40000000)*32+4*bn =PERIPH_BB_BASE+((u32)&PeriReg-PERIPH_BASE)*32+4*bn 注:PERIPH_BASE和PERIPH_BB_BASE定义于 将一个数值写入别名字变量或别名字地址单元时,等同于将该值的最低位(D0)写入到相应的位中。读取一个别名字变量时将返回相应的位值,若被读取位为0,则返回0x00000000,若被读取位为1,则返回0x00000001。 ● SRAM位操作示例 uint32_t EventMask; uint8_t KeyFilter[8]; #define baEventMask\\ (uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32) #define EventMask_0\\ *((uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32 + 4*0)) 5 #define EventMask_1\\ *((uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32 + 4*1)) #define EventMask_2\\ *((uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32 + 4*2)) #define EventMask_12\\ *((uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32 + 4*12)) #define EventMask_25\\ *((uint32_t*)(SRAM_BB_BASE+((u32)&EventMask- SRAM_BASE)*32 + 4*25)) #define baKeyFilter \\ (uint32_t*)(SRAM_BB_BASE+((u32)KeyFilter - SRAM_BASE)*32) *baEventMask = 0; baEventMask[0] = 0; EventMask_0 = 0; *(baEventMask+1) = 1; baEventMask[1] = 1; EventMask_1 = 1; *(baEventMask+25) = 0; baEventMask[25] = 0; EventMask_25 = 0; //将KeyFilter每个元素的第3位清零 { int i; for(i=0; i<8; i++) baKeyFilter[i*8 + 3] = 1; } ● 外设位操作示例 //定义GPIOD输出数据寄存器别名字指针(等同于引脚PD0别名字地址) #define baGPIOD_ODR\\ (uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->ODR)-PERIPH_BASE)*32) //定义GPIOD输出引脚PD0别名字变量 #define PD0_OUT\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->ODR)-PERIPH_BASE)*32+4*0)) //定义GPIOD输出引脚PD5别名字变量 #define PD5_OUT\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->ODR)-PERIPH_BASE)*32+4*5)) 6 //定义GPIOD输出引脚PD9别名字变量 #define PD9_OUT\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->ODR)-PERIPH_BASE)*32+4*9)) //定义GPIOD输出引脚PD12别名字变量 #define PD12_OUT\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->ODR)-PERIPH_BASE)*32+4*12)) //定义定时器1更新中断标志别名变量TIM1_SR_UIF(位于TIM1->SR的第0位) #define TIM1_SR_UIF\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(TIM1->SR)-PERIPH_BASE)*32+4*0)) //定义定时器1通道1输入捕捉和输出比较中断标志别名变量TIM1_SR_CC1IF #define TIM1_SR_CC1IF\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(TIM1->SR)-PERIPH_BASE)*32+4*1)) //定义定时器1通道2输入捕捉和输出比较中断标志别名变量TIM1_SR_CC2IF #define TIM1_SR_CC2IF\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(TIM1->SR)-PERIPH_BASE)*32+4*2)) //定义定时器1通道3输入捕捉和输出比较中断标志别名变量TIM1_SR_CC3IF #define TIM1_SR_CC3IF\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(TIM1->SR)-PERIPH_BASE)*32+4*3)) //定义定时器1通道4输入捕捉和输出比较中断标志别名变量TIM1_SR_CC4IF #define TIM1_SR_CC4IF\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(TIM1->SR)-PERIPH_BASE)*32+4*4)) //位清零 TIM1_SR_UIF = 0; TIM1_SR_CC1IF = 0; TIM1_SR_CC2IF = 0; TIM1_SR_CC3IF = 0; TIM1_SR_CC4IF = 0; //位置位 PD0_OUT = 1; PD5_OUT = 1; PD9_OUT = 1; PD12_OUT = 1; //位复制 PD5_OUT = PD0_OUT; PD9_OUT = PD12_OUT; 7 //位传送和运算 uint32_t TIMx_IREQ; TIMx_IREQ = TIM1_SR_UIF; TIMx_IREQ |= TIM1_SR_CC1IF; TIMx_IREQ |= TIM1_SR_CC2IF; TIMx_IREQ |= TIM1_SR_CC3IF; TIMx_IREQ |= TIM1_SR_CC4IF; PD0_OUT = TIMx_IREQ; //位测试 if(TIM1_SR_UIF) { TIM1_SR_UIF = 0; TIM1_UIF_Proc(); } if(TIM1_SR_CC1IF) { TIM1_SR_CC1IF = 0; TIM1_CH1_ CaptureProc(); } if(TIM1_SR_CC2IF) { TIM1_SR_CC2IF = 0; TIM1_CH1_ CaptureProc(); } //定义GPIOD输入引脚PD1别名字变量 #define PD1_IN\\ *((uint32_t*)(PERIPH_BB_BASE+((u32)&(GPIOD->IDR)-PERIPH_BASE)*32+4*1)) //从引脚输入位串 uint8_t ShiftReg; int i; uint32_t *baShiftReg = (uint32_t *)(SRAM_BB_BASE + ((u32)& ShiftReg – SRAM_BASE)*32); for(i=0; i<8; i++) { ShiftReg = ShiftReg << 1; baShiftReg[0] = PD1_IN; } 8 因篇幅问题不能全部显示,请点此查看更多更全内容