7、stm32F103入门学习--点亮LED(寄存器操作)(采用结构体方式)

采用结构体方式

在上节课我们只采用了GPIOC,但是有的型号引脚比较多,可以分成A、B、C、D…G组。那么根据下图的写法我们要重复写好几次。大家有发现除了A、B、C、D…G不一样之外,别的基本一样。也就是说GPIOA有7个寄存器控制,GPIOB也是有7个寄存器控制,由此联想到采用结构体。举个例子,一个小区里有A幢楼、B幢楼、、、但是每幢楼的结构层数都一样。
在这里插入图片描述
定义:

typedef unsigned int uint32_t;
typedef struct 
{
	uint32_t CRL;
	uint32_t CRH;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t BRR;
	uint32_t LCKR;
}GPIO_TypeDef;

也就是说把32位的寄存器CRL、CRH、、LCKR组成一个整体,名字叫做 GPIO_TypeDef,在内存中是连续排列的,假设CRL的地址为0x00,那么CRH的地址为0x04,依次排列下去。
在这里插入图片描述
再定义:

#define  GPIOC  ((GPIO_TypeDef*)GPIOC_BASE)

看下(GPIO_TypeDef*)GPIOC_BASE 这条语句,意思是将GPIOC_BASE转换成GPIO_TypeDef类型的地址。上节课中可知GPIOC_BASE的值为0x4001 1000。那么以该地址为基础(0x4001 0C00),CRL的地址为0x4001 0C00,CRH地址为0x4001 1004…依次下去。完全跟我们以前的方式符合!
下图中的“GPIO_CRH”的地址即为0x40011004,那么怎么用结构体表示呢?
在这里插入图片描述
再回到这条语句

#define  GPIOC  ((GPIO_TypeDef*)GPIOC_BASE)

可以用GPIOC->CRH的方式来表示GPIOC_CRH。由于程序小,看不出来优势在哪,以后慢慢体会。那么在main函数中都可以用这种方式来代替。时钟也类似!
在这里插入图片描述
写法跟配置GPIO一样,可以写相应的结构体!

typedef struct 
{
	uint32_t CR;
	uint32_t CFGR;
	uint32_t CIR;
	uint32_t APB2RSTR;
	uint32_t APB1RSTR;
	uint32_t AHBENR;
	uint32_t APB2ENR;
	uint32_t APB1ENR;
	uint32_t BDCR;
	uint32_t CSR;
}RCC_TypeDef;

综上所述,在头文件中进行相应的程序修改,如下:

#define PERIPH_BASE           ((unsigned int)0x40000000) 
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
/* AHB总线基地址 */
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
/*GPIOC外设基地址*/
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)	
 /*RCC外设基地址*/
#define RCC_BASE      (AHBPERIPH_BASE + 0x1000)
typedef unsigned int uint32_t;
typedef struct 
{
	uint32_t CRL;
	uint32_t CRH;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t BRR;
	uint32_t LCKR;
}GPIO_TypeDef;

typedef struct 
{
	uint32_t CR;
	uint32_t CFGR;
	uint32_t CIR;
	uint32_t APB2RSTR;
	uint32_t APB1RSTR;
	uint32_t AHBENR;
	uint32_t APB2ENR;
	uint32_t APB1ENR;
	uint32_t BDCR;
	uint32_t CSR;
}RCC_TypeDef;

#define  GPIOC  ((GPIO_TypeDef*)GPIOC_BASE)
#define  RCC  ((RCC_TypeDef*)RCC_BASE)

在main函数中,进行如下修改:

#include "stm32f10x.h"
int main(void)
{
	RCC->APB2ENR |= 1<<4;
	GPIOC->CRH &=~(0x0F<<(4*5));
	GPIOC->CRH |=(1<<(4*5));
	GPIOC->ODR &=~(1<<13);	
	while(1);
}
void SystemInit()
{
}

经测试完全没有问题!

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32F103C8T6最小系统板是一款常用的单片机开发板,可以通过编程来控制板上的LED点亮。下面是点亮LED的基本步骤: 1. 首先需要准备好开发环境,包括安装好Keil或者其他编译器以及相应的ST-link驱动程序。 2. 在编译器创建一个新工程,选择STM32F103C8T6单片机型号,并添加LED点亮所需的库文件。 3. 在代码引用库文件,并进行相应的初始化设置。例如,设置GPIO口为输出模式,初始化LED引脚为高电平(或低电平,根据具体接法而定)。 4. 在主函数编写LED点亮代码,即将对应的GPIO口设置为低电平(或高电平)即可点亮LED灯。 下面是一个简单的例子代码,仅供参考: ``` #include "stm32f10x.h" //头文件 int main(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //设置GPIO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIO为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO速度 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO while (1) //主循环 { GPIO_SetBits(GPIOB, GPIO_Pin_5); //点亮LED } } ``` 注意事项:以上代码使用的是PB5引脚控制LED,具体控制哪个引脚需要根据自己的实际情况进行修改。另外,由于最小系统板上可能存在其他外设使用了与LED相同的引脚,因此在编写代码前需要先了解清楚板子上各个引脚的功能和使用情况。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值