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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-03-26 10:21:37
已绑定手机

6

主题

9

回帖

86

积分

注册会员

积分
86
发表于 2025-3-26 10:25:12 | 显示全部楼层 |阅读模式
请教一下各位大佬,我想给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;
}

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 07:01 , Processed in 0.170592 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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