【嵌入式系统基础第四周作业a】--STM32寄存器&HAL库方式的LED程序

stm32f103c8t6板子点亮流水灯

1.部分原理阐述

1.1地址映射:

为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射

1.2寄存器映射:

给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射

1.3时钟配置:

stm32的时钟是由内部或外部振荡器产生的“频率”,而被人们形象的称为“系统时钟”。最大为72MHz换成周期T为:1/72MHz≈13.9ns。因为耗电量,stm32功能强大,能做很多事,但与之同时带来的消耗也越严重,当stm32不引入时钟的话,就像51一样外设全开,相应耗电就很严重了,所以厂家(st公司)为了解决这个问题,引入了“时钟概念”,即使用哪个外设就给哪个外设时钟(频率),不使用的就关掉(不震荡)。此做法大大降低了功耗,续航持久

1.4输入输出模式设置:

简单来说输出是CPU计算后进行控制,输入是读取后给CPU进行计算。GPIO的工作模式主要有八种,4种输入方式,4种输出方式。分别为输入浮空,输入上拉,输入下拉,模拟输入;输出方式为开漏输出,开漏复用输出,推挽输出,推挽复用输出。

1.5STM32开发板流水灯操作:

其中包含较多寄存器,实现流水灯操作,需要对相应的引脚进行操作

配置时钟使能

配置端口寄存器

配置端口输出寄存器

编写完整程序

烧录程序

运行

2.具体实验过程

2.1配置时钟使能*

基地址

在这里插入图片描述

偏移地址
在这里插入图片描述

2.2配置端口寄存器*

基地址同上

偏移地址

在这里插入图片描述

在这里插入图片描述

2.3配置端口输出寄存器*

在这里插入图片描述

2.4 具体寄存器配置

具体计算讲解:https://blog.csdn.net/geek_monkey/article/details/86291377

#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)

2.5完整程序*

#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
void  Delay_yx( volatile  unsigned  int  time);
void  Delay_yx( volatile  unsigned  int  time)
{
 volatile    unsigned  int  i=0;
    while(time--){
		i = 2000;
		while(i--){
		}
	}
}
int main()
{
	int j=1;
	RCC_AP2ENR|=1<<2;			
	RCC_AP2ENR|=1<<3;			
	RCC_AP2ENR|=1<<4;			
	
	GPIOA_CRL&=0xFF0FFFFF;		
	GPIOA_CRL|=0x00200000;		
	GPIOA_ORD|=1<<5;			
	
	GPIOB_CRH&=0xFFFFFF0F;		
	GPIOB_CRH|=0x00000020;		
	GPIOB_ORD|=1<<9;			
	
	GPIOC_CRH&=0xF0FFFFFF;		
	GPIOC_CRH|=0x02000000;   	
	GPIOC_ORD|=0x1<<14;			
	while(j)
	{	
		GPIOA_ORD&=0x0<<5;		
		Delay_yx(1000);
		GPIOA_ORD|=0x1<<5;		
		Delay_yx(1000);
		
		GPIOB_ORD&=0x0<<9;		
		Delay_yx(1000);
		GPIOB_ORD|=0x1<<9;		
		Delay_yx(1000);
		
		GPIOC_ORD&=0x0<<14;		
		Delay_yx(1000);
		GPIOC_ORD|=0x1<<14;		
		Delay_yx(1000);
	}
}

2.6烧录程序

2.6.1勾选Greate HEX Flie,便于生成hex文件

在这里插入图片描述

2.6.2添加驱动文件,点击Build

在这里插入图片描述

2.6.3在保存文件路径里找到生成的hex文件,一般是在Objects包里
在这里插入图片描述

2.6.4 接线

规则:
在这里插入图片描述
在这里插入图片描述

实践:

在这里插入图片描述

2.6.5烧录程序

把板子置1

在这里插入图片描述

usb接口连接电脑,利用生成的hex文件,在FlyMcu软件上进行烧录

在这里插入图片描述

2.7运行

烧录程序完毕后,拔掉usb接口,将板子置0后,再将板子通电(usb连接电脑)

请添加图片描述

3.总结

本次实验最基础的部分,就是要了并且掌握何为地址映射,寄存器映射,以及如何根据stm32开发手册去配置时钟使能,配置端口寄存器,配置端口输出寄存器

其次就是实践部分,要掌握如何连接线路,如何烧录程序,特别是连接线路,供电的那条线离led灯远了是无法供电的,而且led灯略长的那一脚要接到正极上

本次用到的所有文件保存到百度网盘:

链接:https://pan.baidu.com/s/1BjaLs3CmnX_YZIW2Qly4KA?pwd=x7zw
提取码:x7zw

4.参考

(30条消息) STM32F103C8T6实现流水灯_Tarbet的博客-CSDN博客_stm32f103c8t6

(30条消息) STM32寄存器的简介、地址查找,与直接操作寄存器_yummy说电子的博客-CSDN博客_stm32 寄存器地址

(30条消息) 【嵌入式07】寄存器映射原理详解,GPIO端口的初始化设置步骤_噗噗的罐子的博客-CSDN博客_gpio为什么要初始化

STM 32 —— Hello World(寄存器方式实现流水灯) - ppqppl - 博客园 (cnblogs.com)

STM 32 —— Hello World(寄存器方式实现流水灯) - ppqppl - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值