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)
{
}
}
GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对P2口进行了初始化。 乘风飞扬 发表于 2023-10-25 09:39
GPIO_config函数里面,既然切换到P6口,就需要对P6口相关的脚位进行初始化。
你的IO口配置函数里面现在只对 ...
这个改过 忘记复制上去了 对P6口进行初始化了
qhshen 发表于 2023-10-25 21:04
这个改过 忘记复制上去了 对P6口进行初始化了
确实,15位增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"设置会覆盖通道切换设置。
需要将通道切换指令放到PWM设置函数后面才行。
附件例程修改了"PWMChannelCtrl"函数,将通道设置也放到这个函数的参数里,这样就不用单独设置通道了。
乘风飞扬 发表于 2023-10-26 16:58
确实,15位增强型PWM通道控制寄存器设置函数"PWMChannelCtrl"设置会覆盖通道切换设置。
需要将通道切换 ...
好的 感谢回复!我还发现官方库函数在io中断部分也可能有问题,执行完IO中断里的内容后,退出时间并不固定!(不存在嵌套中断和中断内执行任务消耗时间不同的情况)
深圳国芯人工智能有限公司-库函数 (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.增加库函数文件夹,包含现有的库函数文件;
qhshen 发表于 2023-10-30 19:45
好的 感谢回复!我还发现官方库函数在io中断部分也可能有问题,执行完IO中断里的内容后,退出时间并不固定 ...
能否提供相应的测试代码以及测试方法、测试数据?
STC8A库函数并没有提供普通IO口中断的例子,只有INT外部中断例子。
中断退出时间,通过仿真界面的汇编窗口,查看汇编指令就能计算出来:
乘风飞扬 发表于 2023-10-31 09:16
能否提供相应的测试代码以及测试方法、测试数据?
STC8A库函数并没有提供普通IO口中断的例子,只有INT外 ...
这个需要点时间整理下 把代码拎出来 工程代码不好直接贴出来
页:
[1]