找回密码
 立即注册
查看: 1028|回复: 4

STC8A8K64D4-SOFTWARE-LIB库函数没有引出引脚切换功能

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-30 08:49:59

2

主题

10

回帖

938

积分

高级会员

积分
938
发表于 2023-5-15 10:49:18 | 显示全部楼层 |阅读模式

引脚切换功能在单片机外设使用过程中是非常重要的,特别在引脚数量有限,功能引脚切换是非常重要的。

- STC8A8K64D4-SOFTWARE-LIB库函数版本信息:2021.06.10



- 15 位的增强型PWM驱动源文件:STC8A_PWM15bit.c

在STC8A_PWM15bit.c驱动源文件中没有包含引脚切换功能的相关配置代码,默认的就是:00

  1. //========================================================================
  2. // 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  3. // 描述: PWM通道控制寄存器设置.
  4. // 参数: PWM_id: PWM通道序号. 取值 0~7
  5. //                         pwm_eno:   pwm输出使能, 0设为GPIO, 1设为PWM输出.
  6. //                         pwm_ini:   pwm输出端的初始电平, 0为低电平, 1为高电平.
  7. //                         pwm_eni:   pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断.
  8. //                         pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断.
  9. //                         pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断.
  10. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  11. // 版本: V1.0, 2020-09-22
  12. //========================================================================
  13. u8        PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  14. {
  15.         u8        xdata *pPWMxCR;
  16.        
  17.         if(PWM_id > PWM15_7)        return FAIL;        //id错误
  18.         if(pwm_eno > 1)        return FAIL;        //输出使能错误
  19.         if(pwm_ini > 1)        return FAIL;        //输出端的初始电平错误
  20.         if(pwm_eni > 1)        return FAIL;        //中断使能控制错误
  21.         if(pwm_ent2i > 1)        return FAIL;        //第二个触发点中断使能控制错误
  22.         if(pwm_ent1i > 1)        return FAIL;        //第一个触发点中断使能控制错误
  23.        
  24.         EAXSFR();                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
  25.         pPWMxCR = (u8 *)PWMxCR[PWM_id];
  26.         *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
  27.         EAXRAM();                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
  28.         return SUCCESS;
  29. }
复制代码
手册上明明有PWM引脚切换寄存器,在该封装库函数中就没有涉及进来。

STC8A8K64D4-SOFTWARE-LIB库函数没有引出引脚切换功能-1.png

STC8A8K64D4-SOFTWARE-LIB库函数没有引出引脚切换功能-2.png

- 如下调整:
  1. //========================================================================
  2. // 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  3. // 描述: PWM通道控制寄存器设置.
  4. // 参数: PWM_id: PWM通道序号. 取值 0~7
  5. //                         pwm_eno:   pwm输出使能, 0设为GPIO, 1设为PWM输出.BIT.7
  6. //                         pwm_ini:   pwm输出端的初始电平, 0为低电平, 1为高电平..BIT.6
  7. //                         pwm_eni:   pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断..BIT.2
  8. //                         pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断..BIT.1
  9. //                         pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断..BIT.0
  10. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  11. // 版本: V1.0, 2020-09-22
  12. //========================================================================
  13. u8        PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  14. {
  15.         u8        xdata *pPWMxCR;
  16.        
  17.         if(PWM_id > PWM15_7)        return FAIL;        //id错误
  18.         if(pwm_eno > 1)        return FAIL;        //输出使能错误
  19.         if(pwm_ini > 1)        return FAIL;        //输出端的初始电平错误
  20.         if(pwm_eni > 1)        return FAIL;        //中断使能控制错误
  21.         if(pwm_ent2i > 1)        return FAIL;        //第二个触发点中断使能控制错误
  22.         if(pwm_ent1i > 1)        return FAIL;        //第一个触发点中断使能控制错误
  23.        
  24.         EAXSFR();                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
  25.         pPWMxCR = (u8 *)PWMxCR[PWM_id];
  26.         *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) |(pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
  27.         *pPWMxCR |= (1<<3);//引脚组切换:(1<<3)->P1端口;(0<<3)->P2端口;(1<<4)->P6端口
  28.         EAXRAM();                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
  29.         return SUCCESS;
  30. }
