gdg.xxx 发表于 2025-3-26 10:25:12

32g的p1.4的pwm功能如何配置

请教一下各位大佬,我想给stc32g的p1.4引脚配置pwm,我按照官方的《25-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序》例程去修改配置,但是没有成功,p1.4没有波形,能帮我看看我的代码哪里有问题么




#include "..\..\comm\STC32G.h"
#include "stdio.h"
#include "intrins.h"

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

#define MAIN_Fosc 24000000UL

/****************************** 用户定义宏 ***********************************/
#define Timer0_Reload (65536UL - (MAIN_Fosc / 1000)) // Timer0中断频率1ms

/************* PWM配置 **************/
#define PWM_PERIOD 1023       // PWM周期
u16 PWM3_Duty = 0;         // PWM3占空比
bit PWM3_Flag = 0;         // 呼吸灯方向标志

/************* 函数声明 **************/
void UpdatePwm(void);

/********************* 主函数 *************************/
void main(void) {
    WTST = 0;
    EAXFR = 1;
    CKCON = 0;

    // 设置P1.4为推挽输出(PWM3P)
    P1M1 &= ~0x10;// P1.4模式设置
    P1M0 |= 0x10;   // P1.4推挽输出

    // Timer0初始化
    AUXR = 0x80;    // 1T模式
    TH0 = (u8)(Timer0_Reload >> 8);
    TL0 = (u8)(Timer0_Reload);
    ET0 = 1;      // 使能定时器中断
    TR0 = 1;      // 启动定时器

    // PWM配置(使用PWMA通道3)
    PWMA_CCER1 = 0x00;      // 关闭通道3
    PWMA_CCMR3 = 0x60;      // PWM模式1(预装载使能)

    // 使能通道3正极输出(PWM3P)
    PWMA_CCER1 |= 0x01 << 4; // CC3E = 1(使能输出)

    // 设置PWM周期
    PWMA_ARRH = (u8)(PWM_PERIOD >> 8);
    PWMA_ARRL = (u8)PWM_PERIOD;

    // 初始化占空比
    PWMA_CCR3H = (u8)(PWM3_Duty >> 8);
    PWMA_CCR3L = (u8)PWM3_Duty;

    // PWM输出配置
    PWMA_BKR = 0x80;      // 主输出使能
    PWMA_CR1 = 0x81;      // 使能预装载,启动计数器

    // 映射PWM3P到P1.4(根据数据手册设置PS寄存器)
    PWMA_PS = 0x00;         // 选择默认引脚P1.4(具体值需查手册确认)

    EA = 1; // 开启总中断

    while(1) {
      if(B_1ms) {
            B_1ms = 0;
            UpdatePwm();
      }
    }
}

/********************** Timer0 1ms中断函数 ************************/
void timer0_isr() interrupt 1 {
    B_1ms = 1;// 1ms标志置位
}

/********************** PWM更新函数 ************************/
void UpdatePwm(void) {
    // 呼吸灯效果
    if(!PWM3_Flag) {
      if(++PWM3_Duty >= PWM_PERIOD) PWM3_Flag = 1;
    } else {
      if(--PWM3_Duty == 0) PWM3_Flag = 0;
    }

    // 更新PWM3占空比
    PWMA_CCR3H = (u8)(PWM3_Duty >> 8);
    PWMA_CCR3L = (u8)PWM3_Duty;
}

页: [1]
查看完整版本: 32g的p1.4的pwm功能如何配置