HelloWorld 发表于 2023-5-15 10:49:18

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


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

- 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;
        *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;
        *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 */



HelloWorld 发表于 2023-5-15 10:51:35

#define PWM0CR          (*(unsigned char volatile xdata *)0xff14)                /* PWM0CR */
#define PWM1CR          (*(unsigned char volatile xdata *)0xff1c)                /* PWM1CR */
#define PWM2CR          (*(unsigned char volatile xdata *)0xff24)                /* PWM2CR */
#define PWM3CR          (*(unsigned char volatile xdata *)0xff2c)                /* PWM3CR */
#define PWM4CR          (*(unsigned char volatile xdata *)0xff34)                /* PWM4CR */
#define PWM5CR          (*(unsigned char volatile xdata *)0xff3c)                /* PWM5CR */
#define PWM6CR          (*(unsigned char volatile xdata *)0xff44)                /* PWM6CR */
#define PWM7CR          (*(unsigned char volatile xdata *)0xff4c)                /* PWM7CR */


        PWM15_config();

          P_SW2 = 0x80;
//    PWM0CR |= 0x00;                              //PWM0/P2.0
PWM0CR |= 0x08;                              //PWM0_2/P1.0
//PWM0CR |= 0x10;                              //PWM0_3/P6.0
       
//    PWM1CR |= 0x00;                              //PWM1/P2.1
PWM1CR |= 0x08;                              //PWM1_2/P1.1
//PWM1CR = 0x10;                              //PWM1_3/P6.1
       
//    PWM2CR |= 0x00;                              //PWM2/P2.2
PWM2CR |= 0x08;                              //PWM2_2/P1.2
//PWM2CR |= 0x10;                              //PWM2_3/P6.2
       
//    PWM3CR |= 0x00;                              //PWM3/P2.3
PWM3CR |= 0x08;                              //PWM3_2/P1.3
//PWM3CR = 0x10;                              //PWM3_3/P6.3
       
    PWM4CR |= 0x00;                              //PWM4/P2.4
//PWM4CR |= 0x08;                              //PWM4_2/P1.4
//PWM4CR |= 0x10;                              //PWM4_3/P6.4

    PWM5CR |= 0x00;                              //PWM5/P2.5
//PWM5CR = 0x08;                              //PWM5_2/P1.5
//PWM5CR = 0x10;                              //PWM5_3/P6.5

    PWM6CR |= 0x00;                              //PWM6/P2.6
//PWM6CR |= 0x08;                              //PWM6_2/P1.6
//PWM6CR |= 0x10;                              //PWM6_3/P6.6

    PWM7CR |= 0x00;                              //PWM7/P2.7
//PWM7CR |= 0x08;                              //PWM7_2/P1.7
//PWM7CR |= 0x10;                              //PWM7_3/P6.7
    P_SW2 = 0x00;

清风予我 发表于 2023-5-15 11:34:52

参考一下,STC8A8K64D4-45I-LQFP64的函数库例程

HelloWorld 发表于 2023-5-15 14:54:32

库函数中独立分开了,一个独立单独的头文件定义了全部切换功能的宏。#include        "STC8A_Switch.h"

//========================================================================
//                            功能脚切换设置
//========================================================================

#defineUART1_SW(Pin)                                P_SW1 = (P_SW1 & 0x3F) | (Pin << 6)
#definePCA_SW(Pin)                                        P_SW1 = (P_SW1 & 0xCF) | (Pin << 4)
#defineSPI_SW(Pin)                                        P_SW1 = (P_SW1 & 0xF3) | (Pin << 2)
#defineI2C_SW(Pin)                                        P_SW2 = (P_SW2 & 0xCF) | (Pin << 4)
#defineCOMP_SW(Pin)                                        P_SW2 = (P_SW2 & 0xF7) | (Pin << 3)
#defineUART4_SW(Pin)                                P_SW2 = (P_SW2 & 0xFB) | (Pin << 2)
#defineUART3_SW(Pin)                                P_SW2 = (P_SW2 & 0xFD) | (Pin << 1)
#defineUART2_SW(Pin)                                P_SW2 = (P_SW2 & 0xFE) | (Pin)

#definePWM15_PWM0_SW(Pin)                {EAXSFR(); PWM0CR = (PWM0CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM1_SW(Pin)                {EAXSFR(); PWM1CR = (PWM1CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM2_SW(Pin)                {EAXSFR(); PWM2CR = (PWM2CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM3_SW(Pin)                {EAXSFR(); PWM3CR = (PWM3CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM4_SW(Pin)                {EAXSFR(); PWM4CR = (PWM4CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM5_SW(Pin)                {EAXSFR(); PWM5CR = (PWM5CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM6_SW(Pin)                {EAXSFR(); PWM6CR = (PWM6CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM7_SW(Pin)                {EAXSFR(); PWM7CR = (PWM7CR & ~0x18) | (Pin << 3); EAXRAM();}

#defineMCLKO_SW(Pin)                                {EAXSFR(); MCLKOCR = (MCLKOCR & 0x7F) | (Pin << 7); EAXRAM();}
#defineT3T4SEL_SW(Pin)                        {EAXSFR(); T3T4PIN = (T3T4PIN & 0xFE) | (Pin); EAXRAM();}

#defineLCM_CTRL_SW(Pin)                        {EAXSFR(); LCMIFCFG2 = (LCMIFCFG2 & ~0x60) | (Pin << 5); EAXRAM();}
#defineLCM_DATA_SW(Pin)                        {EAXSFR(); LCMIFCFG = (LCMIFCFG & ~0x0C) | (Pin << 2); EAXRAM();}

HelloWorld 发表于 2023-5-15 14:55:24

STC爱好者 发表于 2023-5-15 11:34
参考一下,STC8A8K64D4-45I-LQFP64的函数库例程

好的,谢谢!
页: [1]
查看完整版本: STC8A8K64D4-SOFTWARE-LIB库函数没有引出引脚切换功能