CH579-PWM Timer
Posted kingboy100
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CH579-PWM Timer相关的知识,希望对你有一定的参考价值。
PWM
1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : Main.c 3 * Author : WCH 4 * Version : V1.0 5 * Date : 2018/12/15 6 * Description : PWM4-11功能演示 7 *******************************************************************************/ 8 9 #include "CH57x_common.h" 10 11 12 int main() 13 { 14 15 /* 配置GPIO */ 16 GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeOut_PP_5mA); // PA6 - PWM4 17 GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); // PA7 - PWM5 18 GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); // PB0 - PWM6 19 GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeOut_PP_5mA); // PB1 - PWM7 20 GPIOB_ModeCfg(GPIO_Pin_2, GPIO_ModeOut_PP_5mA); // PB2 - PWM8 21 GPIOB_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA); // PB3 - PWM9 22 GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); //PB14 - PWM10 23 // GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA); //PB23 - PWM11 此脚复用为外部复位脚,需要关闭此功能才能开启PWM功能 24 25 PWMX_CLKCfg( 4 ); // cycle = 4/Fsys 26 PWMX_CycleCfg( PWMX_Cycle_64 ); // 周期 = 64*cycle 27 PWMX_ACTOUT( CH_PWM4, 64/4, Low_Level, ENABLE); //25% 占空比 28 PWMX_ACTOUT( CH_PWM5, 64/4, Low_Level, ENABLE); //25% 占空比 29 PWMX_ACTOUT( CH_PWM6, 64/4, Low_Level, ENABLE); //25% 占空比 30 PWMX_ACTOUT( CH_PWM7, 64/4, Low_Level, ENABLE); //25% 占空比 31 PWMX_ACTOUT( CH_PWM8, 64/4, Low_Level, ENABLE); //25% 占空比 32 PWMX_ACTOUT( CH_PWM9, 64/4, Low_Level, ENABLE); //25% 占空比 33 PWMX_ACTOUT( CH_PWM10, 64/4, Low_Level, ENABLE); //25% 占空比 34 35 while(1); 36 }
Timer
/********************************** (C) COPYRIGHT ******************************* * File Name : Main.c * Author : WCH * Version : V1.0 * Date : 2019/4/28 * Description : 定时器例子 *******************************************************************************/ #include "CH57x_common.h" __align(4) UINT32 CapBuf[100]; volatile UINT8 capFlag = 0; void DebugInit(void) { GPIOA_SetBits(GPIO_Pin_9); GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); UART1_DefInit(); } int main() { UINT8 i; /* 配置串口调试 */ DebugInit(); PRINT( "Start @ChipID=%02X ", R8_CHIP_ID ); #if 0 /* 定时器0,设定100ms定时器进行IO口闪灯, PB3-LED */ GPIOB_SetBits( GPIO_Pin_3 ); GPIOB_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA ); TMR0_TimerInit( FREQ_SYS/10 ); // 设置定时时间 100ms TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断 NVIC_EnableIRQ( TMR0_IRQn ); #endif #if 1 /* 定时器3,PWM输出 */ GPIOA_ResetBits( GPIO_Pin_2 ); // 配置PWM口 PA2 GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA ); TMR3_PWMInit( High_Level, PWM_Times_1 ); TMR3_PWMCycleCfg( 3200 ); // 周期 100ms TMR3_PWMActDataWidth( 1000 ); // 占空比 50% #endif #if 1 /* 定时器1,CAP捕捉, */ PWR_UnitModCfg( DISABLE, UNIT_SYS_LSE ); // 注意此引脚是LSE晶振引脚,要保证关闭才能使用其他功能 GPIOA_ResetBits( GPIO_Pin_10 ); // 配置PWM口 PA10 GPIOA_ModeCfg( GPIO_Pin_10, GPIO_ModeIN_PU ); TMR1_CapInit( Edge_To_Edge ); TMR1_CAPTimeoutCfg( 0xFFFFFFFF ); // 设置捕捉超时时间 TMR1_DMACfg( ENABLE, (UINT16)&CapBuf[0], (UINT16)&CapBuf[100], Mode_Single ); TMR1_ITCfg(ENABLE, TMR1_2_IT_DMA_END); // 开启DMA完成中断 NVIC_EnableIRQ( TMR1_IRQn ); while( capFlag == 0 ); capFlag = 0; for( i=0; i<100; i++ ) { printf("%08ld ", CapBuf[i]&0x1ffffff); // bit26 最高位表示 高电平还是低电平 }printf(" "); #endif while(1); } void TMR0_IRQHandler( void ) // TMR0 定时中断 { if( TMR0_GetITFlag( TMR0_3_IT_CYC_END ) ) { TMR0_ClearITFlag( TMR0_3_IT_CYC_END ); // 清除中断标志 GPIOB_InverseBits( GPIO_Pin_3 ); } } void TMR1_IRQHandler( void ) // TMR1 定时中断 { if( TMR1_GetITFlag( TMR1_2_IT_DMA_END ) ) { TMR1_ITCfg(DISABLE, TMR1_2_IT_DMA_END); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。 TMR1_ClearITFlag( TMR1_2_IT_DMA_END ); // 清除中断标志 capFlag = 1; printf("*"); } }
以上是关于CH579-PWM Timer的主要内容,如果未能解决你的问题,请参考以下文章