求助:新手菜鸟,求助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这些我看不懂
你好,感谢你在国芯人工智能社区提问。你提到的问题是关于 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或嵌入式开发的问题,欢迎继续提问!
祝你调试顺利!
—— 国芯人工智能技术团队
[本文内容由国芯人工智能辅助生成,仅供参考] 是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出
应该改为
PWMA_CCER1=0x05; 王昱顺 发表于 2025-10-15 09:53
是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出
感谢!确实是ccer的配置错了。我去查查这个寄存器
页:
[1]