黄乃贝 发表于 2026-3-13 11:38:53

STC32G,使用了P1.0hep1.1口做pwm1P和pwm1n互补输出之后,想改回普IO口,改不回来咋么

STC32G,使用了P1.0hep1.1口做pwm1P和pwm1n互补输出之后,想改回普IO口,改不回来咋么办?

         
PWM_config();

IO设置和pwm初始完成后,pwm能正常输出,过了1s后想切换成普通IO口,这时候切换不了,还是一直pwm输出。

下面是我切换 pwm为IO口的代码

                     // 第一步:硬停止PWM模块(全寄存器清零,无残留)
                        PWMA_CR1 = 0x00;          // 强制关闭计数器(比位操作彻底)
                        PWMA_CCER1 = 0x00;      // 禁用所有PWM1输出通道
                        PWMA_BKR = 0x00;          // 关闭主输出+死区+锁定
                        PWMA_SR1 = 0x00;         // 清除所有状态标志
                        PWMA_EGR = 0x00;          // 清除事件触发
                       
                        // 第二步:等待PWM模块稳定停止(硬件响应时间)
                       
                        for(num=0; num<20; num++);      // 短延时,确保PWM驱动完全关闭
                       
                        // 第三步:强制配置普通IO(直接赋值,覆盖所有复用)
                        P1M0 = 0x03;            // P1.0/P1.1推挽输出(直接赋值,无残留)
                        P1M1 = 0x00;            // 普通IO模式(清除所有特殊模式)
                       
                        // 第四步:锁存IO电平(强制覆盖PWM残留信号)
                        P1 &= 0xFC;               // P1.0/P1.1置低

(切换不成功,还是一直pwm输出)






/***************PWM初始化函数 *****************/
void        PWM_config(void)
{
        PWMx_InitDefine                PWMx_InitStructure;
        PWMA_Duty.PWM1_Duty = 1600;        // 1600/2000 默认80% 占空比        //PWMA_Duty.PWM1_Duty = 128;
        PWMA_Duty.PWM2_Duty = 1600;        //PWMA_Duty.PWM2_Duty = 256;

        PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE1;        //模式,               
        PWMx_InitStructure.PWM_Duty    = PWMA_Duty.PWM1_Duty;        //PWM占空比时间, 0~Period
        PWMx_InitStructure.PWM_EnoSelect   = ENO1P | ENO1N;//PWMx_InitStructure.PWM_EnoSelect   = ENO1N;
        PWM_Configuration(PWM1, &PWMx_InitStructure);                                //初始化PWM1

        PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE1;        //模式,       
        PWMx_InitStructure.PWM_Duty    = PWMA_Duty.PWM2_Duty;        //PWM占空比时间, 0~Period
        PWMx_InitStructure.PWM_EnoSelect   =ENO2P | ENO2N;//PWMx_InitStructure.PWM_EnoSelect   = ENO2P | ENO2N;        //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N /
        PWM_Configuration(PWM2, &PWMx_InitStructure);                                //初始化PWM2

        PWMx_InitStructure.PWM_Period   = 2000;          //2047                        //周期时间,   0~65535   // 24000000/2000=12khz
        PWMx_InitStructure.PWM_DeadTime = 0;                                                //死区发生器设置, 0~255
        PWMx_InitStructure.PWM_MainOutEnable= ENABLE;                                //主输出使能, ENABLE,DISABLE
        PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;                                //使能计数器, ENABLE,DISABLE
        PWM_Configuration(PWMA, &PWMx_InitStructure);                                //初始化PWM通用寄存器,PWMA,PWMB

       
       
        PWM1_USE_P10P11();// pwm 引脚
        PWM2_USE_P12P13();

        // PWMA_IER = 0x01; //使能中断   PWMA_IER = 0x1e; // 使能中断
        NVIC_PWM_Init(PWMA,DISABLE,Priority_0);

}


乘风飞扬 发表于 2026-3-13 12:06:04

将PWMA_ENO对应位清零,就可以作为普通IO口使用

黄乃贝 发表于 2026-3-13 12:24:04

乘风飞扬 发表于 2026-3-13 12:06
将PWMA_ENO对应位清零,就可以作为普通IO口使用

                          // 第一步:硬停止PWM模块(全寄存器清零,无残留)
//                        PWMA_CR1 = 0x00;          // 强制关闭计数器(比位操作彻底)
//                        PWMA_CCER1 = 0x00;      // 禁用所有PWM1输出通道
//                        PWMA_BKR = 0x00;          // 关闭主输出+死区+锁定
//                        PWMA_SR1 = 0x00;         // 清除所有状态标志
//                        PWMA_EGR = 0x00;          // 清除事件触发
                       
                        EAXFR = 1; //扩展寄存器(XFR)访问使能
                        PWMA_ENO &=0xFC;//关闭pwm引脚输出
                        // 第二步:等待PWM模块稳定停止(硬件响应时间)
                       
                        for(num=0; num<20; num++);      // 短延时,确保PWM驱动完全关闭
                       
                        // 第三步:强制配置普通IO(直接赋值,覆盖所有复用)
                        P1M0 = 0x03;            // P1.0/P1.1推挽输出(直接赋值,无残留)
                        P1M1 = 0x00;            // 普通IO模式(清除所有特殊模式)
                       
                        // 第四步:锁存IO电平(强制覆盖PWM残留信号)
                        P1 &= 0xFC;               // P1.0/P1.1置低

加了 PWMA_ENO &=0xFC;//关闭pwm引脚输出
还是没用啊,还是一直pwm输出

黄乃贝 发表于 2026-3-13 12:27:58

定时器里面有每1ms更新一下占空比,这个没有影响吧?

梁工 发表于 2026-3-13 13:20:48

PWMA_ENO = 0x00;   //关闭PWM输出,IO变回普通IO

一定可以的,你可以参考我们的三相电机驱动。

黄乃贝 发表于 2026-3-16 20:28:47

梁工 发表于 2026-3-13 13:20
PWMA_ENO = 0x00;   //关闭PWM输出,IO变回普通IO

一定可以的,你可以参考我们的三相电机驱动。 ...

谢谢, 是这个问题,
PWMA_CCER1 = 0x00;      // 禁用所有PWM1输出通道
PWMA_CCER1,只是关闭了通道使能,

要关闭PWM输出,回到IO口还要 PWMA_ENO = 0x00;
PWMA_ENO = 0x00;   //关闭PWM输出,IO变回普通IO
页: [1]
查看完整版本: STC32G,使用了P1.0hep1.1口做pwm1P和pwm1n互补输出之后,想改回普IO口,改不回来咋么