GD32流水灯

 软件架构思路

驱动层点亮LED,熄灭LED,翻转LED功能

 

 根据上图可知使用的引脚分别是PA8,PE6,PF6流水灯功能的实现要分别初始化这几个引脚

编写流水灯代码

LED.C

#include "gd32f30x.h"                   // Device header
#include "Delay.h"
// 初始化LED灯
void LED_Init(void){
    // 使能RCU时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	// 配置引脚输出频率
	gpio_init( GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);
    
	// 初始化GPIOE的引脚
	rcu_periph_clock_enable(RCU_GPIOE);
	// 配置引脚输出频率
	gpio_init( GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_6);
	
	// 初始化GPIOE的引脚
	rcu_periph_clock_enable(RCU_GPIOF);
	// 配置引脚输出频率
	gpio_init( GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_6);
}

// 实现循环流水灯的功能
void LED_Cycle(void){
	        DelayInit();
	        while(1){
				gpio_bit_set(GPIOA, GPIO_PIN_8); 
				DelayNms(1000);
				gpio_bit_reset(GPIOA, GPIO_PIN_8);
				DelayNms(1000);
				
				gpio_bit_set(GPIOE, GPIO_PIN_6); 
				DelayNms(1000);
				gpio_bit_reset(GPIOE, GPIO_PIN_6);
				DelayNms(1000);
				
				gpio_bit_set(GPIOF, GPIO_PIN_6); 
				DelayNms(1000);
				gpio_bit_reset(GPIOF, GPIO_PIN_6);
				DelayNms(1000);
			}


}



LED.H

#ifndef _LED_H_
#define _LED_H_
// led灯初始化
void LED_Init(void);
// 实现循环流水灯的功能
void LED_Cycle(void);


#endif

Delay.c

#include <stdint.h>
#include "gd32f30x.h"

/**
***********************************************************
* @brief DWT初始化配置
* @param
* @return 
***********************************************************
*/
void DelayInit(void) 
{
	/* 关闭 TRC */
	CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk;
	/* 打开 TRC */
	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;

	/* 关闭计数功能 */
	DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;
	/* 打开计数功能 */
	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

	/* 计数清零 */
	DWT->CYCCNT = 0;
}

/**
***********************************************************
* @brief 微秒级延时函数
* @param nUs,最大延时时间( 2^32 / 内核主频 ) * 10^6 us 
* @return 
***********************************************************
*/
void DelayNus(uint32_t nUs)
{
	uint32_t tickStart = DWT->CYCCNT;

	/* 转换为nUs对应的时钟跳动次数*/
	nUs *= (rcu_clock_freq_get(CK_AHB) / 1000000);

	/* 延时等待 */
	while ((DWT->CYCCNT - tickStart) < nUs);
}

/**
***********************************************************
* @brief 毫秒级延时函数
* @param nMs,延时时间n毫秒
* @return 
***********************************************************
*/
void DelayNms(uint32_t nMs)
{
	for (uint32_t i = 0; i < nMs; i++)
	{
		DelayNus(1000);
	}
}

Delay.h

#ifndef _DELAY_H_
#define _DELAY_H_
void DelayInit(void);
void DelayNus(uint32_t nUs);
void DelayNms(uint32_t nMs);
#endif

main.c

#include <stdint.h>
#include "gd32f30x.h"
#include "Delay.h"
#include "LED.h"

int main(void)
{    
	
    DelayInit();
	LED_Init();
	LED_Cycle();
	while(1){
	   		
	} 
	
}


流水灯代码优化

LED.C

#include "gd32f30x.h"                   // Device header
#include "Delay.h"

// 结构体初始化
typedef struct{
  rcu_periph_enum rcu;
  uint32_t gpio;
  uint32_t pin;
	
}Led_GPIO_t;

// 保存GPIO口的资源信息
static Led_GPIO_t g_gpioList[] = {
      {RCU_GPIOA,GPIOA,GPIO_PIN_8},
	  {RCU_GPIOE,GPIOE,GPIO_PIN_6},
	  {RCU_GPIOF,GPIOF,GPIO_PIN_6},
};
// 获取内存空间的大小
#define LED_NUM_MAX (sizeof(g_gpioList)/sizeof(g_gpioList[0]))


void LedDrv_Init(void){
    uint8_t i = 0;
	for(i = 0; i < LED_NUM_MAX;i++){
	   rcu_periph_clock_enable(g_gpioList[i].rcu);
	   gpio_init(
				g_gpioList[i].gpio,
				GPIO_MODE_OUT_PP,
				GPIO_OSPEED_2MHZ,
				g_gpioList[i].pin
		   );
	   // 熄灭LED灯	
	   gpio_bit_reset(g_gpioList[i].gpio,g_gpioList[i].pin);	
	   
	}
}


void TurnOnLed(uint8_t ledNO){
   if(ledNO >= LED_NUM_MAX){
      return;
   }
   gpio_bit_set(g_gpioList[ledNO].gpio,g_gpioList[ledNO].pin);
};
void TrunOffLed(uint8_t LedOff){
   if(LedOff >= LED_NUM_MAX){
      return;
   }
   gpio_bit_reset(g_gpioList[LedOff].gpio,g_gpioList[LedOff].pin);
};

LED.h

#ifndef _LED_H_
#define _LED_H_

#include <stdint.h>

#define LED1 0
#define LED2 1
#define LED3 2

void LedDrv_Init(void);
// 点亮LED ledNO 标号0-2
void TurnOnLed(uint8_t ledNO);
void TrunOffLed(uint8_t LedOff);




#endif

main.c

#include <stdint.h>
#include "gd32f30x.h"
#include "Delay.h"
#include "LED.h"

uint32_t KeyNum;
uint32_t KEY_Scan(void);
void LED_Trun(void);

int main(void)
{    
	
    DelayInit();
    LedDrv_Init();
	
	while(1){
        TurnOnLed(LED1);
		DelayNms(1000);
		TurnOnLed(LED2);
		DelayNms(1000);
		TurnOnLed(LED3);
		DelayNms(1000);
		
        TrunOffLed(LED1);
		DelayNms(1000);
        TrunOffLed(LED2);
		DelayNms(1000);
        TrunOffLed(LED3);
		DelayNms(1000);
	}
}

使用宏定义加结构体的方式实现led流水灯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值