米虫 发表于 2026-5-29 22:36:48

stc8a4k32s2a12单片机库函数 | STC8A8K64D4 无 STC8A8K64S4A12

新人第一帖,急求库函数。。。。官网下的8a8k64d4,库函数,增强pwm没法用,有没有大佬能提供一下库函数,

soma 发表于 2026-5-29 23:03:50

逐飞科技STC8A8K64S4开源库这个可以看下

米虫 发表于 2026-5-30 12:06:49

soma 发表于 2026-5-29 23:03
逐飞科技STC8A8K64S4开源库这个可以看下

谢谢!还有个问题 我想直接在8a8kd4库基础上直接改不知道方不方便,不想再移植了,怕还有其他两个库对不上的地方{:touxiao:}

神农鼎 发表于 2026-5-30 16:22:02



深圳国芯人工智能有限公司-库函数

angmall 发表于 2026-5-30 18:25:46

米虫 发表于 2026-5-30 12:06
谢谢!还有个问题 我想直接在8a8kd4库基础上直接改不知道方不方便,不想再移植了,怕还有其他两个库对不 ...

15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。

只改这个 STC8A_PWM15bit.c 应该可以
//15 位增强型 PWM
//STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。

#include        "STC8A_PWM15bit.h"

u16 code PWMxCR = {
        0xff04,                /* PWM0CR */
        0xff14,                /* PWM1CR */
        0xff24,                /* PWM2CR */
        0xff34,                /* PWM3CR */
        0xff44,                /* PWM4CR */
        0xff54,                /* PWM5CR */
        0xff64,                /* PWM6CR */
        0xff74,                /* PWM7CR */
};

u16 code PWMxT1 = {
        0xff00,                /* PWM0T1 */
        0xff10,                /* PWM1T1 */
        0xff20,                /* PWM2T1 */
        0xff30,                /* PWM3T1 */
        0xff40,                /* PWM4T1 */
        0xff50,                /* PWM5T1 */
        0xff60,                /* PWM6T1 */
        0xff70,                /* PWM7T1 */
};

u16 code PWMxT2 = {
        0xff02,                /* PWM0T2 */
        0xff12,                /* PWM1T2 */
        0xff22,                /* PWM2T2 */
        0xff32,                /* PWM3T2 */
        0xff42,                /* PWM4T2 */
        0xff52,                /* PWM5T2 */
        0xff62,                /* PWM6T2 */
        0xff72,                /* PWM7T2 */
};

u16 code PWMxHLD = {
        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;
        *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;
        *pPWMxT1 = dutyL & 0x7fff;

        pPWMxT2 = (u16 *)PWMxT2;
        *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;
        *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;
}

米虫 发表于 2026-6-1 12:13:26

angmall 发表于 2026-5-30 18:25
15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。



您好,能再提供一下头文件吗,单独改这个还是不行

angmall 发表于 2026-6-1 15:38:58

米虫 发表于 2026-6-1 12:13
您好,能再提供一下头文件吗,单独改这个还是不行

试一下这一个。




米虫 发表于 2026-6-2 10:34:39

angmall 发表于 2026-6-1 15:38
试一下这一个。

感谢,例程没问题,其实最开始要用S4的库,现在直接换个库也是一堆报错,要慢慢改

angmall 发表于 2026-6-2 11:52:38

米虫 发表于 2026-6-2 10:34
感谢,例程没问题,其实最开始要用S4的库,现在直接换个库也是一堆报错,要慢慢改 ...

很高兴能够帮得上你,

附录V STC8A8K64D4 系列单片机取代 STC8A8K64S4A12 系列的注意事项
 I/O 口