复制代码
或者在main主函数初始化配置完成PWM15_config();后另外单独配置,在main.c中添加相应的寄存器地址宏:
  1. <blockquote>#define PWM0CR          (*(unsigned char volatile xdata *)0xff14)<span style="white-space:pre">                </span>/* PWM0CR */
复制代码




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-30 08:49:59

2

主题

10

回帖

938

积分

高级会员

积分
938
发表于 2023-5-15 10:51:35 | 显示全部楼层
  1. #define PWM0CR          (*(unsigned char volatile xdata *)0xff14)                /* PWM0CR */
  2. #define PWM1CR          (*(unsigned char volatile xdata *)0xff1c)                /* PWM1CR */
  3. #define PWM2CR          (*(unsigned char volatile xdata *)0xff24)                /* PWM2CR */
  4. #define PWM3CR          (*(unsigned char volatile xdata *)0xff2c)                /* PWM3CR */
  5. #define PWM4CR          (*(unsigned char volatile xdata *)0xff34)                /* PWM4CR */
  6. #define PWM5CR          (*(unsigned char volatile xdata *)0xff3c)                /* PWM5CR */
  7. #define PWM6CR          (*(unsigned char volatile xdata *)0xff44)                /* PWM6CR */
  8. #define PWM7CR          (*(unsigned char volatile xdata *)0xff4c)                /* PWM7CR */
  9.         PWM15_config();
  10.           P_SW2 = 0x80;
  11. //    PWM0CR |= 0x00;                              //PWM0/P2.0
  12.   PWM0CR |= 0x08;                              //PWM0_2/P1.0
  13. //  PWM0CR |= 0x10;                              //PWM0_3/P6.0
  14.        
  15. //    PWM1CR |= 0x00;                              //PWM1/P2.1
  16.   PWM1CR |= 0x08;                              //PWM1_2/P1.1
  17. //  PWM1CR = 0x10;                              //PWM1_3/P6.1
  18.        
  19. //    PWM2CR |= 0x00;                              //PWM2/P2.2
  20.   PWM2CR |= 0x08;                              //PWM2_2/P1.2
  21. //  PWM2CR |= 0x10;                              //PWM2_3/P6.2
  22.        
  23. //    PWM3CR |= 0x00;                              //PWM3/P2.3
  24.   PWM3CR |= 0x08;                              //PWM3_2/P1.3
  25. //  PWM3CR = 0x10;                              //PWM3_3/P6.3
  26.        
  27.     PWM4CR |= 0x00;                              //PWM4/P2.4
  28. //  PWM4CR |= 0x08;                              //PWM4_2/P1.4
  29. //  PWM4CR |= 0x10;                              //PWM4_3/P6.4
  30.     PWM5CR |= 0x00;                              //PWM5/P2.5
  31. //  PWM5CR = 0x08;                              //PWM5_2/P1.5
  32. //  PWM5CR = 0x10;                              //PWM5_3/P6.5
  33.     PWM6CR |= 0x00;                              //PWM6/P2.6
  34. //  PWM6CR |= 0x08;                              //PWM6_2/P1.6
  35. //  PWM6CR |= 0x10;                              //PWM6_3/P6.6
  36.     PWM7CR |= 0x00;                              //PWM7/P2.7
  37. //  PWM7CR |= 0x08;                              //PWM7_2/P1.7
  38. //  PWM7CR |= 0x10;                              //PWM7_3/P6.7
  39.     P_SW2 = 0x00;
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

积分
1971
发表于 2023-5-15 11:34:52 | 显示全部楼层
参考一下,STC8A8K64D4-45I-LQFP64的函数库例程

STC8A8K64D4-SOFTWARE-LIB-20210610.zip

13.1 MB, 下载次数: 105

