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\n", 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("\n");

#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("*");
    }
}

原文地址:https://www.cnblogs.com/kingboy100/p/12419560.html

时间: 2024-08-30 07:54:07

CH579-PWM Timer的相关文章

Make a DAC with a microcontroller&#39;s PWM timer

Many embedded-microcontroller applications require generation of analog signals. An integrated or stand-alone DAC fills the role. However, you can often use PWM signals for generating the required analog signals. You can use PWM signals to create bot

pwm计时器

1 PWM timer定时器与(watchdog差不多)2 5个16位的定时器,独立的,其中,NO PIN 没有输出.16表示ffff,和ADC中10表示3FF一样.而寄存器都是32位.(以后6410可能变)3 12 M进行了进行了两次分频,一次预分频,一次分频 公式计时器的频率=PCLK/(预值+1)/分频值 预值0~255,分值2,4,8,164 寄存器 TCFG0 15~8 2,3,4 TCFG1 7~0 0,1(选定时器)5 TCON 22 (0对应手动,1对应自动,自动意思是可以执行多

嵌入式学习笔记008-裸奔篇之串口

串口是个好东西,前几篇裸奔程序由于没有串口,自己调试都是有led等来表示的,比较"苦逼",终于可以用串口了~~~,这里主要采用上一篇博文(嵌入式学习笔记007-裸奔篇之定时器),也就是串口也是用中断实现的,而且也只是在前一篇博文增加串口的初始化uart0_init(),以及在中断处理函数增加对串口的处理.只要稍微改造前一篇博文就是一个通用的中断处理程序! 这里主要实现在串口输入一个字符,接受后+2再发送到串口,所以在串口输入a 会返回c---. 由于code都有相应的注释,读者自行查看

嵌入式学习笔记007-裸奔篇之定时器

s3c2440的定时器比较简单,这里主要借鉴韦东山老是的code加以改造一下,一个是对head.S的flow改善,另一个是设置FCLK=400MHZ,比例为1:4:8,试过将SDRAM的HCLK=200MHZ,发现不work,查看我的SDRAM是HY57V561620FLT-H clock = 133MHZ,故设置为100MHZ. 基本上看code及注释应该了解了,就不过多解释了,共有7个文件,如下: head.S init.c interrupt.c main.c Makefile s3c24

S3C2440 裸机程序之音频

mini2440之Main分析 2012-03-17 20:51:29 分类: 嵌入式 /**************************************************************** NAME: u2440mon.c DESC: u2440mon entry point,menu,download HISTORY: Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X. Mar.27.2

uboot————第二阶段start_armboot 函数详解

1:上一节讲到start.S中进行了一系列的SoC相关硬件初始化以后进行了长跳转到start_armboot 函数中: start_armboot进一步初始化board中硬件,并设置了uboot下的命令行.环境变量.基本命令.跳转到kernel 下面详细介绍start_armboot中的代码: ------------------------第一段代码--------------------------------------------- 红色代码为条件编译以后要执行的代码 1 void st

基于JZ2440开发板编写bootloader总结(一)

凡走过必留下痕迹,学点什么都会有用的. 本系列博文总结了自己在学习嵌入式Linux编程过程中的收获,若有错误,恳请指正,谢谢! --参考教材韦东山系列教材 bootloader 是一个用于启动linux内核的C程序,为了达到最终启动内核的目的需要完成以下几个步骤: step1:硬件相关初始化,为启动内核准备硬件平台: step2:将内核从NAND FLASH读取到SDRAM: step3:设置需要传递给内核的启动参数: step4:跳转到SDRAM,运行内核: 下面将详细讲述各个步骤细节: 第一

u-boot-2014.10移植第25天----nand flash启动(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 在实现u-boot从nand flash启动之前,我们将前面asm_led程序放在nand flash第一个块的前4Kbit之中,因为asm_led没有系统初始化功能,所以还需要将bootstrap程序,放在nand flash的0地址处.bootstrap初始化完2440后,跳转到asm_led程序去执行.这对于掌握从n

嵌入式Linux裸机开发(九)——S5PV210定时器

嵌入式Linux裸机开发(九)--S5PV210定时器 S5PV210内部一共有四类定时器. 一.PWM定时器 1.PWM定时简介 S5PV210内部共有5个32bit的PWM定时器.PWM定时器可以生成内部中断.PWM定时器0.1.2.3具有PWM功能,可以驱动外部I/O信号.PWM定时器4是一个无外部引脚的内部定时器.PWM 定时器使用 PCLK_PSYS 作为时钟源. 每个定时器有一个由定时器时钟驱动的32位递减计数器.递减计数器的初始值是由TCNTBn自动装载而获得的.如果递减计数器减到

mini2440之Main分析

/**************************************************************** NAME: u2440mon.c DESC: u2440mon entry point,menu,download HISTORY: Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X. Mar.27.2002:purnnamu: DMA is enabled. Apr.01.2002:pu