- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2026-03-16 20:28:47
注册会员
- 积分
- 197
|
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);
}
|
|