QQ:2269694595     微信:18106296594
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-30 08:49:59

2

主题

10

回帖

938

积分

高级会员

积分
938
发表于 2023-5-15 14:54:32 | 显示全部楼层
库函数中独立分开了,一个独立单独的头文件定义了全部切换功能的宏。
  1. #include        "STC8A_Switch.h"
复制代码

  1. //========================================================================
  2. //                            功能脚切换设置
  3. //========================================================================
  4. #define  UART1_SW(Pin)                                P_SW1 = (P_SW1 & 0x3F) | (Pin << 6)
  5. #define  PCA_SW(Pin)                                        P_SW1 = (P_SW1 & 0xCF) | (Pin << 4)
  6. #define  SPI_SW(Pin)                                        P_SW1 = (P_SW1 & 0xF3) | (Pin << 2)
  7. #define  I2C_SW(Pin)                                        P_SW2 = (P_SW2 & 0xCF) | (Pin << 4)
  8. #define  COMP_SW(Pin)                                        P_SW2 = (P_SW2 & 0xF7) | (Pin << 3)
  9. #define  UART4_SW(Pin)                                P_SW2 = (P_SW2 & 0xFB) | (Pin << 2)
  10. #define  UART3_SW(Pin)                                P_SW2 = (P_SW2 & 0xFD) | (Pin << 1)
  11. #define  UART2_SW(Pin)                                P_SW2 = (P_SW2 & 0xFE) | (Pin)
  12. #define  PWM15_PWM0_SW(Pin)                {EAXSFR(); PWM0CR = (PWM0CR & ~0x18) | (Pin << 3); EAXRAM();}
  13. #define  PWM15_PWM1_SW(Pin)                {EAXSFR(); PWM1CR = (PWM1CR & ~0x18) | (Pin << 3); EAXRAM();}
  14. #define  PWM15_PWM2_SW(Pin)                {EAXSFR(); PWM2CR = (PWM2CR & ~0x18) | (Pin << 3); EAXRAM();}
  15. #define  PWM15_PWM3_SW(Pin)                {EAXSFR(); PWM3CR = (PWM3CR & ~0x18) | (Pin << 3); EAXRAM();}
  16. #define  PWM15_PWM4_SW(Pin)                {EAXSFR(); PWM4CR = (PWM4CR & ~0x18) | (Pin << 3); EAXRAM();}
  17. #define  PWM15_PWM5_SW(Pin)                {EAXSFR(); PWM5CR = (PWM5CR & ~0x18) | (Pin << 3); EAXRAM();}
  18. #define  PWM15_PWM6_SW(Pin)                {EAXSFR(); PWM6CR = (PWM6CR & ~0x18) | (Pin << 3); EAXRAM();}
  19. #define  PWM15_PWM7_SW(Pin)                {EAXSFR(); PWM7CR = (PWM7CR & ~0x18) | (Pin << 3); EAXRAM();}
  20. #define  MCLKO_SW(Pin)                                {EAXSFR(); MCLKOCR = (MCLKOCR & 0x7F) | (Pin << 7); EAXRAM();}
  21. #define  T3T4SEL_SW(Pin)                        {EAXSFR(); T3T4PIN = (T3T4PIN & 0xFE) | (Pin); EAXRAM();}
  22. #define  LCM_CTRL_SW(Pin)                        {EAXSFR(); LCMIFCFG2 = (LCMIFCFG2 & ~0x60) | (Pin << 5); EAXRAM();}
  23. #define  LCM_DATA_SW(Pin)                        {EAXSFR(); LCMIFCFG = (LCMIFCFG & ~0x0C) | (Pin << 2); EAXRAM();}
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-30 08:49:59

2

主题

10

回帖

938

积分

高级会员

积分
938
发表于 2023-5-15 14:55:24 | 显示全部楼层
STC爱好者 发表于 2023-5-15 11:34
参考一下,STC8A8K64D4-45I-LQFP64的函数库例程

好的,谢谢!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 23:54 , Processed in 0.120977 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表