STC8A8K64D4 系列单片机上电后, I/O 的模式与STC8A8K64S4A12 系列不一样。
STC8A8K64S4A12 系列单片机所有I/O 口上电后都是8051 的准双向口模式,而STC8A8K64D4 系
列单片机的I/O 中,除了ISP 下载脚P3.0/P3.1 为准双向口模式外,其余的所有I/O 口在上电后都是
高阻输入模式。传统的8051 单片机上电后即为准双向口模式并输出高电平,经常有客户的系统中
使用I/O 驱动马达或者LED 灯,因此会出现单片机上电的瞬间马达会动一下或者LED 会闪一下。
STC8A8K64D4 系列的I/O 上电后为高阻输入模式,就可避免马达和LED 的这种误动作。
由于STC8A8K64D4 系列单片机的I/O 中,除了ISP 下载脚P3.0/P3.1 为准双向口模式外,其
余的所有I/O 口在上电后都是高阻输入模式,所以当用户需要STC8A8K64D4 系列的I/O 口向外输
出信号前,必须先使用PxM0 和PxM1 两个寄存器对I/O 的工作模式进行设置。

 复位脚
STC8A8K64D4 系列和STC8A8K64S4A12 系列的P5.4 口一般情况下是当作普通I/O 口使用的,
当用户在ISP 下载时设置了P5.4 为复位脚功能时,P5.4 口则为单片机的复位脚(RESET 脚)。对于
STC8A8K64S4A12 系列,复位脚为高电平时单片机处于复位状态,低电平时单片机解除复位状态。
而STC8A8K64D4 系列与STC8A8K64S4A12 系列的复位电平是向反的,即对于STC8A8K64D4 系
列,复位脚为低电平时,单片机处于复位状态,高电平时单片机解除复位状态。
所以当用户使能P5.4 口的复位脚功能是需要注意复位电平的问题。

 EEPROM
STC8A8K64S4A12 系列的EEPROM 擦除和编程的等待时间用寄存器IAP_CONTR 的Bit2-Bit0
设置,设置的只是一个大概的频率范围值,STC8A8K64D4 系列新增了一个寄存器IAP_TPS(SFR
地址:0F5H),专用于设置EEPROM 擦除和编程的等待时间,且用户不需要去计算,只需要根据
当前CPU 的工作频率,直接填入IAP_TPS 即可,硬件会自动计算等待时间。(比如:当前CPU 的
工作频率为24MHz,则只需要向IAP_TPS 填入24 即可)

 ADC
STC8A8K64D4 系列的ADC 在功能上完全覆盖兼容STC8A8K64S4A12 系列。STC8A8K64D4
系列在STC8A8K64S4A12 系列ADC的基础上新增了外部触发功能以及自动多次转换取平均值等新
功能。

 比较器
STC8A8K64D4 系列的比较器正端输入为4 路可选、负端输入为两路可选,输入选择设置在寄
存器CMPEXCFG 中。STC8A8K64S4A12 系列不一致。

 SPI
STC8A8K64D4 系列的4 种SPI 时钟频率分别:SYSclk/4、SYSclk/8、SYSclk/16 和SYSclk/2。
STC8A8K64S4A12 系列的4 种SPI 时钟频率分别:SYSclk/4、SYSclk/8、SYSclk/16 和SYSclk/32。

 PCA/CCP/PWM
STC8A8K64D4 系列的PCA 相关SFR 中,前3 组模块的SFR 与STC8A8K64S4A12 系列是相
同的,第4 组模块(PCA3/CCP3/PWM3)的控制寄存器在XFR 区域,与STC8A8K64S4A12 系列不
兼容。(具体为CCAPM3、CCAP3L、CCAP3H 和PCA_PWM3)

 15 位增强型PWM
STC8A8K64D4 系列的增强型PWM 相关SFR 地址与STC8A8K64S4A12 系列不兼容。



米虫 发表于 2026-6-4 16:55:28

angmall 发表于 2026-6-2 11:52
很高兴能够帮得上你,

附录V STC8A8K64D4 系列单片机取代 STC8A8K64S4A12 系列的注意事项


你好,还有新问题请教,pwm可以了之后,现在库函数里面外部中断2,只有不初始化增强型pwm才有用,初始化了就进不了中断,排查很久没进展{:4_196:}
页: [1] 2
查看完整版本: stc8a4k32s2a12单片机库函数 | STC8A8K64D4 无 STC8A8K64S4A12