目录
一、实验初始化
1.地址映射和寄存器映射
1.1 总线基地址
1.2 外设基地址
1.3?外设寄存器地址?
1.4接线
?1.5 程序下载
?二、用C语言寄存器实现流水灯
?2.1 工程文件
2.1.1 main.c
2.1.2加入设备
?2.2 编译生成hex文件
2.4 实验结果
三、心得
?四、参考文献
一、实验初始化
1.地址映射和寄存器映射
1.1 总线基地址
总线名称 | 总线基地址 | 相对外设基地址的偏移 |
---|
APB1 | 0x4000 0000 | 0x0 | APB2 | 0x4001 0000 | 0x0001 0000 | AHB | 0x4001 8000 | 0x0001 8000 |
1.2 外设基地址
外设名称?? ?外设基地址?? ?相对 APB2 总线的地址偏移 GPIOA?? ?0x4001 0800?? ?0x0000 0800 GPIOB?? ?0x4001 0C00?? ?0x0000 0C00 GPIOC?? ?0x4001 1000?? ?0x0000 1000 GPIOD?? ?0x4001 1400?? ?0x0000 1400 GPIOE?? ?0x4001 1800?? ?0x0000 1800 GPIOF?? ?0x4001 1C00?? ?0x0000 1C00 GPIOG?? ?0x4001 2000?? ?0x0000 2000
1.3?外设寄存器地址?
本文要用到GPIOA,GPIOB,GPIOC。表格是通过查表得出,更多的可以根据大哥的博客看
?STM32从地址到寄存器_geekYatao-CSDN博客_stm32寄存器地址
STM32寄存器的简介、地址查找,与直接操作寄存器_geekYatao-CSDN博客_stm32寄存器
寄存器名称 | 寄存器地址 | 相对GPIOA基址的偏移 | GPIOA_CRL | 0x4001 0800 | 0x00 | GPIOA_CRH | 0x4001 0804 | 0x04 | GPIOA_IDR? | 0x4001 0808 | 0x08 | GPIOA_ODR | 0x4001 080C | 0x0C | GPIOA_BSRR | 0x4001 0810 | 0x10 | GPIOA_BRR | 0x4001 0814 | 0x14 | GPIOA_LCKR | 0x4001 0818 | 0x18 |
1.4接线
1.4.1 将串口USB转TTL线与stm32核心板连接如图所示
?1.4.2 并且要设.BOOT0 与 BOOT1 配置启动方式。?
BOOT1=x?? ?BOOT0=0?? ?从用户闪存启动,这是正常的工作模式。? BOOT1=0?? ?BOOT0=1?? ?(ISP方式)从系统存储器启动,这种模式启动的程序功能由厂家设置。 BOOT1=1?? ?BOOT0=1?? ?从内置SRAM启动,这种模式可以用于调试.
如下图箭头所示
?1.5 程序下载
?烧录文件的时候要按一下reset。如下图
?二、用C语言寄存器实现流水灯
?2.1 工程文件
2.1.1 main.c
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRH *((unsigned volatile int*)0x40010804)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
//------------------------主函数--------------------------
int main()
{
int j=100;
RCC_AP2ENR|=1<<2; //APB2-GPIOA外设时钟使能
RCC_AP2ENR|=1<<3; //APB2-GPIOB外设时钟使能
RCC_AP2ENR|=1<<4; //APB2-GPIOC外设时钟使能
//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
GPIOA_CRH&=0xFFF0FFFF; //设置位 清零
GPIOA_CRH|=0x00020000; //PA12推挽输出
GPIOA_ORD|=1<<12; //设置初始灯为亮
GPIOB_CRL&=0xFFFFFF0F; //设置位 清零
GPIOB_CRL|=0x00000020; //PB1推挽输出
GPIOB_ORD|=1<<1; //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x02000000; //PC14推挽输出
GPIOC_ORD|=1<<14; //设置初始灯为灭
while(j)
{
GPIOA_ORD=0x1<<12; //PA12高电平
Delay_ms(3000000);
GPIOA_ORD=0x0<<12; //PA12低电平
Delay_ms(3000000);
GPIOB_ORD=0x1<<1; //PB1高电平
Delay_ms(3000000);
GPIOB_ORD=0x0<<1; //PB1低电平
Delay_ms(3000000);
GPIOC_ORD=0x1<<14; //PC14高电平
Delay_ms(3000000);
GPIOC_ORD=0x0<<14; //PC14低电平
Delay_ms(3000000);
}
}
2.1.2加入设备
?2.2 编译生成hex文件
点击软件中的魔法棒,然后点击output,如下图
2.4 实验结果
?
三、心得
? 本次实验用硬件仿真,来使得led灯闪灭,本次实验感觉就是代码很复杂,里面定义的引脚呀上面的很多,感觉更复杂,感觉看完了之后就忘了,然后烧录的过程还是挺好的,没有代码复杂,本来还说用汇编的,感觉看不明白就没搞了,学艺不精,还待提升。
?四、参考文献
stm32花式点流水灯_星&&河的博客-CSDN博客
?STM32寄存器的简介、地址查找,与直接操作寄存器_geekYatao-CSDN博客_stm32寄存器
?STM32从地址到寄存器_geekYatao-CSDN博客_stm32寄存器地址
基于汇编和C语言STM32流水灯依次闪烁_Laul Ken-Yi的博客-CSDN博客
|