- 打卡等级:常住居民II
- 打卡总天数:80
- 最近打卡:2026-07-23 09:36:34
已绑定手机
版主
- 积分
- 1081
|
79-利用高级PWMA+PWMB更新中断实现2个定时器,STC32G144K246实验箱演示程序
主程序main.C代码如下(汇编版本在附件中):
/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com -----------------------------------------*/
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
本例程基于STC32G144K246为主控芯片的实验箱进行编写测试.
利用高级PWMA/PWMB中断实现定时器功能.
定时周期 = ((PWMx_PSCR + 1) * (PWMx_ARR + 1)) / SYSclk.
下载时, 选择时钟 48MHz (用户可自行修改频率).
******************************************/
#include "..\comm\STC32G144K246.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/**************** 用户定义宏 ****************/
#define MAIN_Fosc 48000000UL
/**************** 本地函数声明 **************/
void PWMA_Timer(u32 timer);
void PWMB_Timer(u32 timer);
/****************** 主函数 ********************/
void main(void)
{
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P4M1 = 0x00; P4M0 = 0xc0; //P4.6,P4.7设置为推挽输出
PWMA_Timer(1000); //1ms
PWMB_Timer(5000000); //5s
EA = 1; //打开总中断
while (1);
}
//========================================================================
// 函数: void PWMA_Timer(u32 timer)
// 描述: PWMA配置函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-02-08
//========================================================================
void PWMA_Timer(u32 timer)
{
u16 psc=1;
timer *= (MAIN_Fosc / 1000000); //timer us
while(timer > 65535L)
{
psc *= 2;
timer >>= 1;
}
timer--;
psc--;
//定时周期 = ((PWMx_PSCR + 1) * (PWMx_ARR + 1)) / SYSclk
PWMA_ARRH = (u8)(timer >> 8); //设置周期时间
PWMA_ARRL = (u8)(timer);
PWMA_PSCRH = (u8)(psc >> 8); //设置预分频器
PWMA_PSCRL = (u8)(psc);
PWMA_IER = 0x01; //使能更新中断
PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时
}
//========================================================================
// 函数: void PWMB_Timer(u32 timer)
// 描述: PWMB配置函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-02-08
//========================================================================
void PWMB_Timer(u32 timer)
{
u16 psc=1;
timer *= (MAIN_Fosc / 1000000); //timer us
while(timer > 65535L)
{
psc *= 2;
timer >>= 1;
}
timer--;
psc--;
//定时周期 = ((PWMx_PSCR + 1) * (PWMx_ARR + 1)) / SYSclk
PWMB_ARRH = (u8)(timer >> 8); //设置周期时间
PWMB_ARRL = (u8)(timer);
PWMB_PSCRH = (u8)(psc >> 8); //设置预分频器
PWMB_PSCRL = (u8)(psc);
PWMB_IER = 0x01; //使能更新中断
PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时
}
//========================================================================
// 函数: PWMA_ISR() interrupt 26
// 描述: PWMA中断函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-12-04
//========================================================================
void PWMA_ISR() interrupt 26
{
PWMA_SR1 = 0;
P46 = ~P46; //翻转测试IO口
}
//========================================================================
// 函数: PWMB_ISR() interrupt 27
// 描述: PWMB中断函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2020-12-04
//========================================================================
void PWMB_ISR() interrupt 27
{
PWMB_SR1 = 0;
P47 = ~P47; //翻转测试IO口
}
79-利用高级PWMA PWMB更新中断实现2个定时器.zip
(8.91 KB, 下载次数: 6)
|
|