神农鼎 发表于 2023-10-2 14:41:26

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

STC8H系列 PLL-144MHz 支持的 高速 PWM,STC8H数据手册内容24                                  高速高级PWM(HSPWM)
产品线高速高级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                  相关寄存器
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
HSPWMA_CFG高速PWMA配置寄存器FBF0H-----INTENASYNCEN1xxxx,0001
HSPWMA_ADR高速PWMA地址寄存器FBF1HRW/BUSYADDR0000,0000
HSPWMA_DAT高速PWMA数据寄存器FBF2HDATA0000,0000
HSPWMB_CFG高速PWMB配置寄存器FBF4H-----INTENASYNCEN1xxxx,0001
HSPWMB_ADR高速PWMB地址寄存器FBF5HRW/BUSYADDR0000,0000
HSPWMB_DAT高速PWMB数据寄存器FBF6HDATA0000,0000
24.1.1                     HSPWM配置寄存器(HSPWMn_CFG)
符号地址B7B6B5B4B3B2B1B0
HSPWMA_CFGFBF0H-----INTENASYNCEN1
HSPWMB_CFGFBF4H-----INTENASYNCEN1
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)
符号地址B7B6B5B4B3B2B1B0
HSPWMA_ADRFBF1HRW/BUSYADDR
HSPWMB_ADRFBF5HRW/BUSYADDR
ADDR:高级PWMA/PWMB的特殊功能寄存器地址低7位0:关闭异步控制。1:使能异步控制模式。RW/BUSY:读写控制位、状态位写0:异步方式写PWMA/PWMB的特殊功能寄存器。写1:异步方式读PWMA/PWMB的特殊功能寄存器。读0:异步读写已经完成读1:异步读写正在进行,处于忙状态 24.1.3                     HSPWM数据寄存器(HSPWMn_DAT)
符号地址B7B6B5B4B3B2B1B0
HSPWMA_DATFBF2HDATA
HSPWMB_DATFBF6HDATA
DATA:高级PWMA/PWMB的特殊功能寄存器数据写:写数据到高级PWMA/PWMB的特殊功能寄存器。读:从高级PWMA/PWMB的特殊功能寄存器读取数据。 异步读取PWMA的特殊功能寄存器步骤:(PWMB类似)       1、读取HSPWMA_ADR,等待BUSY为0,确定前一个异步读写已完成       2、将PWMA的特殊功能寄存器的低7位写入HSPWMA_ADR,同时置“1”HSPWMA_ADR.7       3、读取HSPWMA_ADR,等待BUSY为0        4、读取HSPWMA_DAT 异步写PWMA的特殊功能寄存器步骤:(PWMB类似)       1、读取HSPWMA_ADR,等待BUSY为0,确定前一个异步读写已完成       2、将需要写入PWMA的特殊功能寄存器的数据写入HSPWMA_DAT       3、将PWMA的特殊功能寄存器的低7位写入HSPWMA_ADR,同时清“0”HSPWMA_ADR.7       4、读取HSPWMA_ADR,等待BUSY为0。(可跳过此步继续执行其他代码,以提高系统效率) 特别注意:特殊功能寄存器PWMA_PS和PWMB_PS属于端口控制寄存器,不属于PWMA和PWMB寄存器组,所以无论是否启动PWM的异步控制模式,PWMA_PS和PWMB_PS寄存器都只能使用普通同步模式进行读写

神农鼎 发表于 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;                                                                  //选择PLL的96M作为PLL的输出时钟#elif (PLL_SEL == PLL_144M)         CLKSEL|= CKMS;                                                                      //选择PLL的144M作为PLL的输出时钟#else         CLKSEL&= ~CKMS;                                                                  //默认选择PLL的96M作为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);}


xxkj2010 发表于 2024-2-4 21:09:45

请教大佬:144MHz高速下,是不是除了PWMA_PS外,其他的PWM寄存器读写都必须在异步模式下进行?

梁工 发表于 2024-2-4 21:36:41

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

是的。

xxkj2010 发表于 2024-2-5 09:13:50

梁工 发表于 2024-2-4 21:36
是的。

今天试一试,看能否调通高速模式。
页: [1]
查看完整版本: STC8H系列 PLL-144MHz 支持的 高速 PWM,STC8H数据手册内容