STM32点亮LED

刚学STM32,发博客加深自己的记忆,顺便给新学者一些参考
用了几个文件把LED操作都写了
延时:config.c ,config.h

config.h


#ifndef _CONFIG_H
#define _CONFIG_H
#include "stm32f10x.h"


#define BITBAND(addr, bitnum)   ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)      *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 


#define GPIOA_ODR_Addr    (GPIOA_BASE+12) 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12)  
#define GPIOC_ODR_Addr    (GPIOC_BASE+12)  
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12)   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12)     

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8)  
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8)  
 

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)   
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n) 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)   

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n) 

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)   
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  


void delay_us(uint16_t us);
void delay_ms(uint16_t nms);

void Delay(u32 nCount);
void delay_qus(void);

#endif

config.c

#include"config.h"



void delay_us(u16 us)
{
	u8 i;	
	while (us--)
	{
		for(i=8;i>0;i--);		
	}
}


void delay_ms(u16 nms)
{ 	
	while (nms--)
	{
		delay_us(960);
	}            
}

void Delay(u32 nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}


/* 1/4微秒延时函数(含函数调用及返回时间共计耗时约1/4微妙@72MHz主频) */
void delay_qus(void)
{
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
}

bsp_led.h

#ifndef __LED_H
#define	__LED_H


#include"config.h"


/* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
// R-红色
#define LED1_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED1_GPIO_PIN		GPIO_Pin_5			        /* 连接到SCL时钟线的GPIO */

// G-绿色
#define LED2_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED2_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED2_GPIO_PIN		GPIO_Pin_0			        /* 连接到SCL时钟线的GPIO */

// B-蓝色
#define LED3_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED3_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED3_GPIO_PIN		GPIO_Pin_1			        /* 连接到SCL时钟线的GPIO */




/* 使用标准的固件库控制IO*/
#define LED1_OFF          GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_OFF          GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_OFF          GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)

#define LED1_ON         GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_ON         GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_ON         GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)					
			


/* 直接操作寄存器的方法控制IO */
#define	digitalHi(p,i)		  {p->BSRR=i;}	 //输出为高电平		
#define  digitalLo(p,i)		  {p->BRR=i;}	 //输出低电平
#define  digitalToggle(p,i)  {p->ODR ^=i;} //输出反转状态


/* 定义控制IO的宏 */
#define led1_toggle		 digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define led1_off		    digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define led1_on			 digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define led2_toggle		 digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define led2_off		    digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define led2_on			 digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define led3_toggle		 digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define led3_off		    digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define led3_on			 digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)

/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */

//红
#define LED_RED      {LED1_ON;LED2_OFF;LED3_OFF;}

//绿
#define LED_GREEN		{LED1_OFF;LED2_ON;LED3_OFF;}

//蓝
#define LED_BLUE	   {LED1_OFF;LED2_OFF;LED3_ON;}

					
//黄(红+绿)					
#define LED_YELLOW	{LED1_ON;;LED2_ON;LED3_OFF;}


#define LED_PURPLE	{LED1_ON;LED2_OFF;LED3_ON;}



void LED_GPIO_Config(void);

#endif 

bsp_led.c

#include "bsp_led.h"   


void LED_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
		/*选择要控制的GPIO引脚*/
		
		
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	

		/*设置引脚模式为通用推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

		/*设置引脚速率为50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		
		
		/*选择要控制的GPIO引脚*/
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚*/
		
		
		GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);

		/* 关闭所有led灯	*/
		
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);	 
    
    /* 关闭所有led灯	*/
		GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}


main.c

#include "config.h"
#include "bsp_led.h"

main(void)
{	
	/* LED 端口初始化 */
	LED_GPIO_Config();	 

	while (1)
	{

		LED1_ON;			  // 亮
		Delay(0xFFFFFF);
		LED1_OFF;		   // 灭

		LED2_ON;			 // 亮
		Delay(0xFFFFFF);
		LED2_OFF;		   // 灭

		LED3_ON;			 // 亮
		Delay(0xFFFFFF);
		LED3_OFF;		   // 灭	


		/*轮流显示 红绿蓝黄紫青白 颜色*/
		LED_RED;//红
		Delay(0xFFFFFF);
		
		LED_GREEN;//绿
		Delay(0xFFFFFF);
		
		LED_BLUE;//蓝
		Delay(0xFFFFFF);
		
		LED_YELLOW;//黄
		Delay(0xFFFFFF);
		
		LED_PURPLE;//紫
		Delay(0xFFFFFF);
				
	
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白q_5793545

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值