根据上图可知使用的引脚分别是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){
}
}