如何解决使用按位运算设置 PWM 时遇到问题 PIC12F615 MPLAB X
无论出于何种原因,我一直无法在 MPLAB 中使用位移。这是我正在处理的一些代码,用于在 PIC12F615 上设置 PWM:
// configuration of PWM
void configPWM(void) {
// disable the PWM pin (CCP1) output drivers by setting the associated TRIS bit.
TRISIO |= 1 << 2; //
// Set the PWM period by loading the PR2 register.
PR2 = 0x65; // from datasheet???
// Configure the CCP module for the PWM mode by loading the CCP1CON register with the appropriate values. 0b00001100
CCP1CON = 0x0C; //
// Set the PWM duty cycle by loading the CCPR1L register and DC1B bits of the CCP1CON register.
CCPR1L = 0x88; // about half duty cycle
// Configure and start Timer2:
// Clear the TMR2IF interrupt flag bit of the PIR1 register.
PIR1 &= ~(1 << 1); // clearing bit 1
// Set the Timer2 prescale value by loading the T2CKPS bits of the T2CON register.
T2CON |= 1 << 1; // setting "1x"
// Enable Timer2 by setting the TMR2ON bit of the T2CON register.
T2CON |= 1 << 2; // setting bit 1
// Enable PWM output after a new PWM cycle has started:
// Wait until Timer2 overflows (TMR2IF bit of the PIR1 register is set).
while(!(PIR1 & (1 << 1))) {
__delay_ms(1);
}
// Enable the CCP1 pin output driver by clearing the associated TRIS bit.
TRISIO &= ~(1 << 2); // clearing GP2,CCP1 pin
}
如您所见,我大量使用位移位来设置和清除位。但是,当我进行 MISRA 检查时,我在上面的代码块中收到了 9 次此错误:
main.c:72:17: [misra-c2012-10.1] 操作数不应是 不适当的基本类型
有没有更好的方法来做到这一点?在 TM4C123G 上,我使用 Keil uVision4 IDE 没有遇到此问题。我目前使用的是 MPLAB X IDE v5.45。
解决方法
所以我回答:
MISRA 不允许对有符号类型进行移位操作,因为结果取决于编译器选择表示类型的方式以及执行移位的方式。
所以对于例如你必须切换到:
TRISIO |= 1u << 2;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。