首先呢!好记性不如烂笔头,随着工作了块 1 年、逐渐发现了代码积累的重要性
那么从今天、记录整理自己写的一些驱动
Led.c
#include "led.h" | |
//***********************************************************// | |
// led 呼吸灯 | |
// 通过 Led 这个结构体便可以快捷的改变呼吸灯的闪烁速率 | |
//Led.Control.Set_Speed (10);// 例如这样 | |
// flechazo.mba | |
//***********************************************************// | |
Led_Struct Led; | |
/*********************************************************** | |
*@fuction :vledInit | |
*@brief :led 呼吸灯的初始化 | |
*@param :void | |
*@return :void | |
*@author :flechazo (flechazo.mba) | |
*@date :2023-05-21 | |
***********************************************************/ | |
void vledInit(void) | |
{ | |
/* RCU */ | |
rcu_periph_clock_enable(LED_RCU_GPIOx); | |
/* GPIO */ | |
gpio_init(LED_GPIOx, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, LED_GPIO_PIN_x); | |
/* TIMER */ | |
timer_oc_parameter_struct timer_ocintpara; | |
timer_parameter_struct timer_initpara; | |
rcu_periph_clock_enable(LED_RCU_TIMERx); | |
timer_deinit(LED_TIMERx); | |
/* LED_TIMERx configuration */ | |
timer_initpara.prescaler = 0; | |
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; | |
timer_initpara.counterdirection = TIMER_COUNTER_UP; | |
timer_initpara.period = LED_SPEED_COMPARENUMBER; | |
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; | |
timer_initpara.repetitioncounter = 0; | |
timer_init(LED_TIMERx, &timer_initpara); | |
timer_ocintpara.outputstate = TIMER_CCX_ENABLE; | |
timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE; | |
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; | |
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; | |
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; | |
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; | |
timer_channel_output_config(LED_TIMERx, LED_TIMER_CH_x, &timer_ocintpara); | |
timer_channel_output_pulse_value_config(LED_TIMERx, LED_TIMER_CH_x, Led.config.pwmdata);//pwmdata | |
timer_channel_output_mode_config(LED_TIMERx, LED_TIMER_CH_x, TIMER_OC_MODE_PWM0); | |
timer_channel_output_shadow_config(LED_TIMERx, LED_TIMER_CH_x, TIMER_OC_SHADOW_DISABLE); | |
timer_primary_output_config(LED_TIMERx, ENABLE); | |
nvic_irq_enable(TIMER2_IRQn, 2, 0); | |
timer_interrupt_enable(LED_TIMERx, TIMER_INT_UP); | |
timer_auto_reload_shadow_enable(LED_TIMERx); | |
timer_enable(LED_TIMERx); | |
/* Init */ | |
Led.config.ledSpeed = LED_SPEED_USER; | |
Led.Control.Set_Speed = vledSetSpeed; | |
} | |
/*********************************************************** | |
*@fuction :vledToggle | |
*@brief :led 的状态反转 | |
*@param :bool 类型的状态 status | |
*@return :void | |
*@author :flechazo (flechazo.mba) | |
*@date :2023-05-21 | |
***********************************************************/ | |
void vledToggle(bool status) | |
{ | |
status ? gpio_bit_reset(LED_GPIOx, LED_GPIO_PIN_x) : gpio_bit_set(LED_GPIOx, LED_GPIO_PIN_x); | |
} | |
/*********************************************************** | |
*@fuction :vledSetSpeed | |
*@brief : 通过这个函数即可方便的改变呼吸灯的速度 | |
*@param :speed 速度 | |
*@return :void | |
*@author :flechazo (flechazo.mba) | |
*@date :2023-05-21 | |
***********************************************************/ | |
void vledSetSpeed(uint32_t speed) | |
{ | |
Led.config.ledSpeed = speed; | |
} | |
/*********************************************************** | |
*@fuction :vledWork | |
*@brief :Led 的比较计算 | |
*@param :void | |
*@return :void | |
*@author :flechazo (flechazo.mba) | |
*@date :2023-05-21 | |
***********************************************************/ | |
void vledWork(void) | |
{ | |
if(!Led.pwmflag) | |
{ | |
if(Led.config.pwmdata >= LED_SPEED_COMPARENUMBER) | |
{ | |
if((++Led.config.SpeedCount) >= (2000 * Led.config.ledSpeed)) | |
{ | |
Led.config.SpeedCount = 0; | |
Led.pwmflag = true; | |
} | |
} | |
else | |
{ | |
if((++Led.config.SpeedCount) >= (Led.config.ledSpeed)) | |
{ | |
Led.config.pwmdata++; | |
Led.config.SpeedCount = 0; | |
} | |
} | |
} | |
else | |
{ | |
if(Led.config.pwmdata <= 0) | |
{ | |
if((++Led.config.SpeedCount) >= (1000 * Led.config.ledSpeed)) | |
{ | |
Led.config.SpeedCount = 0; | |
Led.pwmflag = false; | |
} | |
} | |
else | |
{ | |
if((++Led.config.SpeedCount) >= (Led.config.ledSpeed)) | |
{ | |
Led.config.pwmdata--; | |
Led.config.SpeedCount = 0; | |
} | |
} | |
} | |
} | |
void TIMER2_IRQHandler(void) | |
{ | |
timer_flag_clear(LED_TIMERx, TIMER_FLAG_UP); | |
vledWork(); | |
timer_channel_output_pulse_value_config(LED_TIMERx, LED_TIMER_CH_x, Led.config.pwmdata); | |
} |
Led.h
#ifndef __LED_H | |
#define __LED_H | |
#include "gd32f30x.h" | |
#include <stdbool.h> | |
#define LED_RCU_GPIOx RCU_GPIOB | |
#define LED_GPIOx GPIOB | |
#define LED_GPIO_PIN_x GPIO_PIN_0 | |
#define LED_RCU_TIMERx RCU_TIMER2 | |
#define LED_TIMERx TIMER2 | |
#define LED_TIMER_CH_x TIMER_CH_2 | |
#define LED_SPEED_COMPARENUMBER 0x7FF | |
enum{ | |
LED_SPEED_USER = 4, | |
LED_SPEED_TEST = 2, | |
LED_SPEED_ADMIN = 0, | |
}; | |
typedef struct | |
{ | |
uint32_t pwmdata; | |
uint32_t ledTime; | |
uint32_t ledSpeed; | |
uint32_t SpeedCount; | |
} ledConfig_struct; | |
typedef struct | |
{ | |
void (*Set_Speed)(uint32_t Speed); | |
} ledControl_struct; | |
typedef struct{ | |
bool pwmflag; | |
ledConfig_struct config; | |
ledControl_struct Control; | |
}Led_Struct; | |
void vledInit(void); | |
void vledToggle(bool status); | |
void vledSetSpeed(uint32_t speed); | |
#endif //__LED_H |