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

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

[复制链接]
  • TA的每日心情
    开心
    前天 11:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    9

    回帖

    78

    积分

    注册会员

    积分
    78
    发表于 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 */
    复制代码




    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 11:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    9

    回帖

    78

    积分

    注册会员

    积分
    78
     楼主| 发表于 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;
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-13 11:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    337

    回帖

    1655

    积分

    版主

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

    STC8A8K64D4-SOFTWARE-LIB-20210610.zip

    13.1 MB, 下载次数: 36

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 11:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    9

    回帖

    78

    积分

    注册会员

    积分
    78
     楼主| 发表于 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();}
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 11:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    9

    回帖

    78

    积分

    注册会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-15 10:53 , Processed in 0.109682 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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