找回密码
 立即注册
查看: 48|回复: 0

80-利用高级PWMA+PWMB比较中断实现8个定时器,STC32G144K246实验箱演示程序

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-3 17:05:18 | 显示全部楼层 |阅读模式
80-利用高级PWMA+PWMB比较中断实现8个定时器,STC32G144K246实验箱演示程序
主程序main.C代码如下(汇编版本在附件中):


/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/*---------------------------------------------------------------------*/

/*************  功能说明    **************

本例程基于STC32G144K246为主控芯片的实验箱进行编写测试.

利用高级PWMA/PWMB中断实现8个定时器功能.

PWMA的时钟频率为 SYSclk/2
PWMA通道1:定时周期 1ms
PWMA通道2:定时周期 2ms
PWMA通道3:定时周期 4ms
PWMA通道4:定时周期 5ms

PWMB的时钟频率为 SYSclk/10000
PWMB通道1:定时周期 1s
PWMB通道2:定时周期 2s
PWMB通道3:定时周期 3s
PWMB通道4:定时周期 4s

下载时, 选择时钟 48MHz (用户可自行修改频率).

******************************************/

#include "..\comm\STC32G144K246.h"

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

/****************  用户定义宏  ****************/

#define MAIN_Fosc       48000000UL

/****************  本地常量声明  **************/

#define PSCRA           8   //根据主时钟频率和需要定时的周期,设置合适的分频参数
#define PWMA_T1         MAIN_Fosc/PSCRA/1000    //定时周期 1ms(1KHz)
#define PWMA_T2         MAIN_Fosc/PSCRA/500     //定时周期 2ms(500Hz)
#define PWMA_T3         MAIN_Fosc/PSCRA/250     //定时周期 4ms(250Hz)
#define PWMA_T4         MAIN_Fosc/PSCRA/200     //定时周期 5ms(200Hz)

#define PSCRB           10000
#define PWMB_T5         MAIN_Fosc/PSCRB*1       //定时周期 1s
#define PWMB_T6         MAIN_Fosc/PSCRB*2       //定时周期 2s
#define PWMB_T7         MAIN_Fosc/PSCRB*3       //定时周期 3s
#define PWMB_T8         MAIN_Fosc/PSCRB*4       //定时周期 4s

/****************  本地变量声明  **************/

u32 cnt1;
u32 cnt2;
u32 cnt3;
u32 cnt4;
u32 cnt5;
u32 cnt6;
u32 cnt7;
u32 cnt8;

/****************  本地函数声明  **************/

void PWMA_Timer();
void PWMB_Timer();

/****************** 主函数 ********************/
void main(void)
{
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;     //设置为推挽输出
    P4M1 = 0x00;   P4M0 = 0x02;     //设置P4.1为推挽输出

    PWMA_Timer();
    PWMB_Timer();

    P41 = 0;                                //给LED供电
    EA = 1;                         //打开总中断

    while (1);
}

//========================================================================
// 函数: void PWMA_Timer()
// 描述: PWMA配置函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-02-08
//========================================================================
void PWMA_Timer()
{
    PWMA_PSCRH = (u8)((PSCRA-1) >> 8);  //设置预分频器
    PWMA_PSCRL = (u8)(PSCRA-1);
    PWMA_ARRH = 0xff; //设置周期时间
    PWMA_ARRL = 0xff;
    PWMA_CCER1 = 0x00;
    PWMA_CCMR1 = 0x00;
    PWMA_CCMR2 = 0x00;
    PWMA_CCMR3 = 0x00;
    PWMA_CCMR4 = 0x00;
    cnt1 = PWMA_T1;
    cnt2 = PWMA_T2;
    cnt3 = PWMA_T3;
    cnt4 = PWMA_T4;
    PWMA_CCR1H = (u8)(cnt1 >> 8);
    PWMA_CCR1L = (u8)(cnt1);
    PWMA_CCR2H = (u8)(cnt2 >> 8);
    PWMA_CCR2L = (u8)(cnt2);
    PWMA_CCR3H = (u8)(cnt3 >> 8);
    PWMA_CCR3L = (u8)(cnt3);
    PWMA_CCR4H = (u8)(cnt4 >> 8);
    PWMA_CCR4L = (u8)(cnt4);
    PWMA_IER = 0x1e;            //使能比较中断
    PWMA_CR1 |= 0x81;           //使能ARR预装载,开始计时

    cnt1 += PWMA_T1;
    cnt2 += PWMA_T2;
    cnt3 += PWMA_T3;
    cnt4 += PWMA_T4;
}

