找回密码
 立即注册
查看: 1254|回复: 7

STC8A_PWM15bit官方库存在问题,无法切换引脚

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-28 18:39:50

3

主题

5

回帖

51

积分

注册会员

积分
51
发表于 2023-10-24 21:26:57 | 显示全部楼层 |阅读模式
本帖最后由 qhshen 于 2023-10-25 21:05 编辑

使用STC8A8K64D4芯片,用官方给的库函数和官方的历程,仅仅加入切换输出引脚操作,但是实际无法进行PWM输出引脚的切换,只能在P2口输出,不能切换到P6口


//代码如下
#include        "config.h"
#include        "STC8A_GPIO.h"
#include        "STC8A_Delay.h"
#include        "STC8A_PWM15bit.h"

/*************   功能说明   ***************

输出4路PWM信号:
PWM0  输出"呼吸灯"效果PWM.
PWM1  循环输出1秒钟PWM,1秒钟高电平,1秒钟低电平.
PWM2,PWM3  固定PWM.

下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).

******************************************/

/*************        本地常量声明        **************/
#define  PWM15_PWM0_SW(Pin)                {EAXSFR(); PWM0CR = (PWM0CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM1_SW(Pin)                {EAXSFR(); PWM1CR = (PWM1CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM2_SW(Pin)                {EAXSFR(); PWM2CR = (PWM2CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM3_SW(Pin)                {EAXSFR(); PWM3CR = (PWM3CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM4_SW(Pin)                {EAXSFR(); PWM4CR = (PWM4CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM5_SW(Pin)                {EAXSFR(); PWM5CR = (PWM5CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM6_SW(Pin)                {EAXSFR(); PWM6CR = (PWM6CR & ~0x18) | (Pin << 3); EAXRAM();}
#define  PWM15_PWM7_SW(Pin)                {EAXSFR(); PWM7CR = (PWM7CR & ~0x18) | (Pin << 3); EAXRAM();}

#define        PWM15_SW_P2                                0
#define        PWM15_SW_P1                                1
#define        PWM15_SW_P6                                2

/*************        本地变量声明        **************/

u16        pwm0,pwm1;
bit        B_PWM0_Dir;        //方向, 0为+, 1为-.

/*************        本地函数声明        **************/


/*************  外部函数和变量声明 *****************/


/******************** IO口配置 ********************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义

        GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P6,&GPIO_InitStructure);        //初始化  //###经提醒已经改到P6,但是还是不输出###
  //加入引脚切换操作,将PWM输出从P2切换到P6  
   PWM15_PWM0_SW(PWM15_SW_P6);
   PWM15_PWM1_SW(PWM15_SW_P6);
   PWM15_PWM2_SW(PWM15_SW_P6);
   PWM15_PWM3_SW(PWM15_SW_P6);

}

/******************** PWM15配置 ********************/
void        PWM15_config(void)
{
        PWM15_InitTypeDef                PWM15_InitStructure;

        PWM15_InitStructure.PWM_Enable    = ENABLE;                //PWM使能,  ENABLE, DISABLE
        PWM15_InitStructure.PWM_Period    = 0x1000;                //PWM周期,  0~0x7fff
        PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS;                //时钟源选择,  PWM_CLK_SYS, PWM_CLK_TM2
        PWM15_InitStructure.PWM_Clock_PS  = 0;                                //系统时钟分频参数(PS+1分频),  0~15
        PWM15_InitStructure.PWM_CInt      = DISABLE;        //计数器归零中断使能,  ENABLE, DISABLE
        PWM15_InitStructure.PWM_Counter   = ENABLE;                //计数器使能,  ENABLE, DISABLE
        PWM15_Init(&PWM15_InitStructure);

        PWM15Duty(PWM15_0,0x000,0x200);                //PWM_ID, 输出低电平位置, 输出高电平位置
        PWM15Duty(PWM15_1,0x200,0xc00);                //PWM_ID, 输出低电平位置, 输出高电平位置
        PWM15Duty(PWM15_2,0x400,0x800);                //PWM_ID, 输出低电平位置, 输出高电平位置
        PWM15Duty(PWM15_3,0x800,0xe00);                //PWM_ID, 输出低电平位置, 输出高电平位置
        PWMChannelCtrl(PWM15_0,ENABLE,0,DISABLE,DISABLE,DISABLE);        //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
        PWMChannelCtrl(PWM15_1,ENABLE,0,DISABLE,DISABLE,DISABLE);        //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
        PWMChannelCtrl(PWM15_2,ENABLE,0,DISABLE,DISABLE,DISABLE);        //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
        PWMChannelCtrl(PWM15_3,ENABLE,0,DISABLE,DISABLE,DISABLE);        //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断


}

