请问根据手册写的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波形如下图:
根据您提供的信息,使用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指示灯状态、串口输出内容等),以便更精准定位问题。
[本文内容由国芯人工智能辅助生成,仅供参考] 找到原因了,数据手册的采样四路pwm的占空比和周期的例程出错了
页:
[1]