HC32F120F6TA模拟PWM实现呼吸灯
定时器TIMERB1配置
void timerb2_Config ( void )
{
stc_irq_regi_config_t stcIrqRegiConf;
stc_timerb_init_t stcTimerbInit;
SystemClockConfig2 ( ) ;
CLK_FcgPeriphClockCmd ( CLK_FCG_TIMB2 , Enable) ;
TIMERB_StructInit ( & stcTimerbInit) ;
stcTimerbInit. u16ClkDiv = TIMERB_CLKDIV_DIV512;
stcTimerbInit. u16CntDir = TIMERB_CNT_UP;
stcTimerbInit. u16CntMode = TIMERB_SAWTOOTH_WAVE;
stcTimerbInit. u16HwClearCondition = TIMERB_HWCLEAR_INVALID;
stcTimerbInit. u16HwDownCondition = TIMERB_HWDOWN_INVALID;
stcTimerbInit. u16HwStartCondition = TIMERB_HWSTART_INVALID;
stcTimerbInit. u16HwUpCondition = TIMERB_HWUP_INVALID;
stcTimerbInit. u16OverflowAction = TIMERB_OVERFLOW_COUNT;
stcTimerbInit. u16PeriodVal = 20000000 / 5120000 ;
stcTimerbInit. u16SynStartState = TIMERB_SYNC_START_DISABLE;
TIMERB_Init ( M0P_TMRB2, & stcTimerbInit) ;
TIMERB_IntCmd ( M0P_TMRB2, TIMERB_IT_OVF, Enable) ;
stcIrqRegiConf. enIntSrc = INT_TMRB_2_OVF;
stcIrqRegiConf. enIRQn = Int022_IRQn;
stcIrqRegiConf. pfnCallback = & Timerb2ddUnitOvfIrqCallback;
INTC_IrqRegistration ( & stcIrqRegiConf) ;
NVIC_ClearPendingIRQ ( stcIrqRegiConf. enIRQn) ;
NVIC_SetPriority ( stcIrqRegiConf. enIRQn, DDL_IRQ_PRIORITY_02) ;
NVIC_EnableIRQ ( stcIrqRegiConf. enIRQn) ;
TIMERB_Start ( M0P_TMRB2) ;
}
中断函数
static void TimerbOddUnitOvfIrqCallback ( void )
{
static int k = 0 , flag = 0 , PWM= 0 ;
k ++ ;
if ( t == 100 )
t = 0 ;
if ( n == 100 )
{
n = 0 ;
if ( flag == 0 )
{
PWM ++ ;
if ( PWM == 100 )
flag = 1 ;
}
else if ( flag == 1 )
{
PWM -- ;
if ( PWM == 0 )
flag = 0 ;
}
}
if ( t < PWM)
{
GPIO_ResetPins ( GPIO_PORT_2, GPIO_PIN_5) ;
GPIO_ResetPins ( GPIO_PORT_2, GPIO_PIN_6) ;
GPIO_ResetPins ( GPIO_PORT_2, GPIO_PIN_7) ;
}
else
{
GPIO_SetPins ( GPIO_PORT_2, GPIO_PIN_5) ;
GPIO_SetPins ( GPIO_PORT_2, GPIO_PIN_6) ;
GPIO_SetPins ( GPIO_PORT_2, GPIO_PIN_7) ;
}
TIMERB_ClearFlag ( M0P_TMRB1, TIMERB_FLAG_OVF) ;
}
LED初始化
void LED_Config ( void )
{
stc_gpio_init_t stcGpioInit;
stcGpioInit. u16PinMode = PIN_MODE_OUT ;
stcGpioInit. u16PinState = PIN_STATE_RESET ;
stcGpioInit. u16ExInt = PIN_EXINT_ON ;
stcGpioInit. u16Invert = PIN_INVERT_OFF ;
stcGpioInit. u16Latch = PIN_LATCH_OFF ;
stcGpioInit. u16PinDrv = PIN_NORMAL_DRV;
stcGpioInit. u16PinIType = PIN_ITYPE_SMT;
stcGpioInit. u16PinOType = PIN_OTYPE_CMOS;
stcGpioInit. u16PullUp = PIN_PU_OFF ;
GPIO_Init ( GPIO_PORT_2, GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_7, & stcGpioInit) ;
}
系统时钟初始化
static void SystemClockConfig2 ( void )
{
stc_clk_xtal_init_t stcXTALInit;
stcXTALInit. u8XtalState = CLK_XTAL_ON;
stcXTALInit. u8XtalMode = CLK_XTALMODE_OSC;
stcXTALInit. u8XtalDrv = CLK_XTALDRV_HIGH;
stcXTALInit. u8XtalSupDrv = CLK_XTAL_SUPDRV_OFF;
stcXTALInit. u8XtalStb = CLK_XTALSTB_8;
CLK_XTALInit ( & stcXTALInit) ;
CLK_SetSysclkSrc ( CLK_SYSCLKSOURCE_XTAL) ;
}
主函数
int32_t main ( void )
{
LED_Config ( ) ;
timerb1_Config ( ) ;
while ( 1 )
{
}
原理图
参考文档