目录
4.启动文件在会调用外部声明的SystemInit函数用于始终初始化,
寄存器相关介绍
什么是寄存器
给有特定功能的内存单元取一个别名,这个别名就是我们常说的寄存器
寄存器映射
寄存器映射就是对芯片里面的某个具有特殊功能的内存单元取一个别名的过程就叫寄存器映射
存储器映射
给存储器分配地址的过程叫做存储器映射,再分配地址叫做重映射
寄存器编程
以STM32里面让PF口输出高电平为例:
寄存器映射
对寄存器的封装
#define GPIOF_BASE (0x40021400)
#define GPIOF_MODER *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_OTYPER *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_OSPEEDR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_PUPDR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_IDR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_ODR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_BSRR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_LCKR *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_AFRL *( unsigned int *)(GPIOF_BASE+0X00)
#define GPIOF_AFRH *( unsigned int *)(GPIOF_BASE+0X00)
如果每个外设都像上面这样定义,这会让代码变得相当繁琐
我们可以定义一个结构体将这些用到的寄存器放入结构体中
这样定义刚好名字与寄存器相对应并且所占的内存排列分别都是完全对应的
#define GPIOF (uint32_t *)GPIOF_BASE;
这样定义GPIOF仅指向了基地址,无法指向整个外设所有寄存器,如果定义成结构体类型指针(如下)则可以指向整个外设所有寄存器
#define GPIOF (GPIO_TypeDef *)GPIOF_BASE;
如果想对ODR寄存器进行操作这可以这样操作:
GPIOF->ODR =0xFFFF;
新建工程-寄存器版-使用keil5建立一个工程
新建工程
1.新建工程
2.新建两个文件
3.添加启动文件到工程中
4.启动文件在会调用外部声明的SystemInit函数用于始终初始化,
5.自己先定义 SystemInit函数来骗过编译器
6.仿真器调试
点灯代码
//RCC GPIOB
*(unsigned int *)0x40021018 |=(1<<3);
//配置IO口为输出
*(unsigned int *)0X40010C00 |=(1<<(4*0));//置位|=
//ODR寄存器
*(unsigned int *)0X40010C0C &=~(1<<0);//清零&=