- 打卡等级:以坛为家II
- 打卡总天数:441
- 最近打卡:2025-05-03 08:12:12
已绑定手机
高级会员
- 积分
- 847
|
因为参考例程,把PWMA中断入口26 和PWMB中断入口27弄错了,然后PWMA中断的时候居然还进入PWMB的中断入口,为什么可以这样?
void UpdatePwm(void)
{
PWMA_ARRH = (Period>>8);
PWMA_ARRL = Period;
PWMA_CCR4H = (Period >> 9);
PWMA_CCR4L = (Period >> 1); //设置占空比时间: Period/2
}
/******************** 主函数 **************************/
void PWM_INT()
{
plus0_now_plus = 0;
// Counter = 0;
// Period = 0x1000;
P_SW2 |= 0x80; //使能XFR访问
PPWMAH=1;
PPWMA=1;
// IP2|=0x08;
// IP2H|=0x08; //中断优先级
PWMA_PSCRL=1; //使能输出2分频
PWMA_PSCRH=0;
PWMA_ENO = 0x00;
PWMA_ENO |= ENO4P; //使能输出
PWMA_RCR=0;
PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
PWMA_PS |= PWM4_2; //选择 PWM6_2 通道
// PWMB_PS = 0x00; //高级 PWM 通道输出脚选择位
// PWMB_PS |= PWM6_2; //选择 PWM6_2 通道
// PWMA_EGR=0;
UpdatePwm();
PWMA_BKR=0X80;
PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR4 = 0x5c; //设置 PWM4 模式2 强制 高电平
PWMA_CCER2 = 0x10; //使能 CC4E 通道, 低电平有效
// PWMA_CR1 |= 0x04;
PWMA_CR1 = 0x84;
// PWMA_CR1 |= 0x01;
// PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
// PWMB_CCMR2 = 0x5c; //设置 PWM2 模式2 强制 高电平
// PWMB_CCER1 = 0x10; //使能 CC1E 通道, 高电平有效
// PWMB_CR1 |= 0x04;
// PWMB_CR1 |= 0x01;
// PWMB_CR1 &= 0xFE;
// PWMB_CR1 |= 0x01; //开始计时
PWMB_IER = 0x00; //关闭中断
EA = 1; //打开总中断
}
/************* 发送脉冲函数 **************/
void TxPulse(void)
{
// PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
// PWMB_CCMR2 = 0x6c; //设置 PWM2 模式7 输出
// PWMB_CCER1 = 0x10; //使能 CC1E 通道, 高电平有效
// PWMB_SR1 = 0; //清标志位
// PWMB_CNTRH = 0; //清计数器
// PWMB_CNTRL = 0;
// PWMB_BKR = 0x80; //使能主输出
// PWMB_CR1 |= 0x01; //开始计时
// PWMB_IER = 0x04; //使能捕获/比较 1 中断
PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR4 = 0x6c; //设置 PWM4 模式2 强制 高电平
PWMA_CCER2 = 0x10; //使能 CC4E 通道, 低电平有效
PWMA_SR1 = 0; //清标志位
PWMA_CNTRH = 0; //清计数器
PWMA_CNTRL = 0;
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 |= 0x01; //开始计时
PWMA_IER = 0x10; //使能捕获/比较 1 中断
}
/********************** Timer0 1ms中断函数 ************************/
/******************* PWM中断函数 ********************/
void PWMB_ISR() interrupt 27
{
if(PWMA_SR1 & 0X10)
{
//清标志位
plus0_now_plus++;
UpdatePwm();
if( plus0_now_plus>=plus0_set_plus) //计数10个脉冲后关闭PWM计数器
{
PWMB_IER = 0x00; //关闭中断
// PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
// PWMB_CCMR2 = 0x5c; //设置 PWM2 模式2 强制 高电平
// PWMB_CCER1 = 0x10; //使能 CC1E 通道, 高电平有效
PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR4 = 0x5c; //设置 PWM4 模式2 强制 高电平
PWMA_CCER2 = 0x10; //使能 CC4E 通道, 低电平有效
plus0_now_plus = 0;
// PWMB_CR1 &= 0xFE; //开始计时
}
PWMA_SR1 &=~0X10;
}
PWMA_SR1=0;
}
|
-
|