#include"stdio.h"
#include"gd32f30x.h"
#include"keydiver.h"
#include "systick.h"
timer_parameter_struct timercfg;
timer_oc_parameter_struct pwmcfg;
float t=0;
float dt=0.02;
float basefreq=0.5;
unsigned short cvs[1000]={0};
void TIMER0_UP_IRQHandler(){
if(timer_interrupt_flag_get(TIMER0,TIMER_INT_FLAG_UP))
{static unsigned int tick=0;
timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP);
//unsigned short cv=timercfg.period*0.5f*( sin(2.0*3.1415f*basefreq*t)+1.0f);
timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,cvs[tick]);
++tick;
if(tick>999){tick=0;}
}
}
int main()
{
int i;
for( i=0;i<1000;++i)
{
unsigned short cv=timercfg.period*0.5f*(sin(2.0f*3.1415f*basefreq*i*dt)+1.0f);
cvs[i]=cv;
}
rcu_periph_clock_enable(RCU_GPIOB);
systick_config();
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
gpio_pin_remap_config(GPIO_TIMER0_PARTIAL_REMAP, ENABLE);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);
gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_13);
rcu_periph_clock_enable(RCU_TIMER0);
timer_struct_para_init(&timercfg);
timercfg.prescaler =2400-1;
timercfg.alignedmode=TIMER_COUNTER_EDGE;
timercfg.counterdirection=TIMER_COUNTER_UP;
timercfg.period=100u-1;
timercfg.clockdivision=TIMER_CKDIV_DIV1;
timercfg.repetitioncounter=0;
timer_init(TIMER0,&timercfg);
pwmcfg.outputstate = (uint16_t)TIMER_CCX_ENABLE;
pwmcfg.outputnstate = TIMER_CCXN_ENABLE;
pwmcfg.ocpolarity = TIMER_OC_POLARITY_HIGH;
pwmcfg.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
pwmcfg.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
pwmcfg.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER0,TIMER_CH_0,&pwmcfg);
timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);
timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,2000);
timer_channel_output_state_config(TIMER0,TIMER_CH_0,ENABLE);
timer_primary_output_config(TIMER0,ENABLE);
timer_enable(TIMER0);
while(1)
{
}
}
要将预分频调低,使定时器HZ变大,频率越大,pwm输出时的横轴就越细,周期越大纵轴越细,100/(120m/2400)=0.002秒,所以中断0.002秒触发一次,然后进入中断后通过改变比较值,使pwm输出不同时间的高低电平,因为时间很短,所以进而看成输出了不同的电压