找回密码
 立即注册
查看: 24|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-10-15 21:53:28
已绑定手机

1

主题

1

回帖

15

积分

新手上路

积分
15
发表于 前天 18:47 | 显示全部楼层 |阅读模式
最近自己研究STC8H这个芯片,搞了一个电路需要使用到硬件PWM。芯片型号是STC8H1K08,需求就是让P1.1输出1KHz的波形。现在就是怎么写代码都不会有输出。
  1. #include "stc8h.h"
  2. void main()
  3. {
  4.     // P1.1设置为推挽输出
  5.     P1M1 &= ~0x02;
  6.     P1M0 |= 0x02;
  7.    
  8.     // 允许访问扩展寄存器
  9.     P_SW2 |= 0x80;
  10.    
  11.     // PWM配置
  12.     PWMA_PS = 0x00;           // 预分频器不分频
  13.     PWMA_PSCRH = 0x00;
  14.     PWMA_PSCRL = 0x00;
  15.    
  16.     // 周期值 = 24000000/1000 - 1 = 23999
  17.     PWMA_ARRH = 0x5D;         // 23999的高字节
  18.     PWMA_ARRL = 0xDF;         // 23999的低字节
  19.    
  20.     // 占空比50% = 11999
  21.     PWMA_CCR1H = 0x2E;        // 11999的高字节
  22.     PWMA_CCR1L = 0xDF;        // 11999的低字节
  23.    
  24.     // 通道配置
  25.     PWMA_CCMR1 = 0x60;        // PWM模式1
  26.     PWMA_CCER1 = 0x01;        // 开启通道1输出
  27.    
  28.     // 输出使能
  29.     PWMA_ENO |= 0x02;         // P1.1输出PWM
  30.     PWMA_BKR = 0x80;          // 主输出使能
  31.     PWMA_CR1 |= 0x01;         // 启动计数器
  32.    
  33.     while(1);
  34. }
复制代码
求教各位大神帮我看看是哪一步做错了。STC8H的手册,PWM这些我看不懂
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

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

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

一、问题分析

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

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

二、STC8H1K08 PWM配置关键点

1. 系统时钟配置

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

2. PWM模块时钟使能

要使用PWM模块,必须开启其时钟:
  1. c
  2. CLKPCON2 |= 0x20;   // 使能PWMA模块时钟
复制代码

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

3. 启动PWM计数器

配置完寄存器后,必须启动PWM计数器:
  1. c
  2. PWMACR1 |= 0x01;    // 启动PWM计数器
复制代码

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

4. 输出引脚映射配置

PWMA模块的输出需要映射到对应的引脚。对于P11输出PWM,需要配置寄存器 PWMAOER:
  1. c
  2. PWMAOER |= 0x02;    // P11作为PWM输出
复制代码

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

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

以下是一个修改后的、可运行的示例代码,供你参考:
  1. c
  2. include "stc8hh"
  3. void main()
  4. {
  5.     // 设置P11为推挽输出
  6.     P1M1 &= ~0x02;
  7.     P1M0 |= 0x02;
  8.     // 允许访问扩展寄存器
  9.     PSW2 |= 0x80;
  10.     // 开启PWM模块时钟
  11.     CLKPCON2 |= 0x20;
  12.     // 清除PWM相关寄存器
  13.     PWMACR1 = 0x00;
  14.     PWMACR2 = 0x00;
  15.     PWMASMCR = 0x00;
  16.     PWMADTR = 0x00;
  17.     PWMABKR = 0x00;
  18.     // 预分频器不分频(24MHz)
  19.     PWMAPS = 0x00;
  20.     PWMAPSCRH = 0x00;
  21.     PWMAPSCRL = 0x00;
  22.     // 设置周期为1KHz:24MHz / 1000 = 24000,所以ARR = 24000 - 1 = 23999
  23.     PWMAARRH = (23999 >> 8) & 0xFF;
  24.     PWMAARRL = 23999 & 0xFF;
  25.     // 设置占空比50%:23999 / 2 = 11999.5 ≈ 11999
  26.     PWMACCR1H = (11999 >> 8) & 0xFF;
  27.     PWMACCR1L = 11999 & 0xFF;
  28.     // 配置通道1为PWM模式1
  29.     PWMACCMR1 = 0x60;
  30.     // 使能通道1输出
  31.     PWMACCER1 = 0x01;
  32.     // 配置PWM输出引脚(P11)
  33.     PWMAENO |= 0x02;
  34.     // 启动PWM计数器
  35.     PWMACR1 |= 0x01;
  36.     while(1)
  37.     {
  38.         // 主循环
  39.     }
  40. }
复制代码

四、注意事项

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

五、结语

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

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

祝你调试顺利!

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 昨天 09:53 | 显示全部楼层
是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出
应该改为
PWMA_CCER1=0x05;
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-10-15 21:53:28
已绑定手机

1

主题

1

回帖

15

积分

新手上路

积分
15
发表于 昨天 21:53 | 显示全部楼层
王*** 发表于 2025-10-15 09:53
是ccer1部分配置错了
你想使用的这个是pwm1n端口,但是你只给pwm1p使能了
当然是没有输出

感谢!确实是ccer的配置错了。我去查查这个寄存器
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 03:26 , Processed in 0.131841 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表