STM32使用寄存器方式实现流水灯

一.GPIO端口初始化

1.配置时钟使能

(1).通过查阅数据手册可知RCC(复位和时钟控制)地址范围。
在这里插入图片描述
(2).查找端口端口偏移地址以及对应端口所在位置
在这里插入图片描述

其中IOPxEN(x对应A,B,C,D等)为对应IO端口x使能

2.配置端口输出寄存器

(1).查询端口寄存器基地址
本次实验使用PA4,PB5,PC13这3个引脚控制LED灯,因此我们需要找到GpioA,GpioB,GpioC的基地址
在这里插入图片描述
查阅数据手册可知:GPIOA的寄存器地址在0x4001 0800到0x4001 0BFF范围内;GPIOB的寄存器地址在0x4001 0C00到0x4001 0FFF范围内;GPIOC的寄存器在0x4001 1000到0x4001 13FF范围内。
(2).查询端口输出寄存器地址偏移
其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。
在这里插入图片描述

在这里插入图片描述
(3).设置相应端口地址

//----------------配置GPIOA寄存器 -----------------------
#define GPIOA_CRL		*((unsigned volatile int*)0x40010800)
//----------------配置GPIOA寄存器 -----------------------
#define GPIOB_CRL		*((unsigned volatile int*)0x40010C00)
//----------------配置GPIOC寄存器 -----------------------
#define GPIOC_CRH		*((unsigned volatile int*)0x40011004)

3.输入输出模式设置

我们需要的是输出高低电平,再加上开漏输出要外接上拉电阻,所以要设置为推勉输出。

GPIOA_CRL&=0xFFF0FFFF;		//设置位 清零	
GPIOA_CRL|=0x00020000;		//PA4推挽输出

GPIOB_CRL&=0xFF0FFFFF;		//设置位 清零	
GPIOB_CRL|=0x00200000;		//PB5推挽输出
 
GPIOC_CRH&=0xF0FFFFFF;		//设置位 清零	
GPIOC_CRH|=0x00200000;		//PC13推挽输出

二.c语言实现

1.创建工程
创建项目
在这里插入图片描述
选择stm32f103c8
在这里插入图片描述
配置如下
在这里插入图片描述

2.写入代码

#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_CRL		*((unsigned volatile int*)0x40010C00)
#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<10000000;i++);
 }
 int main(void)
 {	
	RCC_APB2ENR|=1<<2|1<<3|1<<4;			//APB2-GPIOA、GPIOB、GPIOC外设时钟使能	
	
	GPIOA_CRL&=0xFFF0FFFF;		//设置位 清零	
	GPIOA_CRL|=0x00020000;		//PA4推挽输出
	GPIOA_ODR&=~(1<<4);			//设置初始灯为灭
	
	GPIOB_CRL&=0xFF0FFFFF;		//设置位 清零	
	GPIOB_CRL|=0x00200000;		//PB5推挽输出
	GPIOB_ODR&=~(1<<5);			//设置初始灯为灭
	 
	GPIOC_CRH&=0xF0FFFFFF;		//设置位 清零	
	GPIOC_CRH|=0x00200000;		//PC13推挽输出
	GPIOC_ODR&=~(1<<13);			//设置初始灯为灭		
	 

	 

	while(1){
		//A灯
		GPIOA_ODR|=1<<4;		//PB5高电平
	 	Delay();
		GPIOA_ODR&=~(1<<4);		//PB5低电平


		
		//B灯
		GPIOB_ODR|=1<<5;		//PB5高电平
	 	Delay();
		GPIOB_ODR&=~(1<<5);		//PB5低电平

		
		
		//C灯
		
		GPIOC_ODR&=~(1<<13);		//PB5低电平
	 	Delay();
		GPIOC_ODR|=1<<13;		//PB5高电平


		
		}
}

3.编译运行
在这里插入图片描述

三.程序烧录

1.烧录
在编译后会生成hex文件在object文件夹内,此时连接电脑,开启flyMCU,上传hex文件到stm32f103c8t6内
在这里插入图片描述

读取器件信息,确认flash空间
在这里插入图片描述

开始编程
在这里插入图片描述

烧录完毕
在这里插入图片描述

四.硬件连接及实现效果

1.线路连接
USB转TTL接口连接如下:
3.3v与GND连接供电,TXD接PA10,RXD接PA9。
2.实际效果
在这里插入图片描述
实物连接如下:
在这里插入图片描述

五.总结

在本次使用寄存器方式实现流水灯,让我明白了在仿真操作和实际使用硬件进行操作存在很多区别的,实际上手使用硬件操作让我学到更多的基础知识;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值