15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。
只改这个 STC8A_PWM15bit.c 应该可以
- //15 位增强型 PWM
- //STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。
-
- #include "STC8A_PWM15bit.h"
-
- u16 code PWMxCR[8] = {
- 0xff04, /* PWM0CR */
- 0xff14, /* PWM1CR */
- 0xff24, /* PWM2CR */
- 0xff34, /* PWM3CR */
- 0xff44, /* PWM4CR */
- 0xff54, /* PWM5CR */
- 0xff64, /* PWM6CR */
- 0xff74, /* PWM7CR */
- };
-
- u16 code PWMxT1[8] = {
- 0xff00, /* PWM0T1 */
- 0xff10, /* PWM1T1 */
- 0xff20, /* PWM2T1 */
- 0xff30, /* PWM3T1 */
- 0xff40, /* PWM4T1 */
- 0xff50, /* PWM5T1 */
- 0xff60, /* PWM6T1 */
- 0xff70, /* PWM7T1 */
- };
-
- u16 code PWMxT2[8] = {
- 0xff02, /* PWM0T2 */
- 0xff12, /* PWM1T2 */
- 0xff22, /* PWM2T2 */
- 0xff32, /* PWM3T2 */
- 0xff42, /* PWM4T2 */
- 0xff52, /* PWM5T2 */
- 0xff62, /* PWM6T2 */
- 0xff72, /* PWM7T2 */
- };
-
- u16 code PWMxHLD[8] = {
- 0xff05, /* PWM0HLD */
- 0xff15, /* PWM1HLD */
- 0xff25, /* PWM2HLD */
- 0xff35, /* PWM3HLD */
- 0xff45, /* PWM4HLD */
- 0xff55, /* PWM5HLD */
- 0xff65, /* PWM6HLD */
- 0xff75, /* PWM7HLD */
- };
-
- //========================================================================
- // 函数: 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_cns: pwm通道选择, PWM15_SW_P2, PWM15_SW_P1, PWM15_SW_P6.
- // 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_cns, 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; //第一个触发点中断使能控制错误
-
- pPWMxCR = (u8 *)PWMxCR[PWM_id];
- *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_cns << 3) | (pwm_eni << 2) | (pwm_ent2i << 1) | pwm_ent1i;
- return SUCCESS;
- }
-
- //========================================================================
- // 函数: u8 PWM15Duty(u8 PWM_id, u16 Period, u16 dutyL, u16 dutyH)
- // 描述: PWM 占空比设置.
- // 参数: PWM_id: PWM通道序号. 取值 0~7
- // dutyL: pwm输出低电平位置, 取值 0~0x7fff.
- // dutyH: pwm输出高电平位置, 取值 0~0x7fff.
- // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
- // 版本: V1.0, 2020-09-22
- //========================================================================
- u8 PWM15Duty(u8 PWM_id, u16 dutyL, u16 dutyH)
- {
- u16 xdata *pPWMxT1;
- u16 xdata *pPWMxT2;
-
- if(PWM_id > PWM15_7) return FAIL; //id错误
- if(dutyL > 0x7fff) return FAIL; //低电平时间设置错误
- if(dutyH > 0x7fff) return FAIL; //高电平时间设置错误
-
- pPWMxT1 = (u16 *)PWMxT1[PWM_id];
- *pPWMxT1 = dutyL & 0x7fff;
-
- pPWMxT2 = (u16 *)PWMxT2[PWM_id];
- *pPWMxT2 = dutyH & 0x7fff;
- return SUCCESS;
- }
-
- //========================================================================
- // 函数: u8 PWMLevelSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
- // 描述: PWM通道控制寄存器设置.
- // 参数: PWM_id: PWM通道序号. 取值 0~7
- // pwm_hldl: pwm强制输出低电平控制位, 0正常输出, 1强制输出低电平.
- // pwm_hldh: pwm强制输出高电平控制位, 0正常输出, 1强制输出高电平.
- // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
- // 版本: V1.0, 2020-09-22
- //========================================================================
- u8 PWMLevelSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
- {
- u8 xdata *pPWMxHLD;
-
- if(PWM_id > PWM15_7) return FAIL; //id错误
- if(pwm_hldh > 1) return FAIL; //输出使能错误
- if(pwm_hldl > 1) return FAIL; //输出端的初始电平错误
-
- pPWMxHLD = (u8 *)PWMxHLD[PWM_id];
- *pPWMxHLD = (pwm_hldh << 1) | pwm_hldl;
- return SUCCESS;
- }
-
- //========================================================================
- // 函数: u8 PWM15_Init(PWM15_InitTypeDef *PWMx)
- // 描述: 15位增强型PWM初始化程序.
- // 参数: PWMx: 结构参数,请参考头文件里的定义.
- // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
- // 版本: V1.0, 2020-09-22
- //========================================================================
- u8 PWM15_Init(PWM15_InitTypeDef *PWMx)
- {
- PWM15_PWM_Set(PWMx->PWM_Enable); //使能/关闭 PWM0(包括 PWM00~PWM07)
- PWM15_PS_Set(PWMx->PWM_Clock_PS); //系统时钟分频参数, 0~15
- PWM15_Clock_Sel(PWMx->PWM_Clock_Sel); //PWMn时钟源选择
- PWMC = PWMx->PWM_Period & 0x7fff;
- PWM15_CounterInt_Set(PWMx->PWM_CInt); //PWMn计数器归零中断使能设置
- PWM15_Counter_Set(PWMx->PWM_Counter); //PWMn计数器使能设置
-
- return SUCCESS;
- }
复制代码
|