一、寄存器是什么?
寄存器是中央处理器内的组成部分。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的一个空间器物。寄存器可能存放的是指令、数据或地址。
二、寄存器地址映射和寄存器映射原理
寄存器地址映射
地址映射:由百度词条可知为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。
寄存器映射原理
由于32位的STM32最大寻址能力位32位,那么2^32为4GB,于是只要拿到这个内核进行外设的时候内存均不能超过4GB。并且在这4GB内,ARM已经进行了分类
找到端口偏移地址以及对应端口所在位置
2、输入输出模式设置
我们这次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A5、B9、C14三个引脚。其中A5属于端口配置低寄存器偏移地址为0x00,B9、C14属于端口配置高寄存器偏移地址为0x04。
配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL ((unsigned volatile int)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL ((unsigned volatile int)0x40010C04)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH ((unsigned volatile int)0x40011004)
设置输出模式为推挽输出,输出速度为2Mhz
GPIOA_CRL&=0xFF0FFFFF; //设置位 清零
GPIOA_CRL|=0x00020000; //PA4推挽输出,把第23、22、21、20位变为0010
GPIOB_CRL&=0xFFFFFF0F; //设置位 清零
GPIOB_CRL|=0x00200000; //PB5推挽输出,把第7、6、5、4变为0010
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x00200000; //PC14推挽输出,把第27、26、25、24变为0010
打开keil软件,写入代码。
#include “stm32f10x.h”
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR ((unsigned volatile int)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL ((unsigned volatile int)0x40010800)
#define GPIOA_ODR ((unsigned volatile int)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRH ((unsigned volatile int)0x40010C04)
#define GPIOB_ODR ((unsigned volatile int)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH ((unsigned volatile int)0x40011004)
#define GPIOC_ODR ((unsigned volatile int)0x4001100C)
//延时函数
void Delay()
{
u32 i=0;
for(;i<2000000;i++);
}
int main(void)
{
RCC_APB2ENR|=1<<2; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
RCC_APB2ENR|=1<<3; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
RCC_APB2ENR|=1<<4;
GPIOA_CRL&=0xFF0FFFFF; //设置位 清零
GPIOA_CRL|=0x00300000; //PA5推挽输出,把第23、22、21、20位变为0010
GPIOA_ODR |= 1<<5; //设置初始灯为灭
GPIOB_CRH&=0xFFFFFF0F; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出,把第7、6、5、4变为0010
GPIOB_ODR |= 1<<9; //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x02000000; //PC14推挽输出,把第27、26、25、24变为0010
GPIOC_ODR |= 1<<14; //设置初始灯为灭
while(1){
//A灯 //PA5高电平
GPIOA_ODR&=~(1<<5); //PA5低电平,因为是置0,所以用按位与
Delay();
GPIOA_ODR|=1<<5;
//B灯 //PB9高电平
GPIOB_ODR&=~(1<<9); //PB9低电平,因为是置0,所以用按位与
Delay();
GPIOB_ODR|=1<<9;
//C灯
GPIOC_ODR&=~(1<<14); //PC14低电平,因为是置0,所以用按位与
Delay();
GPIOC_ODR|=1<<14; //PC14高电平
}
}
void SystemInit(void){
}
硬件连接
线路相连
我们需要准备一个面包板、若干电线、stm32f103c8t6、三个灯泡、还有一个USB转TTL。
烧录
这里我们烧录使用FlyMcu
链接:https://pan.baidu.com/s/12UomcMAAA9TyRzrLIKpWzw
提取码:swsj
如果没有驱动还需要安装,这里我们的USB芯片是,下面是他的驱动
链接:https://pan.baidu.com/s/1wo4uBUXfqkJFprhOlSfBNg
提取码:swsj
这时候我们已经接好线了,需要先将boot0调到1,boot1调到0
*结果:
*
QQ短视频20221011151120