
目录
一、实验初始化
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 总线基地址
外设名称 外设基地址 相对 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
本文要用到GPIOA,GPIOB,GPIOC。表格是通过查表得出,更多的可以根据大哥的博客看
STM32从地址到寄存器_geekYatao-CSDN博客_stm32寄存器地址
STM32寄存器的简介、地址查找,与直接 *** 作寄存器_geekYatao-CSDN博客_stm32寄存器
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博客
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)