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的主要内容,如果未能解决你的问题,请参考以下文章

CH559L单片机PWM功能和示例介绍

CH559L单片机PWM功能和示例介绍

jsp基础语言-jsp代码段

STM32 Timer 定时器分类和框图

为啥ip片段必须是8字节的倍数

通过CH340G驱动的Nano ATMEAG328P驱动板初步测试