四、使用寄存器点亮第一个LED

一、LED模块电路

所使用的的LED模块为共阳极

LED模块电路图

二、STM32启动文件

对于启动文件这部分我们主要总结它的功能,不详细讲解里面的代码,其功能如下:

1、初始化堆栈指针SP;

2、初始化程序计数器指针PC;

3、设置堆、栈的大小;

4、设置中断向量表的入口地址;

5、配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM) ;

6、调用SystemInit () 函数配置STM32的系统时钟。设置C库的分支入口“_main”(最终用来调用main函数);
启动文件startup_stm32f10x_hd.s在安装目录中有,可以手动查找,添加到工程目录中。启动文件都是用汇编语言编写的。

三、编写点亮一个LED程序

我们所要实现的功能是:点亮第一个LED,即D1指示灯亮要操作STM32寄存器,我们就需要使用C语言对其封装,这部分程序我们都放在stm32f10x.h中。

由电路图可知LED1连接的是PC0端口,我们要将PC0端口置零,则导通,LED灯亮起
首先找到GPIO是挂载到那一条总线上,即Block2总线,所有的片内外设都在Block2上面

#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE +0x00010000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPTOC_BASE+0x14)
#define GPIOC_LCKR *(uunsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)

在对任何外设进行操作前,一定要开启对应外设的时钟,只有开启了时钟,才能对外设进行设置。

如果编码时,Keil5写注释汉字显示为??,可以百度https://jingyan.baidu.com/article/7082dc1c281faee40a89bda1.html进行更改设置

#include "stm32f10x.h"

void SystemInit()
{
	
}

int main()
{
	//1.开启GPIOC的端口时钟
	RCC_APB2ENR |=1<<4;//或运算是为了防止对其它位的干扰
	
	//2.设置工作模式
	//推挽输出
	GPIOC_CRL&=~(unsigned)(0x0f<<(4*0));//4*0表示第0个管脚,第一个管脚就是4*1,每四位控制一个引脚
	GPIOC_CRL|=(0x03<<(4*0));//设置输出模式为50MHz
	
	//3.设置引脚输出为0,点亮LED
	GPIOC_BSRR=(0x1<<(16+0));
	while(1)
	{
		
	}	
}

还可以实现闪烁功能:

#include "stm32f10x.h"
typedef unsigned int u32;
void delay(u32);
void SystemInit(void);

void SystemInit()
{
	
}
void delay(u32 i)
{
	while(i--);
}
int main()
{
	//1.开启GPIOC的端口时钟
	RCC_APB2ENR |=1<<4;//或运算是为了防止对其它位的干扰
	
	//2.设置工作模式
	//推挽输出
	GPIOC_CRL&=~(unsigned)(0x0f<<(4*0));//4*0表示第0个管脚,第一个管脚就是4*1,每四位控制一个引脚
	GPIOC_CRL|=(0x03<<(4*0));//设置输出模式为50MHz
	
	//3.设置引脚输出为0,点亮LED
	GPIOC_BSRR=(0x1<<(16+0));
	while(1)
	{
		GPIOC_BSRR=(1<<(16+0));//点亮LED
		delay(0xfffff);//延时
		GPIOC_BSRR=(1<<(0));//关闭LED
		delay(0xfffff);
	}
	
}

注意在输出中可以查看编译文件的大小:

猜你喜欢

转载自blog.csdn.net/qq_40836442/article/details/109538791