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);
}
将PWMA_ENO对应位清零,就可以作为普通IO口使用
乘风飞扬 发表于 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输出 定时器里面有每1ms更新一下占空比,这个没有影响吧?
PWMA_ENO = 0x00; //关闭PWM输出,IO变回普通IO
一定可以的,你可以参考我们的三相电机驱动。 梁工 发表于 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]