//========================================================================
// 函数: void PWMB_Timer()
// 描述: PWMB配置函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-02-08
//========================================================================
void PWMB_Timer()
{
    PWMB_PSCRH = (u8)((PSCRB-1) >> 8);  //设置预分频器
    PWMB_PSCRL = (u8)(PSCRB-1);
    PWMB_ARRH = 0xff; //设置周期时间
    PWMB_ARRL = 0xff;
    PWMB_CCER1 = 0x00;
    PWMB_CCMR1 = 0x00;      //设置冻结模式
    PWMB_CCMR2 = 0x00;      //设置冻结模式
    PWMB_CCMR3 = 0x00;      //设置冻结模式
    PWMB_CCMR4 = 0x00;      //设置冻结模式
    cnt5 = PWMB_T5;
    cnt6 = PWMB_T6;
    cnt7 = PWMB_T7;
    cnt8 = PWMB_T8;
    PWMB_CCR5H = (u8)(cnt5 >> 8);
    PWMB_CCR5L = (u8)(cnt5);
    PWMB_CCR6H = (u8)(cnt6 >> 8);
    PWMB_CCR6L = (u8)(cnt6);
    PWMB_CCR7H = (u8)(cnt7 >> 8);
    PWMB_CCR7L = (u8)(cnt7);
    PWMB_CCR8H = (u8)(cnt8 >> 8);
    PWMB_CCR8L = (u8)(cnt8);
    PWMB_IER = 0x1e;        //使能比较中断
    PWMB_CR1 |= 0x81;       //使能ARR预装载,开始计时

    cnt5 += PWMB_T5;
    cnt6 += PWMB_T6;
    cnt7 += PWMB_T7;
    cnt8 += PWMB_T8;
}

//========================================================================
// 函数: PWMA_ISR() interrupt 26
// 描述: PWMA中断函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-12-04
//========================================================================
void PWMA_ISR() interrupt 26
{
    u8 sr;
   
    sr = PWMA_SR1;
    PWMA_SR1 = 0;
   
    if (sr & 0x02)
    {
        PWMA_CCR1H = (u8)(cnt1 >> 8);
        PWMA_CCR1L = (u8)(cnt1);
        cnt1 += PWMA_T1;
        P00 = ~P00;
    }
    if (sr & 0x04)
    {
        PWMA_CCR2H = (u8)(cnt2 >> 8);
        PWMA_CCR2L = (u8)(cnt2);
        cnt2 += PWMA_T2;
        P01 = ~P01;
    }
    if (sr & 0x08)
    {
        PWMA_CCR3H = (u8)(cnt3 >> 8);
        PWMA_CCR3L = (u8)(cnt3);
        cnt3 += PWMA_T3;
        P02 = ~P02;
    }
    if (sr & 0x10)
    {
        PWMA_CCR4H = (u8)(cnt4 >> 8);
        PWMA_CCR4L = (u8)(cnt4);
        cnt4 += PWMA_T4;
        P03 = ~P03;
    }
}

//========================================================================
// 函数: PWMB_ISR() interrupt 27
// 描述: PWMB中断函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-12-04
//========================================================================
void PWMB_ISR() interrupt 27
{
    u8 sr;
   
    sr = PWMB_SR1;
    PWMB_SR1 = 0;
   
    if (sr & 0x02)
    {
        PWMB_CCR5H = (u8)(cnt5 >> 8);
        PWMB_CCR5L = (u8)(cnt5);
        cnt5 += PWMB_T5;
        P04 = ~P04;
    }
    if (sr & 0x04)
    {
        PWMB_CCR6H = (u8)(cnt6 >> 8);
        PWMB_CCR6L = (u8)(cnt6);
        cnt6 += PWMB_T6;
        P05 = ~P05;
    }
    if (sr & 0x08)
    {
        PWMB_CCR7H = (u8)(cnt7 >> 8);
        PWMB_CCR7L = (u8)(cnt7);
        cnt7 += PWMB_T7;
        P06 = ~P06;
    }
    if (sr & 0x10)
    {
        PWMB_CCR8H = (u8)(cnt8 >> 8);
        PWMB_CCR8L = (u8)(cnt8);
        cnt8 += PWMB_T8;
        P07 = ~P07;
    }
}


80-利用高级PWMA PWMB比较中断实现8个定时器.zip (9.12 KB, 下载次数: 5)
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-23 15:13 , Processed in 0.075133 second(s), 44 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表