也可从下面的链接中拷贝测试程序
加了个中断,却没有等到中断 本帖最后由 xxkj2010 于 2024-2-6 14:40 编辑
用查询的方式就可以
//测试工作频率为24MHz
#include "stc8h.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#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_96M
#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)
{
char dat;
while(HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_ADR= addr | 0x80; //设置间接访问地址,只需要设置原XFR地址的低7位
//HSPWMA_ADR寄存器的最高位写1,表示读数据
while(HSPWMA_ADR & 0x80); //等待当前异步读取完成
dat = HSPWMA_DAT; //读取异步数据
return dat;
}
void WritePWMA(char addr, char dat)
{
while(HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_DAT= dat; //准备需要写入的数据
HSPWMA_ADR= addr & 0x7f; //设置间接访问地址,只需要设置原XFR地址的低7位
//HSPWMA_ADR寄存器的最高位写0,表示写数据
}
void main()
{
P_SW2|= 0x80; //使能访问XFR
XOSCCR = 0xc0; // 启动外部晶振
while (!(XOSCCR & 1)); // 等待时钟稳定
CLKDIV = 0x00; // 时钟不分频
CKSEL = 0x01;// 选择外部晶振
//选择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_PSCRH,(48000 - 1)>>8);
WritePWMA((char)&PWMA_PSCRL,48000 - 1);
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,2000 >> 8); //设置输出PWM的周期
WritePWMA((char)&PWMA_ARRL,2000);
WritePWMA((char)&PWMA_DTR,10); //设置互补对称输出PWM的死区
WritePWMA((char)&PWMA_CR1,0x01); //开始PWM计数
// WritePWMA((char)&PWMA_IER,0x01); // 使能PWMA中断
// EA=1;
P1M0= 0;
P1M1= 0;
P2M0= 0;
P2M1= 0;
P3M0= 0;
P3M1= 0;
// P2= ReadPWMA((char)&PWMA_ARRH); //异步方式读取寄存器
// P3= ReadPWMA((char)&PWMA_ARRL);
while(1)
{
u8 i=ReadPWMA((char)&PWMA_SR1);
if (i&0x01)
{
WritePWMA((char)&PWMA_SR1,i&~0x01);
P37=!P37;
}
}
}
//void PWMA_Isr() interrupt 26 // PWMA中断处理程序,用于产生1秒中断
//{
// u8 i=ReadPWMA((char)&PWMA_SR1);
// if (i & 0x01)
// {
// WritePWMA((char)&PWMA_SR1,i & ~0x01); // 清除PWM中断
// P37=!P37;//P10=!P10;
// }
//}
本帖最后由 xxkj2010 于 2024-2-7 08:33 编辑
问题已经解决,原因是还要配置这个寄存器:
页:
1
[2]