STM32F4之LED(一)

版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/83828870

STM32芯片最简单的实现,控制流水灯。这里代码逻辑不是重点,看明白内存映射,寄存器映射是关键之处。
/*
重点函数解释
经过GPIO_Set,GPIOx就被设置为我们想要的模式了

void GPIO_Set
(
	GPIO_TypeDef* GPIOx,
	u32 BITx,
	u32 MODE,
	u32 OTYPE,
	u32 OSPEED,
	u32 PUPD
)

GPIO_Set形参意义:
GPIOx:GPIOA~GPIOI 选择GPIO,stm32f429xx.h中给予映射
BITx: 0x0000~0xffff 位设置PIN0~PIN15恳桓鑫淮硪桓鯥O,sys中给予映射
//GPIO引脚编号定义

		#define PIN0				1<<0
		#define PIN1				1<<1
		#define PIN2				1<<2
		#define PIN3				1<<3
		#define PIN4				1<<4
		#define PIN5				1<<5
		#define PIN6				1<<6
		#define PIN7				1<<7
		#define PIN8				1<<8
		#define PIN9				1<<9
		#define PIN10				1<<10
		#define PIN11				1<<11
		#define PIN12				1<<12
		#define PIN13				1<<13
		#define PIN14				1<<14
		#define PIN15				1<<15 

MODE: 模式选择,sys.h中给予映射
GPIO设置专用宏定义

		#define GPIO_MODE_IN    	0		//普通输入模式
		#define GPIO_MODE_OUT		1		//普通输出模式
		#define GPIO_MODE_AF		2		//AF功能模式
		#define GPIO_MODE_AIN		3		//模拟输入模式

OTYPE: 输出类型选择,sys.h中给予映射

		#define GPIO_OTYPE_PP		0		//推挽输出
		#define GPIO_OTYPE_OD		1		//开漏输出 

OSPEED: 输出速度设置,sys.h中给予映射

		#define GPIO_SPEED_2M		0		//GPIO速度2Mhz
		#define GPIO_SPEED_25M		1		//GPIO速度25Mhz
		#define GPIO_SPEED_50M		2		//GPIO速度50Mhz
		#define GPIO_SPEED_100M		3		//GPIO速度100Mhz

PUPD: 上下拉设置,sys.h中给予映射

		#define GPIO_PUPD_NONE		0		//不带上下拉
		#define GPIO_PUPD_PU		1		//上拉
		#define GPIO_PUPD_PD		2		//下拉
		#define GPIO_PUPD_RES		3		//保留 

注意:
startup_stm32f429xx.s需要将官网提供代码进行修改
修改Reset_Handler函数如下:

Reset_Handler	PROC
				EXPORT Reset_Handler		[WEAK]
				;IMPORT SystemInit 
				;寄存器版本代码不需要调用
				;库函数版本代码可以留下
				
				IMPORT __main
					LDR	R0, =0xE000ED88
					LDR R1, [R0]
					ORR	R1, R1, #(0xf << 20)
					STR R1, [R0]
					;LDR R0, =SystemInit
					;BLX R0
					LDR R0, =__main
					BX R0
					ENDP

led.c文件:

#include "led.h"

//LED IO初始化
void LED_Init(void)
{
	//使能PORTB时钟
	RCC -> AHB1ENR |= 1 << 1;
	//根据硬件电路设置PB0、PB1
	GPIO_Set(GPIOB, PIN0|PIN1, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU);
	//LED0关闭
	LED0 = 1;
	//LED1关闭
	LED1 = 1;
}

led.h文件:

#ifndef __LED__HH__
#define __LED__HH__

#include "sys.h"

//定义LED端口
#define LED0 PBout(1)
#define LED1 PBout(0)

/*
这里LED0是接PB1端口
	LED1是接PB0端口
	此处经过define,LED0就是PB1的地址
					LED1就是PB0的地址
	选择端口为输出模式
*/


//LED初始化
void LED_Init(void);

#endif

main.c文件:

#include "sys.h"
#include "delay.h"
#include "led.h"
//这里没有用到usart.h

int main(void)
{
	//设置时钟
	Stm32_Clock_Init(360, 25, 2, 8);
	//初始化延时函数
	delay_init(180);
	//初始化LED
	LED_Init();
	
	while(1)
	{
		LED0 = 0; //LED0亮
		LED1 = 1; //LED1灭
		delay_ms(500);
		LED0 = 1; //LED0灭
		LED1 = 0; //LED1亮
		delay_ms(500);
	}
}

这里重点分析了GPIO设置函数。

扫描二维码关注公众号,回复: 4658161 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_34706280/article/details/83828870