引脚切换功能在单片机外设使用过程中是非常重要的,特别在引脚数量有限,功能引脚切换是非常重要的。
- STC8A8K64D4-SOFTWARE-LIB库函数版本信息:2021.06.10
- 15 位的增强型PWM驱动源文件:STC8A_PWM15bit.c
在STC8A_PWM15bit.c驱动源文件中没有包含引脚切换功能的相关配置代码,默认的就是:00
- //========================================================================
- // 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
- // 描述: PWM通道控制寄存器设置.
- // 参数: PWM_id: PWM通道序号. 取值 0~7
- // pwm_eno: pwm输出使能, 0设为GPIO, 1设为PWM输出.
- // pwm_ini: pwm输出端的初始电平, 0为低电平, 1为高电平.
- // pwm_eni: pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断.
- // pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断.
- // pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断.
- // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
- // 版本: V1.0, 2020-09-22
- //========================================================================
- u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
- {
- u8 xdata *pPWMxCR;
-
- if(PWM_id > PWM15_7) return FAIL; //id错误
- if(pwm_eno > 1) return FAIL; //输出使能错误
- if(pwm_ini > 1) return FAIL; //输出端的初始电平错误
- if(pwm_eni > 1) return FAIL; //中断使能控制错误
- if(pwm_ent2i > 1) return FAIL; //第二个触发点中断使能控制错误
- if(pwm_ent1i > 1) return FAIL; //第一个触发点中断使能控制错误
-
- EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
- pPWMxCR = (u8 *)PWMxCR[PWM_id];
- *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
- EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
- return SUCCESS;
- }
复制代码
手册上明明有PWM引脚切换寄存器,在该封装库函数中就没有涉及进来。
- 如下调整:
-
- //========================================================================
- // 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
- // 描述: PWM通道控制寄存器设置.
- // 参数: PWM_id: PWM通道序号. 取值 0~7
- // pwm_eno: pwm输出使能, 0设为GPIO, 1设为PWM输出.BIT.7
- // pwm_ini: pwm输出端的初始电平, 0为低电平, 1为高电平..BIT.6
- // pwm_eni: pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断..BIT.2
- // pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断..BIT.1
- // pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断..BIT.0
- // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
- // 版本: V1.0, 2020-09-22
- //========================================================================
- u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
- {
- u8 xdata *pPWMxCR;
-
- if(PWM_id > PWM15_7) return FAIL; //id错误
- if(pwm_eno > 1) return FAIL; //输出使能错误
- if(pwm_ini > 1) return FAIL; //输出端的初始电平错误
- if(pwm_eni > 1) return FAIL; //中断使能控制错误
- if(pwm_ent2i > 1) return FAIL; //第二个触发点中断使能控制错误
- if(pwm_ent1i > 1) return FAIL; //第一个触发点中断使能控制错误
-
- EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
- pPWMxCR = (u8 *)PWMxCR[PWM_id];
- *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) |(pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
- *pPWMxCR |= (1<<3);//引脚组切换:(1<<3)->P1端口;(0<<3)->P2端口;(1<<4)->P6端口
- EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
- return SUCCESS;
- }
复制代码
或者在main主函数初始化配置完成PWM15_config();后另外单独配置,在main.c中添加相应的寄存器地址宏:
- <blockquote>#define PWM0CR (*(unsigned char volatile xdata *)0xff14)<span style="white-space:pre"> </span>/* PWM0CR */
复制代码
|