xxkj2010 发表于 2024-2-6 14:15:25

神农鼎 发表于 2024-2-6 09:46
也可从下面的链接中拷贝测试程序




加了个中断,却没有等到中断

xxkj2010 发表于 2024-2-6 14:30:36

本帖最后由 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-6 15:26:10

本帖最后由 xxkj2010 于 2024-2-7 08:33 编辑

问题已经解决,原因是还要配置这个寄存器:



页: 1 [2]
查看完整版本: 配置STC8H2K17U的PWM为144MHz,这样配置为什么不行|已解决