找回密码
 立即注册
查看: 921|回复: 4

STC8H系列 PLL-144MHz 支持的 高速 PWM,STC8H数据手册内容

[复制链接]

该用户从未签到

550

主题

9409

回帖

1万

积分

管理员

积分
13958
发表于 2023-10-2 14:41:26 | 显示全部楼层 |阅读模式
STC8H系列 PLL-144MHz 支持的 高速 PWM,STC8H数据手册内容24                                  高速高级PWMHSPWM
  
产品线
  
高速高级PWM
STC8H1K08系列
STC8H1K28系列
STC8H3K64S4系列
STC8H3K64S2系列
STC8H8K64U系列
STC8H4K64TL系列
STC8H4K64TLCD系列A系列
STC8H4K64TLCD系列A+系列
STC8H1K08T系列
STC8H2K08U系列
STC8H的部分系列单片机为高级PWMA和高级PWMB提供了高速模式(HSPWMA和HSPWMB)。高速高级PWM是以高级PWMA和高级PWMB为基础,增加了高速模式。
当系统运行在较低工作频率时,高速高级PWM可工作在高达144M~192M的频率下。从而可以达到降低内核功耗,提升外设性能的目的
24.1                  相关寄存器
  
符号
  
描述
地址
位地址与符号
复位值
B7
B6
B5
B4
B3
B2
B1
B0
HSPWMA_CFG
高速PWMA配置寄存器
FBF0H
-
-
-
-
-
INTEN
ASYNCEN
1
xxxx,0001
HSPWMA_ADR
高速PWMA地址寄存器
FBF1H
RW/BUSY
ADDR[6:0]
0000,0000
HSPWMA_DAT
高速PWMA数据寄存器
FBF2H
DATA[7:0]
0000,0000
HSPWMB_CFG
高速PWMB配置寄存器
FBF4H
-
-
-
-
-
INTEN
ASYNCEN
1
xxxx,0001
HSPWMB_ADR
高速PWMB地址寄存器
FBF5H
RW/BUSY
ADDR[6:0]
0000,0000
HSPWMB_DAT
高速PWMB数据寄存器
FBF6H
DATA[7:0]
0000,0000
24.1.1                     HSPWM配置寄存器(HSPWMn_CFG
  
符号
  
地址
B7
B6
B5
B4
B3
B2
B1
B0
HSPWMA_CFG
FBF0H
-
-
-
-
-
INTEN
ASYNCEN
1
HSPWMB_CFG
FBF4H
-
-
-
-
-
INTEN
ASYNCEN
1
ASYNCEN:异步控制模式使能位
0:关闭异步控制。
1:使能异步控制模式。
注:当关闭异步控制时,高级PWMA/高级PWMB为传统模式,此时高级PWM会自动选择系统工作频率,PWM工作频率与系统工作频率相同;若需要时PWM工作在高速模式,则需要使能异步控制模式,此时PWM时钟可选择主时钟(MCLK)或者PLL输出时钟
INTEN:异步模式中断使能位
0:关闭异步模式下的PWM中断。
1:使能异步模式下的PWM中断。
注:异步模式下,若需要响应高级PWMA/高级PWMB的中断,则必须使能INTEN位
24.1.2                     HSPWM地址寄存器(HSPWMn_ADR
  
符号
  
地址
B7
B6
B5
B4
B3
B2
B1
B0
HSPWMA_ADR
FBF1H
RW/BUSY
ADDR[6:0]
HSPWMB_ADR
FBF5H
RW/BUSY
ADDR[6:0]
ADDR[6:0]:高级PWMA/PWMB的特殊功能寄存器地址低7位
0:关闭异步控制。
1:使能异步控制模式。
RW/BUSY:读写控制位、状态位
写0:异步方式PWMA/PWMB的特殊功能寄存器。
写1:异步方式PWMA/PWMB的特殊功能寄存器。
读0:异步读写已经完成
读1:异步读写正在进行,处于忙状态
24.1.3                     HSPWM数据寄存器(HSPWMn_DAT
  
符号
  
地址
B7
B6
B5
B4
B3
B2
B1
B0
HSPWMA_DAT
FBF2H
DATA[7:0]
HSPWMB_DAT
FBF6H
DATA[7:0]
DATA[7:0]:高级PWMA/PWMB的特殊功能寄存器数据
写:写数据到高级PWMA/PWMB的特殊功能寄存器。
读:从高级PWMA/PWMB的特殊功能寄存器读取数据。
异步读取PWMA的特殊功能寄存器步骤:(PWMB类似)
       1、读取HSPWMA_ADR,等待BUSY0,确定前一个异步读写已完成
       2、将PWMA的特殊功能寄存器的低7位写入HSPWMA_ADR,同时置“1HSPWMA_ADR.7
       3、读取HSPWMA_ADR,等待BUSY0
       4、读取HSPWMA_DAT
异步写PWMA的特殊功能寄存器步骤:(PWMB类似)
       1、读取HSPWMA_ADR,等待BUSY0,确定前一个异步读写已完成
       2、将需要写入PWMA的特殊功能寄存器的数据写入HSPWMA_DAT
       3、将PWMA的特殊功能寄存器的低7位写入HSPWMA_ADR,同时清“0HSPWMA_ADR.7
       4、读取HSPWMA_ADR,等待BUSY0。(可跳过此步继续执行其他代码,以提高系统效率)
特别注意:特殊功能寄存器PWMA_PSPWMB_PS属于端口控制寄存器,不属于PWMAPWMB寄存器组,所以无论是否启动PWM的异步控制模式,PWMA_PSPWMB_PS寄存器都只能使用普通同步模式进行读写

回复 送花

使用道具 举报

该用户从未签到

550

主题

9409

回帖

1万

积分

管理员

积分
13958
 楼主| 发表于 2023-10-2 14:42:16 | 显示全部楼层
24.2              范例程序
24.2.1                     使能高级PWM的高速模式(异步模式)

//测试工作频率为24MHz
#include "stc8h.h"
#include "intrins.h"
#define       FOSC                           24000000UL
#define       HSCK_MCLK             0
#define       HSCK_PLL                 1
#define       HSCK_SEL                 HSCK_PLL
#define       PLL_96M                     0
#define       PLL_144M                  1
#define       PLL_SEL                     PLL_144M
#define       CKMS                          0x80
#define       HSIOCK                      0x40
#define       MCK2SEL_MSK        0x0c
#define       MCK2SEL_SEL1        0x00
#define       MCK2SEL_PLLD2     0x04
#define       MCK2SEL_PLLD4     0x08
#define       MCKSEL_MSK          0x03
#define       MCKSEL_HIRC         0x00
#define       MCKSEL_XOSC        0x01
#define       MCKSEL_X32K          0x02
#define       MCKSEL_IRC32K     0x03
#define       ENCKM                      0x80
#define       PCKI_MSK                 0x60
#define       PCKI_D1                     0x00
#define       PCKI_D2                     0x20
#define       PCKI_D3                     0x40
#define       PCKI_D4                     0x60
void delay()
{
         int     i;
         
         for    (i=0; i<100; i++);
}
char ReadPWMA(char addr)
{
         chardat;
         
         while(HSPWMA_ADR & 0x80);                                                //等待前一个异步读写完成
         HSPWMA_ADR= addr | 0x80;                                                   //设置间接访问地址,只需要设置原XFR地址的低7
                                                                                                                //HSPWMA_ADR寄存器的最高位写1,表示读数据
         while(HSPWMA_ADR & 0x80);                                                //等待当前异步读取完成
         dat    = HSPWMA_DAT;                                                              //读取异步数据
         
         returndat;
}
void WritePWMA(char addr, chardat)
{
         while(HSPWMA_ADR & 0x80);                                                //等待前一个异步读写完成
         HSPWMA_DAT= dat;                                                                 //准备需要写入的数据
         HSPWMA_ADR= addr & 0x7f;                                                 //设置间接访问地址,只需要设置原XFR地址的低7
                                                                                                                //HSPWMA_ADR寄存器的最高位写0,表示写数据
}
void main()
{
         P_SW2|= 0x80;                                                                            //使能访问XFR
         
         //选择PLL输出时钟
#if     (PLL_SEL == PLL_96M)
         CLKSEL&= ~CKMS;                                                                  //选择PLL96M作为PLL的输出时钟
#elif (PLL_SEL == PLL_144M)
         CLKSEL|= CKMS;                                                                      //选择PLL144M作为PLL的输出时钟
#else
         CLKSEL&= ~CKMS;                                                                  //默认选择PLL96M作为PLL的输出时钟
#endif
         
         //选择PLL输入时钟分频,保证输入时钟为12M
         PLLCR&= ~PCKI_MSK;
#if     (FOSC == 12000000UL)
         PLLCR|= PCKI_D1;                                                                   //PLL输入时钟1分频
#elif (FOSC == 24000000UL)
         PLLCR|= PCKI_D2;                                                                   //PLL输入时钟2分频
#elif (FOSC == 36000000UL)
         PLLCR|= PCKI_D3;                                                                   //PLL输入时钟3分频
#elif (FOSC == 48000000UL)
         PLLCR|= PCKI_D4;                                                                   //PLL输入时钟4分频
#else
         PLLCR|= PCKI_D1;                                                                   //默认PLL输入时钟1分频
#endif
         //启动PLL
         PLLCR|= ENCKM;                                                                    //使能PLL倍频
         
         delay();                                                                                          //等待PLL锁频
         //选择HSPWM/HSSPI时钟
#if     (HSCK_SEL == HSCK_MCLK)
         CLKSEL&= ~HSIOCK;                                                             //HSPWM/HSSPI选择主时钟为时钟源
#elif (HSCK_SEL == HSCK_PLL)
         CLKSEL|= HSIOCK;                                                                  //HSPWM/HSSPI选择PLL输出时钟为时钟源
#else
         CLKSEL&= ~HSIOCK;                                                             //默认HSPWM/HSSPI选择主时钟为时钟源
#endif
         HSCLKDIV= 0;                                                                            //HSPWM/HSSPI时钟源不分频
         
         HSPWMA_CFG= 0x03;                                                             //使能PWMA相关寄存器异步访问功能
         
         //通过异步方式设置PWMA的相关寄存器
         WritePWMA((char)&PWMA_CCER1,0x00);
         WritePWMA((char)&PWMA_CCMR1,0x00);                           //CC1为输出模式
         WritePWMA((char)&PWMA_CCMR1,0x60);                           //OC1REF输出PWM1(CNT<CCR时输出有效电平1)
         WritePWMA((char)&PWMA_CCER1,0x05);                           //使能CC1/CC1N上的输出功能
         WritePWMA((char)&PWMA_ENO,0x03);                                //使能PWM信号输出到端口
         WritePWMA((char)&PWMA_BKR,0x80);                                //使能主输出
         WritePWMA((char)&PWMA_CCR1H,200 >> 8);                    //设置输出PWM的占空比
         WritePWMA((char)&PWMA_CCR1L,200);
         WritePWMA((char)&PWMA_ARRH,1000 >> 8);                    //设置输出PWM的周期
         WritePWMA((char)&PWMA_ARRL,1000);
         WritePWMA((char)&PWMA_DTR,10);                                    //设置互补对称输出PWM的死区
         WritePWMA((char)&PWMA_CR1,0x01);                                 //开始PWM计数
         
         P2M0= 0;
         P2M1= 0;
         P3M0= 0;
         P3M1= 0;
         
         P2= ReadPWMA((char)&PWMA_ARRH);                               //异步方式读取寄存器
         P3= ReadPWMA((char)&PWMA_ARRL);
         
         while(1);
}



回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 167 天

    [LV.7]常住居民III

    67

    主题

    846

    回帖

    2836

    积分

    金牌会员

    积分
    2836
    发表于 2024-2-4 21:09:45 | 显示全部楼层
    请教大佬:144MHz高速下,是不是除了PWMA_PS外,其他的PWM寄存器读写都必须在异步模式下进行?

    点评

    是的。  详情 回复 发表于 2024-2-4 21:36
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2996

    回帖

    6753

    积分

    超级版主

    积分
    6753
    发表于 2024-2-4 21:36:41 | 显示全部楼层
    xxkj2010 发表于 2024-2-4 21:09
    请教大佬:144MHz高速下,是不是除了PWMA_PS外,其他的PWM寄存器读写都必须在异步模式下进行? ...

    是的。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 167 天

    [LV.7]常住居民III

    67

    主题

    846

    回帖

    2836

    积分

    金牌会员

    积分
    2836
    发表于 2024-2-5 09:13:50 | 显示全部楼层

    今天试一试,看能否调通高速模式。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-12 22:09 , Processed in 0.066022 second(s), 46 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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