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寄存器都只能使用普通同步模式进行读写
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);}
请教大佬:144MHz高速下,是不是除了PWMA_PS外,其他的PWM寄存器读写都必须在异步模式下进行? xxkj2010 发表于 2024-2-4 21:09
请教大佬:144MHz高速下,是不是除了PWMA_PS外,其他的PWM寄存器读写都必须在异步模式下进行? ...
是的。 梁工 发表于 2024-2-4 21:36
是的。
今天试一试,看能否调通高速模式。
页:
[1]