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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-28 18:39
  • 签到天数: 1 天

    [LV.1]初来乍到

    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)
            {

            }
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1340

    回帖

    4181

    积分

    论坛元老

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-28 18:39
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    5

    回帖

    51

    积分

    注册会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1340

    回帖

    4181

    积分

    论坛元老

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

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

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

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

    27.27 KB, 下载次数: 23

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-28 18:39
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    5

    回帖

    51

    积分

    注册会员

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

    需要将通道切换 ...

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

    使用道具 举报

    该用户从未签到

    551

    主题

    9465

    回帖

    1万

    积分

    管理员

    积分
    14013
    发表于 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.  增加库函数文件夹,包含现有的库函数文件;


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1340

    回帖

    4181

    积分

    论坛元老

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

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

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-28 18:39
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    5

    回帖

    51

    积分

    注册会员

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

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-17 12:24 , Processed in 0.071129 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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