C语言STM32流水灯依此闪烁

C语言STM32流水灯依此闪烁,第1张

C语言STM32流水灯依此闪烁

目录

一、实验初始化

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 总线基地址 总线名称总线基地址相对外设基地址的偏移APB10x4000 00000x0APB20x4001 00000x0001 0000AHB0x4001 80000x0001 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_CRL0x4001 08000x00GPIOA_CRH0x4001 08040x04GPIOA_IDR 0x4001 08080x08GPIOA_ODR0x4001 080C0x0CGPIOA_BSRR0x4001 08100x10GPIOA_BRR0x4001 08140x14GPIOA_LCKR0x4001 08180x18 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博客

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4751810.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-08
下一篇2022-11-08

发表评论

登录后才能评论

评论列表(0条)

    保存