stc8a4k32s2a12单片机库函数 | STC8A8K64D4 无 STC8A8K64S4A12
新人第一帖,急求库函数。。。。官网下的8a8k64d4,库函数,增强pwm没法用,有没有大佬能提供一下库函数, 逐飞科技STC8A8K64S4开源库这个可以看下 soma 发表于 2026-5-29 23:03逐飞科技STC8A8K64S4开源库这个可以看下
谢谢!还有个问题 我想直接在8a8kd4库基础上直接改不知道方不方便,不想再移植了,怕还有其他两个库对不上的地方{:touxiao:}
深圳国芯人工智能有限公司-库函数
米虫 发表于 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;
}
angmall 发表于 2026-5-30 18:25
15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。
您好,能再提供一下头文件吗,单独改这个还是不行 米虫 发表于 2026-6-1 12:13
您好,能再提供一下头文件吗,单独改这个还是不行
试一下这一个。
angmall 发表于 2026-6-1 15:38
试一下这一个。
感谢,例程没问题,其实最开始要用S4的库,现在直接换个库也是一堆报错,要慢慢改 米虫 发表于 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 系列不兼容。
angmall 发表于 2026-6-2 11:52
很高兴能够帮得上你,
附录V STC8A8K64D4 系列单片机取代 STC8A8K64S4A12 系列的注意事项
你好,还有新问题请教,pwm可以了之后,现在库函数里面外部中断2,只有不初始化增强型pwm才有用,初始化了就进不了中断,排查很久没进展{:4_196:}
页:
[1]
2