以下是EXTI初始化部分代码:

#include “gd32e23x.h”                   // Device header
void Init_EC11GPIO(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_9);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3);
}
void Init_EC11_EXIT(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_CFGCMP);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4);
nvic_irq_enable(EXTI4_15_IRQn, 0);//因为我们使用的是PB3的中断,所以要选择EXTI4到15这条线,包含了PB3,再设置为优先级0
syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN4);//配置引脚作为外部中断
exti_init(EXTI_4, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//配置为中断模式,下降沿触发
exti_interrupt_flag_clear(EXTI_4);//清除中断标志位
}
以下是中断函数代码,写在gd32e23x_it.c 中:

 

void EXTI4_15_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_4))
{
if (!gpio_input_bit_get(GPIOB, GPIO_PIN_3))//下降沿触发中断后,B引脚为低电平,是反转
{
Close_LED();
}
else//正转
{
Open_LED();
}
exti_interrupt_flag_clear(EXTI_4);
}
}

 



ADC引脚使用的是ADC的外设功能,所以我们需要使用模拟模式,通过查阅芯片的数据手册,我们可以看到PA3引脚对应的是ADC的通道3
#include “gd32e23x.h”                   // Device header
#include “systick.h”
void Init_ADC(void)
{
rcu_periph_clock_enable(RCU_GPIOA);//使用的引脚是PA3,所以要启用GPIOA的外设时钟
rcu_periph_clock_enable(RCU_ADC);//启用ADC时钟
rcu_adc_clock_config(RCU_ADCCK_AHB_DIV3);//给ADC赋为AHB总线的频率分之3,即24MHZ
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3);//将输入的引脚配置为模拟输入,无上下拉电阻
//ADC的数据对齐配置,这里选择右对齐
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
//通道长度
adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);
//ADC外部触发源配置,这里选择软件触发
adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
//外部触发使能
adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
//使能ADC
adc_enable();
//延迟等待使能ADC完成
delay_1ms(1U);
//ADC校准,使ADC采样值更加准确
adc_calibration_enable();
}
//采样函数
uint16_t adc_channel_sample(uint8_t channel)
{
//采样通道配置,会配置转换时间,设置得越快采样精度就越低
adc_regular_channel_config(0U, channel, ADC_SAMPLETIME_239POINT5);
//软件使能转换
adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
//等待转换完成
while(!adc_flag_get(ADC_FLAG_EOC));
//清除标志位
adc_flag_clear(ADC_FLAG_EOC);
//返回采样值
return (adc_regular_data_read());
}

#include “gd32e23x.h”                   // Device header
void Init_PWMOut(void)
{
//定时器输出参数结构体
timer_oc_parameter_struct timer_ocinitpara;
//定时器参数结构体
timer_parameter_struct timer_initpara;
//使能GPIOA的时钟
rcu_periph_clock_enable(RCU_GPIOA);
//配置引脚复用功能
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_2);//AF0对应定时器通道0
//使能定时器14时钟
rcu_periph_clock_enable(RCU_TIMER14);
//复位定时器,保证在配置之前是初始状态
timer_deinit(TIMER14);
//初始化定时器参数结构体,保证其为默认状态
timer_struct_para_init(&timer_initpara);
//定时器参数配置
timer_initpara.prescaler = 71;//定时器的预分频系数,分频后72_000_000/72 = 1000_000Hz
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//边沿对齐模式
timer_initpara.counterdirection = TIMER_COUNTER_UP;//选择向上计数
timer_initpara.period = 999;//周期值
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;//高级定时器功能,时钟分割,这里选择不分割
timer_initpara.repetitioncounter = 0;
timer_init(TIMER14, &timer_initpara);
//初始化通道输出参数结构体
timer_channel_output_struct_para_init(&timer_ocinitpara);//定时器参数复位
//配置输出参数结构体
timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;//使能输出状态
timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;//互补输出,这里不需要,是关闭的
timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH;//有效电平输出-高电平
timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;//互补有效电平输出-高电平
timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;//空闲电平输出-低电平
timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//互补空闲电平输出-低电平
//通道输出配置
timer_channel_output_config(TIMER14, TIMER_CH_0, &timer_ocinitpara);
//通道输出比较值配置
timer_channel_output_pulse_value_config(TIMER14, TIMER_CH_0, 4000);//周期为1000,要配置50%的占空比,所以这里应该填499,即计数从0到499输出低电平,500到999输出高电平
//通道模式配置
timer_channel_output_mode_config(TIMER14, TIMER_CH_0, TIMER_OC_MODE_PWM0);//模式0是0~499输出低电平,模式1是在0~499输出高电平
//通道输出影子模式配置
timer_channel_output_shadow_config(TIMER14, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);//默认打开,我们需要把它关闭
//使能自动重装载计数
timer_auto_reload_shadow_enable(TIMER14);
timer_primary_output_config(TIMER14, ENABLE);//定时器14默认是关闭的,需要提前打开它
//使能定时器14
timer_enable(TIMER14);
}