qhshen 发表于 2023-10-24 21:26:57

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

本帖最后由 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"修改频率).

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

/*************      本地常量声明      **************/
#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();}

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

      }
}

乘风飞扬 发表于 2023-10-25 09:39:56

GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对P2口进行了初始化。

qhshen 发表于 2023-10-25 21:04:40

乘风飞扬 发表于 2023-10-25 09:39
GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对 ...

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

乘风飞扬 发表于 2023-10-26 16:58:23

qhshen 发表于 2023-10-25 21:04
这个改过 忘记复制上去了 对P6口进行初始化了

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

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

qhshen 发表于 2023-10-30 19:45:40

乘风飞扬 发表于 2023-10-26 16:58
确实,15位增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"设置会覆盖通道切换设置。

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

神农鼎 发表于 2023-10-30 20:38:17



深圳国芯人工智能有限公司-库函数 (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.增加库函数文件夹,包含现有的库函数文件;

乘风飞扬 发表于 2023-10-31 09:16:04

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

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

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


qhshen 发表于 2023-11-2 22:09:53

乘风飞扬 发表于 2023-10-31 09:16
能否提供相应的测试代码以及测试方法、测试数据?

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

这个需要点时间整理下 把代码拎出来 工程代码不好直接贴出来
页: [1]
查看完整版本: STC8A_PWM15bit官方库存在问题,无法切换引脚