bbgjtotg 发表于 2025-8-5 18:57:09

请问根据手册写的PWMB捕获周期和占空比程序,串口无法正常输出,这个应该怎么改正?

使用的是STC8H2K08U芯片SOP20封装,主频选择33.1776MHz,照着例程写的PWM5_2引脚捕获信号发生器发出得PWM波的占空比和周期;
具体程序如下,请问是出了什么问题?经测试,信号发生器输出波形为占空比为50%的2KHz的PWM波,串口软件能够读取到PWM Test.的字符串;
#include "stc8h.h"
#include "intrins.h"
#include "stdio.h"

#defineFOSC   33177600UL
#defineBRT    (65536-FOSC/115200/4)
#defineT10K      (65536-FOSC/10000)
#defineT11K      (65536-FOSC/11000)
#defineT12K      (65536-FOSC/12000)
#defineT13K      (65536-FOSC/13000

unsigned int ccr1;
unsigned int ccr3;
unsigned int ccr5;
unsigned int ccr7;

unsigned int cycle1;
unsigned int duty1;
unsigned int cycle2;
unsigned int duty2;
unsigned int cycle3;
unsigned int duty3;
unsigned int cycle4;
unsigned int duty4;

bit f1,f2,f3,f4;

void main()
{
      P_SW2 |= 0x80;                //使能访间XFR,没有冲突不用关闭
      
      P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
      P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

      P_SW1|=0x40;                //切换串口1原始引脚到2引脚
      SCON=0x52;                        //串口使能,但是要复用
      T2L=BRT;
      T2H=BRT>>8;
      AUXR|=0x15;
      
      printf("PWM Test.\n");
      
      //引脚要切换为p17
      PWMB_PS|=0x01;
      PWMB_CCER1 = 0x00;
    PWMB_CCMR1 = 0x01;                        //CC5为输入模式,且映射到TI5FP5上
    PWMB_CCMR2 = 0x02;                        //CC6为输入模式,且映射到TI5FP6上
    PWMB_CCER1 = 0x11;                        //使能CC5/CC6上的捕获功能
    PWMB_CCER1 |= 0x00;                         //设置捕获极性为CC1的上升沿
    PWMB_CCER1 |= 0x20;                         //设置捕获极性为CC2的下降沿
      
      
      PWMB_SMCR = 0x54;                           //从模式控制寄存器,管理滤波TS=TI1FP1,SMS=TI1上升沿复位模式
      PWMB_CR1 = 0x01;                                                          //使能计数器
      PWMB_IER = 0x06;                            //使能CC1/CC2捕获中断
      
      
    EA = 1;

    while (1)
      {
                if(f1)
                {
                        f1=0;
                        printf("cycle1=%4x,duty1=%4x\n",cycle1,duty1);
                }
                if(f2)
                {
                        f2=0;
                        printf("cycle2=%4x duty2=%4x\n",cycle2,duty2);
                }
                if(f3)
                {
                        f3=0;
                        printf("cycle3=%4x duty3=%4x\n",cycle3,duty3);
                }
                if(f4)
                {
                        f4=0;
                        printf("cycle4=%4x duty4=%4x\n",cycle4,duty4);
                }
      }
}


void PWMB_ISR() interrupt PWMB_VECTOR
{
      unsigned int cnt;

    if (PWMB_SR1 & 0x02)                //CC5捕获中断,用于计算周期
    {
      PWMB_SR1 &= ~0x02;
                cnt = (PWMB_CCR5H<<8)+PWMB_CCR5L;                        //CC1捕获周期宽度
               cycle3=cnt;f3=1;
    }
    if (PWMB_SR1 & 0x04)                //CC6捕获中断,用于计算占空比
    {
      PWMB_SR1 &= ~0x04;
                cnt = (PWMB_CCR6H<<8)+PWMB_CCR6L;duty3=cnt-ccr5;

               
    }

}
捕获的PWM波形如下图:

国芯人工智能 发表于 2025-8-5 18:58:00

根据您提供的信息,使用STC8H2K08U芯片(SOP20封装),主频设置为33.1776MHz,并尝试通过PWMB捕获功能实现PWM波输出,但程序未能正常工作。以下是对该问题的分析及建议。

首先,检查代码中是否存在语法错误或配置不当的问题:

1. 头文件引用不正确:
   您在代码中包含了 "stc8hh"、"intrinsh" 和 "stdioh" 头文件。需要注意的是,标准C库头文件应为 "stdio.h"(注意是 .h 而非 .h")。此外,"intrinsh" 通常用于内联汇编函数,可能不是必须的。建议修正如下:
   c
   #include "stc8h.h"
   #include "intrins.h"
   #include "stdio.h"

2. 宏定义中的括号缺失:
   在 #define T13K (65536-FOSC/13000 这一行中,缺少了右括号 ),这可能导致编译器报错或计算结果异常。应修正为:
   c
   #define T13K      (65536-FOSC/13000)

3. 主函数未完整编写:
   您的 main() 函数在 PSW2 |= 0x80; 后未继续编写,导致程序无法运行。请确保完成初始化和主循环内容。

4. PWMB模块配置不完整:
   STC8H系列支持多个PWM通道,但需要对PWMB进行正确的初始化。例如,需设置PWM模式、分频、周期、占空比等参数。若您仅设置了部分寄存器,可能导致PWM无法正常输出。

5. 主频设置与定时器匹配问题:
   您将主频设为33.1776MHz,但在计算定时器初值时,使用的是 FOSC/115200 或 FOSC/10000 等,这可能是为了串口通信而设定的。若PWM模块使用的是定时器1或2,请确认其时钟源是否与主频一致,并合理计算定时器初值。

6. PWM输出引脚未正确配置:
   PWM信号输出依赖于GPIO引脚的复用功能。请确保所使用的引脚(如PWM52)已正确配置为PWM功能,并且没有被其他功能占用。

7. PWM捕获与输出逻辑混淆:
   PWMB模块通常用于PWM输出,而非捕获功能。若您误用了捕获功能(如使用CAPB模块),则可能导致逻辑错误。请确认您是否希望使用PWM输出还是PWM捕获功能。

8. 调试信息验证:
   您提到串口软件可以读取到“PWM Test”的字符串,说明程序至少能运行到某个阶段。建议在关键位置添加调试打印,以确认PWM初始化是否成功执行。

综上所述,建议您按照以下步骤进行排查与修复:
修正头文件引用和宏定义;
完善 main() 函数,确保所有初始化代码完整;
正确配置PWMB模块,包括时钟源、分频、周期和占空比;
验证PWM输出引脚是否已正确设置为PWM功能;
使用调试工具或示波器检查PWM信号实际输出情况;
参考官方数据手册和例程,确保代码符合芯片规范。

如需进一步协助,请提供完整的代码和具体测试现象(如LED指示灯状态、串口输出内容等),以便更精准定位问题。

[本文内容由国芯人工智能辅助生成,仅供参考]

bbgjtotg 发表于 2025-8-6 14:27:08

找到原因了,数据手册的采样四路pwm的占空比和周期的例程出错了
页: [1]
查看完整版本: 请问根据手册写的PWMB捕获周期和占空比程序,串口无法正常输出,这个应该怎么改正?