/******************** task A **************************/
void main(void)
{
        GPIO_config();
        PWM15_config();
        while (1)
        {

        }
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-10-25 09:39:56 | 显示全部楼层
GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对P2口进行了初始化。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-28 18:39:50

3

主题

5

回帖

51

积分

注册会员

积分
51
发表于 2023-10-25 21:04:40 | 显示全部楼层
乘风*** 发表于 2023-10-25 09:39
GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对 ...

这个改过 忘记复制上去了 对P6口进行初始化了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-10-26 16:58:23 | 显示全部楼层
qhs*** 发表于 2023-10-25 21:04
这个改过 忘记复制上去了 对P6口进行初始化了

确实,15位增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"设置会覆盖通道切换设置。

需要将通道切换指令放到PWM设置函数后面才行。
附件例程修改了"PWMChannelCtrl"函数,将通道设置也放到这个函数的参数里,这样就不用单独设置通道了。

15位增强型PWM模式呼吸灯程序.zip

27.27 KB, 下载次数: 123

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-28 18:39:50

3

主题

5

回帖

51

积分

注册会员

积分
51
发表于 2023-10-30 19:45:40 | 显示全部楼层
乘风*** 发表于 2023-10-26 16:58
确实,15位增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"设置会覆盖通道切换设置。

需要将通道切换 ...

好的 感谢回复!我还发现官方库函数在io中断部分也可能有问题,执行完IO中断里的内容后,退出时间并不固定!(不存在嵌套中断和中断内执行任务消耗时间不同的情况)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-10-30 20:38:17 | 显示全部楼层
截图202310302037367146.jpg

深圳国芯人工智能有限公司-库函数 (stcai.com)

2023/10/30 更新 !
STC8A8K64D4库函数例程包更新如下:
1.  在例程起始位置开启扩展寄存器访问使能,之后就不再关闭;
2.  修改定时器初始化函数"Timer_Inilize"里定时器0、定时器1的TIM_Mode的有效值判断条件;
3.  定时器2,3,4添加8位预分频器设置;
4.  I2C、模拟I2C读写库函数添加设备地址参数;
5.  修改UART函数库,在头文件添加阻塞模式/队列模式设置选择定义,可通过定义选择串口发送模式;
6.  15为增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"增加通道选择;
7.  修改SPI时钟分频参数及注释;
8.  修改独立例程,使用库函数文件与综合例程一致;
9.  增加库函数文件夹,包含现有的库函数文件;


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-10-31 09:16:04 | 显示全部楼层
qhs*** 发表于 2023-10-30 19:45
好的 感谢回复!我还发现官方库函数在io中断部分也可能有问题,执行完IO中断里的内容后,退出时间并不固定 ...

能否提供相应的测试代码以及测试方法、测试数据?

STC8A库函数并没有提供普通IO口中断的例子,只有INT外部中断例子。
中断退出时间,通过仿真界面的汇编窗口,查看汇编指令就能计算出来:
截图202310310914299462.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-28 18:39:50

3

主题

5

回帖

51

积分

注册会员

积分
51
发表于 2023-11-2 22:09:53 | 显示全部楼层
乘风*** 发表于 2023-10-31 09:16
能否提供相应的测试代码以及测试方法、测试数据?

STC8A库函数并没有提供普通IO口中断的例子,只有INT外 ...

这个需要点时间整理下 把代码拎出来 工程代码不好直接贴出来
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:23 , Processed in 0.138392 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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