day2 开发环境平台搭建

Corter - M0存储器映射

 SOC中CPU访问各个外部部件是通过每个部件的编号(地址)访问的;

CPU给各个部件分配地址的过程称之为映射;

Corter - M0 为32位,所以其给部件分配的地址范围为0 - 4Gb(2^32);

4GB的空间会有相应分段,相应部件在对应分段内

day2 开发环境平台搭建_第1张图片

 

STM32存储器映射

day2 开发环境平台搭建_第2张图片

如何访问寄存器

以GPIOA寄存器组为例,如何读取ODR寄存器?

已知GPIOA的起始地址为0x48000000,个寄存器的偏移地址为:

寄存器                    地址偏移量

MODER;             /*Address offset: 0x00 */

OTYPER;           /*Address offset: 0x04 */

OSPEEDR;        /*Address offset: 0x08 */

PUPDR;            /*Address offset: 0x0C */

IDR;                  /*Address offset: 0x10 */

ODR;               /*Address offset: 0x14 */

BSRR;              /*Address offset: 0x18 */

LCKR;             /*Address offset: 0x1C *

寄存器访问方式1:

对地址进行宏定义;

#define GPIOA_BASE ((unsigned int) 0x48000000)
#define GPIOA_ODR (GPIOA_BASE + 0x14

//读操作
val = *(unsigend int*)GPIOA_ODR;

//写操作
*(unsigend int*)GPIOA_ODR = val;

/*改进**/
#define GPIOA_ODR (*(unsigned int *)(GPIOA_BASE + 0x14))

val = GPIOA_ODR;
GPIOS_ODR = VAL;

 访问寄存器方式2

用结构体封装寄存器;

typedef struct {
uint32_t		MODER;      /*Address offset: 0x00 */
uint32_t		OTYPER; 	/*Address offset: 0x04 */
uint32_t		OSPEEDR; 	/*Address offset: 0x08 */
uint32_t		PUPDR;	 	/*Address offset: 0x0C */
uint32_t		IDR; 		/*Address offset: 0x10 */
uint32_t		ODR; 		/*Address offset: 0x14 */
uint32_t		BSRR; 		/*Address offset: 0x18 */
uint32_t		LCKR; 		/*Address offset: 0x1C */
} GPIO_TypeDef;

#define GPIOA_BASE ( (unsigned int ) 0x48000000 )
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器

GPIOA->MODER     =  0x20 ; 

GPIOA->OSPEEDR  =  0x16 ;

STM32启动文件分析

day2 开发环境平台搭建_第3张图片

 注:Cortex-M0 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP,第二个字为复位向量,它表示程序执行的起始地址(复位处理)

 STM32F0启动模式

启动模 式选择
BOOT1 BOOT0 启动模式 说明
x 0 主闪存存储器 主闪存存储器选为启动区域
1 1 系统存储器

系统存储器选为启动区域

0 1 内置SRAM 内置SRAM选为启动区域

根据启动模式的不同,用户闪存、系统闪存和SRAM都可以映射到0x0的低端地址;
 

day2 开发环境平台搭建_第4张图片

 day2 开发环境平台搭建_第5张图片

 

 

你可能感兴趣的:(LV23物联网ARM,开发,linux,c语言,嵌入式,stm32,arm)