bogejiayou 发表于 2023-9-27 08:43:30

STC8H PWM寄存器配置 踩坑分享

昨天调试一个样品,芯片使用STC8H1K08,用到了两组PWM,一组PWM2P,一组PWM3N,配置完成烧写程序,2P是正常输出了,参数设置都对,但3N一直未有反应。示波器测试无任何波形输出,

尝试使用直接控制IO的方式,输出可控无异常,看来还是PWM配置出了问题。
从PWMA_ENO到PWMA_BKR,配置都没发现问题。参照例程,好像也没有问题。昨天时间太急,来不急论坛发贴求助了,静下心来把各寄存器再看一遍。恍然间发现问题确实出在配置PWMA_CCER2这里。
参照下图:因为我用了PWM3的N通道,那么我应该设置PWMA_CCER2的B2位CC3NE,OC3N的输出使能。而不是配置CC3E,OC3P的输出使能。
这是我踩的一个坑,希望不要再有同行遇到,总结这次坑主要责任还在于自己看规格书大意。BUT,官方做规格书能更严谨一些,如果CC3E那里你使用CC3PE,或着底下描述那里写CC3P的比较/输出使能,你写的是OC3,我误以为整个3都是它控制。


bogejiayou 发表于 2023-9-27 08:53:49

本帖最后由 bogejiayou 于 2023-9-27 08:56 编辑

另外分享一下第二个坑,其实也不算,一开始我查我的电脑有两个版本的STC8H的规格书,一个2021年,一个2020年,那就看新一点的20210308版本,就在看规格书内的例程,发现有PWMA_PS的配置,但我搜遍全规格书也没发现对这个寄存器的描述,很是无语,然后把2020年的规格书打开,找到了描述,原来是切换功能脚位。这里什么情况?这么重要的寄存器是在整理文档给删除了,于是乎今早去官网下载了最新的20230920版,嗯不错,日期看着真新鲜。还好PWMx_PS的寄存器描述又回来了,不过PWMx_CCER寄存器那里的描述依旧。希望官方看到能处理一下哈。

飞捷 发表于 2023-9-27 09:09:52

感谢分享,我也是第一次用,看这些多寄存器,没经验,一头雾水。

bogejiayou 发表于 2023-9-27 11:58:16

飞捷 发表于 2023-9-27 09:09
感谢分享,我也是第一次用,看这些多寄存器,没经验,一头雾水。

别看规格书洋洋洒洒几十页的PWM描述,我看完也不知道从何下手,只能说规格书做该有的描述,但对使用思路一字未提,并且寄存器的描述又好散乱,总之还有很多需要改进的地方了。但这些缺点确实掩盖不了它是一颗功能强大的MCU,学习的方法只能是实践出真知,使用例程,然后一点点去试去琢磨了。

神农鼎 发表于 2023-9-27 12:46:08

收到PWM的 心灵鸡汤后,我们PWM团队连夜 筑基/修炼到 圣境

1,最新 STC8H数据手册,全面更新 PWM 描述和例程
http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf
===2023/9/20, 多了视频讲解




2,请山东大学教授级专家来敲打我们PWM快速成长,
留下如下精华探讨【PWM应用宝典视频】

https://www.stcaimcu.com/forum.p ... 3184&extra=page%3D1






梁工 发表于 2023-9-27 14:12:14

可能理解的问题。
OC3,表示通道3。
CC3E,表示允许/禁止通道3,整个通道3都由CC3E允许或禁止。
CC3P:表示通道3输入/输出的极性。
CC3NE:表示通道3允许/禁止比较输出。
CC3NP:表示通道3比较输出极性。

bogejiayou 发表于 2023-9-27 14:18:43

神农鼎 发表于 2023-9-27 12:46
收到PWM的 心灵鸡汤后,我们PWM团队连夜 筑基/修炼到 圣境

1,最新 STC8H数据手册,全面更新 PWM 描述和例 ...

感谢老大分享的教程{:4_196:},赶紧学习去了。

bogejiayou 发表于 2023-9-27 14:30:43

梁工 发表于 2023-9-27 14:12
可能理解的问题。
OC3,表示通道3。
CC3E,表示允许/禁止通道3,整个通道3都由CC3E允许或禁止。

规格书上CC1NE和CC1E功能是写的一样,只是P通道有输入捕获功能,N通道没有,所以文字描述上也只有这点出入。
实际我用 PWMA_CCER2 = 0x04;正常打开了3N的输出,但用PWMA_CCER2 = 0x01;并未能打开。
2P通道配置为PWMA_CCER1 = 0x10;正常工作,所以才有了本贴的理解,难道终究还是错了?




Honsiti 发表于 2023-11-22 14:58:32

大佬 可以分享一下配置流程吗我用例程修改也无法正确得到pwm输出,自己一时之间也不知道哪里出了问题

bogejiayou 发表于 2023-11-28 10:45:03

Honsiti 发表于 2023-11-22 14:58
大佬 可以分享一下配置流程吗我用例程修改也无法正确得到pwm输出,自己一时之间也不知道哪里出了问题 ...

以下是我上次用到的代码,水平有限,你可以参照一下,


//-------------------------PWM初始化--------------------------------
void PWM_Init()
{
        P_SW2 = 0x80;                      //特殊功能寄存器位于扩展RAM区域
                                     //需先将P_SW2的BIT7设置为1,才可正常读写
        PWMA_CCER1 = 0x00;               //写CCMRx前必须先清零CCERx以关闭通道
        PWMA_CCER2 = 0x00;
       
       
        PWMA_CCMR2 = 0x60;               //通道2为PWM模式1
        PWMA_CCMR3 = 0x60;               //通道3为PWM模式1
       
        PWMA_CCER1 = 0x10;               //配置通道2输出使能和高电平有效
      PWMA_CCER2 = 0x04;               //配置通道3输出使能和高电平有效
       
       
       
        PWMA_PSCRH = 119/256;               //系统时钟12分频
        PWMA_PSCRL = 119%256;            //PWM时钟频率100KHz
        PWMA_ARRH= 99/256;                  //计数100,PWM输出频率1K
        PWMA_ARRL= 99%256;
       
        PWMA_BKR   = 0x80;                              //打开PWMA主输出使能
        PWMA_CR1   = 0x01;                   //预装载缓冲,边沿对齐,向上计数。
             EA= 1;                                  //开总中断
        //PWMA_EGR |= 0x01;                              //置位UG,产生更新事件,清零各寄存器
        //PWMA_EGR |= 0x01;
       
       
       
        //PWMA_PS = 0x00;
        //PWMB_PS = 0x04;            //PWM输出引脚切换
       
        //PWMA_ENO |= 0x14;          //打开PWM2P,PWM3P输出

}               

/**************************************************
//----------------PWM端口开关函数---------------------
void Red_PWM_ON(){
        PWMA_CCMR2 |= 0x60;                //转换回PWM1模式
        PWMA_CCMR2 &= 0xef;
        PWMA_ENO |= 0x04;}

void Red_PWM_OFF() { PWMA_ENO &= 0xfb;}


页: [1] 2
查看完整版本: STC8H PWM寄存器配置 踩坑分享