寄存器&HAL库进行LED流水灯编程

目录

一、实验原理

1.STM32F103C8T6地址映射

2.寄存器寻址

3.GPIO端口初始化

4.程序编写

 二、HAL库实现LED流水灯

1.安装HAL库

三、总结


一、实验原理

1.STM32F103C8T6地址映射

1)储存器映射

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOT,BLOCK等进行一致编址。即用地址来表明目标。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。

2)宏定义使用

#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)

2.寄存器寻址

1)GPIOB基址

GPIO寄存器都在0X4001 0C00到0X4001 0FFF之间


 2)地址映射

GPIO_TypeDef * GPIOx; //定义一个 GPIO_TypeDef 型结构体指针 GPIOx
GPIOx = GPIOA; //把指针地址设置为宏 GPIOA 地址
GPIOx->CRL = 0xffffffff; //通过指针访问并修改 GPIOA_CRL 寄存器

3.GPIO端口初始化

1)时钟配置

时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2。

RCC_APB2ENR|=1<<2|1<<3|1<<4;			//APB2-GPIOA、GPIOB、GPIOC外设时钟使能	`

2)设置GPIO参数:输入输出配置

输入模式:输入浮空,输入上拉,输入下拉,模拟输入。

输出方式:开漏输出,开漏复用输出,推挽输出,推挽复用输出。


一般情况下使用用推免输出模式

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


3)最大速率设置

GPIOA_CRL&=0xFFF0FFFF;		//设置位 清零	
GPIOA_CRL|=0x00020000;		//PA4推挽输出,把第19、18、17、16位变为0010

GPIOB_CRL&=0xFF0FFFFF;		//设置位 清零	
GPIOB_CRL|=0x00200000;		//PB5推挽输出,把第23、22、21、20变为0010
 
GPIOC_CRH&=0xFF0FFFFF;		//设置位 清零	
GPIOC_CRH|=0x00200000;		//PC14推挽输出,把第23、22、21、20变为0010

4.程序编写

1)创建工程

 2)选择开发板

 3)基本设置

 

4)源程序

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

	 

	while(1){
		//A灯
		GPIOA_ODR|=1<<4;		//PB5高电平
	 	Delay();
		GPIOA_ODR&=~(1<<4);		//PB5低电平,因为是置0,所以用按位与


		
		//B灯
		GPIOB_ODR|=1<<5;		//PB5高电平
	 	Delay();
		GPIOB_ODR&=~(1<<5);		//PB5低电平,因为是置0,所以用按位与


		
		
		//C灯
		GPIOC_ODR|=1<<14;		//PB5高电平
	 	Delay();
		GPIOC_ODR&=~(1<<14);		//PB5低电平,因为是置0,所以用按位与


		
		}
}

5)编译运行

 二、HAL库实现LED流水灯

1.安装HAL库

1)安装STM32CubeMX

(1)点击next计入安装程序

(2) 勾选协议并点击next进入下一步

(3) 勾选第一个协议(第二个看自身情况),点击next进入下一步

 (4)选择安装路径,并进入下一步

 (5)同意创建快捷模式,并点击next进入下一步

 (6)等待安装

(7) 完成安装,点击done退出安装程序

 2)安装HAL库

(1)双击进入STM32CubeMX

 (2)点击Help

 (3)选择要安装的版本

 (4)等待安装

 (5)创建工程,选择芯片

 (6)更改参数

SYS

RCC

 GPIO

 (7)点击右上角进入下一步,设置参数

 (8)打开工程

 (9)进入keil

替换主程序

SystemClock_Config();//系统时钟初始化
  MX_GPIO_Init();//gpio初始化
  while (1)
  {		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
		HAL_Delay(1000);//延时1s
	}

(10)设置参数

Target

 Debug

 (11)编译调试

(12)观察逻辑分析仪

(13)烧录实现

三、总结

通过本次学习对STM32F103C8T6芯片的地址映射和寄存器映射原理有了基本认识,了解学习了GPIO端口的初始化三部曲,对烧录实操有了一定基础。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值