找回密码
 立即注册
查看: 105|回复: 2

有关HSPWM

[复制链接]
已绑定手机

307

主题

584

回帖

2961

积分

金牌会员

积分
2961
发表于 2026-10-15 07:39:22 | 显示全部楼层 |阅读模式
PWM运行在144MHZ下,CPU运行在36MHZ,同时我也打开了HSPWM

由于使用HSPWM写寄存器比较耗时,我试了下在HSPWM开启的同时直接用普通PWM寄存器写也是没有问题的
推荐这样做吗,有什么风险
回复

使用道具 举报 送花

25

主题

252

回帖

2375

积分

版主

积分
2375
发表于 2026-10-15 08:50:55 | 显示全部楼层
回复

使用道具 举报 送花

25

主题

252

回帖

2375

积分

版主

积分
2375
发表于 2026-10-15 08:51:21 | 显示全部楼层

我已完整读取了该帖子内容(仅楼主提问,暂无回复),并查阅了手册中相关章节。下面基于手册依据,对帖子中提出的问题进行专业解答。


关于「HSPWM 开启时同时用普通 PWM 寄存器写」的问题解答

一、先明确帖子描述的场景

帖子提到:

  • PWM 运行在 144MHz 下,CPU 运行在 36MHz;
  • 同时打开了 HSPWM(高速高级 PWM);
  • 因为用 HSPWM(异步方式)写寄存器比较耗时,于是尝试在 HSPWM 开启的同时,直接用普通 PWM 寄存器写,发现"也没有问题",问是否推荐、有什么风险。

二、手册依据(关键结论)

依据《STC8H 系列手册》「高速高级PWM(HSPWM)」章节,HSPWM 的本质和访问方式如下:

1. HSPWM 是在高级 PWMA/PWMB 基础上增加了高速模式(异步控制模式)

STC8H的部分系列单片机为高级PWMA和高级PWMB提供了高速模式(HSPWMA和HSPWMB)。高速高级PWM是以高级PWMA和高级PWMB为基础,增加了高速模式。

2. 关闭异步控制时 = 传统模式;开启异步控制时 = 高速模式

当关闭异步控制时,高级PWMA/高级PWMB为传统模式,此时高级PWM会自动选择系统工作频率,PWM工作频率与系统工作频率相同;若需要时PWM工作在高速模式,则需要使能异步控制模式,此时PWM时钟可选择主时钟(MCLK)或者PLL输出时钟。

3. 异步访问方式通过「间接地址/数据寄存器」实现

  • HSPWMA_ADR(地址寄存器):ADDR[6:0] 为 PWMA 特殊功能寄存器地址低7位,B7 为 RW/BUSY 位;
  • HSPWMA_DAT(数据寄存器):写入/读取的数据;
  • 异步写步骤:
    1. 读 HSPWMA_ADR,等 BUSY 为 0;
    2. 将数据写入 HSPWMA_DAT;
    3. 将寄存器低7位地址写入 HSPWMA_ADR,同时清 B7=0;
    4. 读 HSPWMA_ADR 等 BUSY 为 0(可跳过)。

4. 一个非常关键的"特别注意"(手册原文)

特别注意:特殊功能寄存器 PWMA_PS 和 PWMB_PS 属于端口控制寄存器,不属于 PWMA 和 PWMB 寄存器组,所以无论是否启动 PWM 的异步控制模式,PWMA_PS 和 PWMB_PS 寄存器都只能使用普通同步模式进行读写


三、回答:推荐这样做吗?有什么风险?

结论:不推荐在 HSPWM(异步模式)已开启运行时,随意混用「普通寄存器直写」和「异步间接写」两种方式操作同一组 PWM 寄存器,存在风险。 理由如下:

1. 两套时钟域不同,普通直写操作的是「同步域」寄存器

HSPWM 异步模式下,PWM 时基由 PLL(144M/96M)等高速时钟驱动,而 CPU 只有 36MHz。此时 PWMA 的寄存器组处于异步控制模式——即 CPU 对它们的访问必须经 HSPWMA_ADR/DAT 间接进行。如果直接对 PWMA_xxx 绝对地址进行写,等于绕过了异步握手(BUSY 判断),没有同步机制保证写入时机,可能造成:

  • 与正在进行的 PWM 更新事件冲突,出现写入被丢弃或产生毛刺;
  • 与异步读写的时序竞争,导致寄存器值不确定。

2. 手册只明确了 PWMA_PS/PWMB_PS 可以用普通同步方式读写

手册中唯一明确允许"用普通同步模式读写"的例外,是 PWMA_PS / PWMB_PS 这两个端口控制寄存器(它们本就不属于 PWMA/PWMB 寄存器组)。对于 PWMA/PWMB 组内寄存器,手册给出的标准操作方式是异步间接访问。帖子中"直接写普通寄存器也没问题",更可能是:

  • 所写寄存器恰好是 PS 之类的端口寄存器;
  • 或写入的时机恰好没有与更新事件冲突(属于"碰巧没事",不代表可靠)。

3. 论坛该帖目前无官方回复

该帖目前只有楼主提问,尚无 STC 官方或版主回复,属于个人实测现象,不能作为"官方推荐用法"采纳。


四、正确做法建议

  1. 统一访问方式:HSPWM 异步模式运行时,对 PWMA/PWMB 寄存器统一使用 HSPWMA_ADR/DAT 异步间接读写(写前判 BUSY、写后可选等待 BUSY)。参见手册「范例程序:使能高级PWM的高速模式(异步模式)」中的 WritePWMA()/ReadPWMA() 函数。
  2. PWMA_PS/PWMB_PS 例外处理:这两个端口控制寄存器无论是否开启异步模式,都只能用普通同步方式读写(手册明确要求)。
  3. 若不需要 144M 高速:则应关闭异步控制(HSPWMA_CFG 的 ASYNCEN=0,进入传统模式),此时 PWM 频率 = 系统频率,直接用普通寄存器读写即可,无需间接访问。
  4. 中断注意:异步模式下若需响应 PWMA/PWMB 中断,必须使能 HSPWMA_CFG 的 INTEN 位(手册注明)。

五、功能支持提示(重要)

需要注意的是,并非所有 STC8H 系列都支持 HSPWM。依据手册「高速高级PWM」章节开头的功能支持表:

  • 支持高速高级PWM(HSPWM)的型号:STC8H1K08T 系列、STC8H2K12U-A/B 系列、STC8H2K32U 系列;
  • STC8H8K64U 系列、STC8H1K08/1K28/3K64S4/3K64S2/4K64TL/4K64TLCD 系列不支持 HSPWM(表中为空白)。

因此,如果您实际使用的是 STC8H8K64U,它本身不具备 HSPWM 高速异步模式,上述问题对它不适用;只有上述支持型号才涉及"144MHz PWM + 异步访问"的场景。


信息来源:

  • 《STC8H 系列手册》「高速高级PWM(HSPWM)」章节(HSPWM 配置寄存器、地址/数据寄存器、异步读写步骤、范例程序)
  • 《STC8H 系列手册》「16位高级PWM定时器,支持正交编码器」章节(PWMA/PWMB 寄存器组、时钟与输出频率公式、功能支持表)
  • 论坛帖(thread-25752)为楼主提问,暂无回复,属个人实测现象

如果您能告诉我具体使用的芯片型号和实际要实现的 PWM 需求(频率/占空比/是否需 144M),我可以帮您确认是否该用异步方式,并给出规范的操作代码。


🔍 搜索 "STC 单片机 论坛 帖子"

⏱️ 查找用时 9.6s | 总回答用时 20.1s

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-8 02:07 , Processed in 0.070143 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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