qiedhmkl 发表于 前天 18:47

求助:新手菜鸟,求助pwm输出

最近自己研究STC8H这个芯片,搞了一个电路需要使用到硬件PWM。芯片型号是STC8H1K08,需求就是让P1.1输出1KHz的波形。现在就是怎么写代码都不会有输出。#include "stc8h.h"

void main()
{
    // P1.1设置为推挽输出
    P1M1 &= ~0x02;
    P1M0 |= 0x02;
   
    // 允许访问扩展寄存器
    P_SW2 |= 0x80;
   
    // PWM配置
    PWMA_PS = 0x00;         // 预分频器不分频
    PWMA_PSCRH = 0x00;
    PWMA_PSCRL = 0x00;
   
    // 周期值 = 24000000/1000 - 1 = 23999
    PWMA_ARRH = 0x5D;         // 23999的高字节
    PWMA_ARRL = 0xDF;         // 23999的低字节
   
    // 占空比50% = 11999
    PWMA_CCR1H = 0x2E;      // 11999的高字节
    PWMA_CCR1L = 0xDF;      // 11999的低字节
   
    // 通道配置
    PWMA_CCMR1 = 0x60;      // PWM模式1
    PWMA_CCER1 = 0x01;      // 开启通道1输出
   
    // 输出使能
    PWMA_ENO |= 0x02;         // P1.1输出PWM
    PWMA_BKR = 0x80;          // 主输出使能
    PWMA_CR1 |= 0x01;         // 启动计数器
   
    while(1);
}求教各位大神帮我看看是哪一步做错了。STC8H的手册,PWM这些我看不懂

国芯人工智能 发表于 前天 18:48

你好,感谢你在国芯人工智能社区提问。你提到的问题是关于 STC8H1K08 芯片的 硬件PWM输出配置失败,目标是让 P11 引脚输出 1KHz 的 PWM 波形。从你提供的代码来看,已经做了一些基本的配置,但可能由于某些关键寄存器设置不当或时钟配置不正确,导致没有输出。

下面我将从几个方面进行详细分析,并提供修改建议和完整可运行的示例代码。

一、问题分析

你的代码主要做了如下配置:
设置 P11 为推挽输出
配置 PWM 模块(PWMA)
设置预分频、周期、占空比
配置通道模式和输出使能

但 没有看到时钟使能 和 PWM模块启动 的相关配置,这是导致PWM没有输出的主要原因。

二、STC8H1K08 PWM配置关键点

1. 系统时钟配置

STC8H系列芯片默认系统时钟为内部24MHz(可通过寄存器配置),在使用PWM前,必须确保系统时钟已正确配置,否则PWM的时钟源不正确,无法产生预期频率。

2. PWM模块时钟使能

要使用PWM模块,必须开启其时钟:

c
CLKPCON2 |= 0x20;   // 使能PWMA模块时钟

否则寄存器写入无效,模块无法工作。

3. 启动PWM计数器

配置完寄存器后,必须启动PWM计数器:

c
PWMACR1 |= 0x01;    // 启动PWM计数器

否则计数器不会开始计数,自然没有输出。

4. 输出引脚映射配置

PWMA模块的输出需要映射到对应的引脚。对于P11输出PWM,需要配置寄存器 PWMAOER:

c
PWMAOER |= 0x02;    // P11作为PWM输出

或者你已经使用 PWMAENO |= 0x02,但建议确认是否正确映射。

三、修改后的完整示例代码

以下是一个修改后的、可运行的示例代码,供你参考:

c
include "stc8hh"

void main()
{
    // 设置P11为推挽输出
    P1M1 &= ~0x02;
    P1M0 |= 0x02;

    // 允许访问扩展寄存器
    PSW2 |= 0x80;

    // 开启PWM模块时钟
    CLKPCON2 |= 0x20;

    // 清除PWM相关寄存器
    PWMACR1 = 0x00;
    PWMACR2 = 0x00;
    PWMASMCR = 0x00;
    PWMADTR = 0x00;
    PWMABKR = 0x00;

    // 预分频器不分频(24MHz)
    PWMAPS = 0x00;
    PWMAPSCRH = 0x00;
    PWMAPSCRL = 0x00;

    // 设置周期为1KHz:24MHz / 1000 = 24000,所以ARR = 24000 - 1 = 23999
    PWMAARRH = (23999 >> 8) & 0xFF;
    PWMAARRL = 23999 & 0xFF;

    // 设置占空比50%:23999 / 2 = 11999.5 ≈ 11999
    PWMACCR1H = (11999 >> 8) & 0xFF;
    PWMACCR1L = 11999 & 0xFF;

    // 配置通道1为PWM模式1
    PWMACCMR1 = 0x60;

    // 使能通道1输出
    PWMACCER1 = 0x01;

    // 配置PWM输出引脚(P11)
    PWMAENO |= 0x02;

    // 启动PWM计数器
    PWMACR1 |= 0x01;

    while(1)
    {
      // 主循环
    }
}

四、注意事项

1. 确认引脚复用功能:有些引脚需要配置为复用功能才能输出PWM波形。请参考数据手册确认P11是否支持PWM输出并已正确配置。
2. 使用示波器测量输出:万用表可能无法检测到PWM波形,建议使用示波器测量。
3. 系统时钟确认:若你修改了系统时钟,请确保 CLKDIV 和 CLKSW 寄存器配置正确,否则PWM频率会偏差。
4. 使用官方库函数:如果你使用的是官方提供的 stc8hh.h 头文件,请确保是最新版本,避免寄存器定义错误。

五、结语

STC8H系列芯片的PWM配置相对复杂,需要对寄存器逐个配置,尤其要注意时钟使能和模块启动。希望以上分析和代码能够帮助你解决问题。

如果你还有其他关于STC8H或嵌入式开发的问题,欢迎继续提问!

祝你调试顺利!

—— 国芯人工智能技术团队

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

王昱顺 发表于 昨天 09:53

是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出
应该改为
PWMA_CCER1=0x05;

qiedhmkl 发表于 昨天 21:53

王昱顺 发表于 2025-10-15 09:53
是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出


感谢!确实是ccer的配置错了。我去查查这个寄存器
页: [1]
查看完整版本: 求助:新手菜鸟,求助pwm输出