找回密码
 立即注册
查看: 51|回复: 5

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-03-16 20:28:47

5

主题

17

回帖

197

积分

注册会员

积分
197
发表于 2026-3-13 11:38:53 | 显示全部楼层 |阅读模式
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);

}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:644
  • 最近打卡:2026-03-20 08:58:57
已绑定手机

52

主题

2488

回帖

8796

积分

论坛元老

积分
8796
发表于 2026-3-13 12:06:04 | 显示全部楼层
将PWMA_ENO对应位清零,就可以作为普通IO口使用
截图202603131206019374.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-03-16 20:28:47

5

主题

17

回帖

197

积分

注册会员

积分
197
发表于 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输出
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-03-16 20:28:47

5

主题

17

回帖

197

积分

注册会员

积分
197
发表于 2026-3-13 12:27:58 | 显示全部楼层
定时器里面有每1ms更新一下占空比,这个没有影响吧?
搜狗截图20260313121944.png
搜狗截图20260313122642.png
搜狗截图20260313122701.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:307
  • 最近打卡:2026-03-19 10:21:34

84

主题

7299

回帖

1万

积分

超级版主

积分
15676
发表于 2026-3-13 13:20:48 | 显示全部楼层
PWMA_ENO = 0x00;   //关闭PWM输出,IO变回普通IO

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-03-16 20:28:47

5

主题

17

回帖

197

积分

注册会员

积分
197
发表于 6 天前 | 显示全部楼层
梁*** 发表于 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
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-22 03:27 , Processed in 0.108542 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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