找回密码
 立即注册
楼主: xxkj***

配置STC8H2K17U的PWM为144MHz,这样配置为什么不行|已解决

[复制链接]
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2024-2-6 14:15:25 | 显示全部楼层
    神农鼎 发表于 2024-2-6 09:46
    也可从下面的链接中拷贝测试程序

    加了个中断,却没有等到中断
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2024-2-6 14:30:36 | 显示全部楼层
    本帖最后由 xxkj2010 于 2024-2-6 14:40 编辑

    用查询的方式就可以

    1. //测试工作频率为24MHz
    2. #include "stc8h.h"
    3. #include "intrins.h"
    4. typedef unsigned char u8;
    5. typedef unsigned int u16;
    6. typedef unsigned long u32;
    7. #define       FOSC                           24000000UL
    8. #define       HSCK_MCLK             0
    9. #define       HSCK_PLL                 1
    10. #define       HSCK_SEL                 HSCK_PLL
    11. #define       PLL_96M                     0
    12. #define       PLL_144M                  1
    13. #define       PLL_SEL                     PLL_96M
    14. #define       CKMS                          0x80
    15. #define       HSIOCK                      0x40
    16. #define       MCK2SEL_MSK        0x0c
    17. #define       MCK2SEL_SEL1        0x00
    18. #define       MCK2SEL_PLLD2     0x04
    19. #define       MCK2SEL_PLLD4     0x08
    20. #define       MCKSEL_MSK          0x03
    21. #define       MCKSEL_HIRC         0x00
    22. #define       MCKSEL_XOSC        0x01
    23. #define       MCKSEL_X32K          0x02
    24. #define       MCKSEL_IRC32K     0x03
    25. #define       ENCKM                      0x80
    26. #define       PCKI_MSK                 0x60
    27. #define       PCKI_D1                     0x00
    28. #define       PCKI_D2                     0x20
    29. #define       PCKI_D3                     0x40
    30. #define       PCKI_D4                     0x60
    31. void delay()
    32. {
    33.          int     i;
    34.          
    35.          for    (i=0; i<100; i++);
    36. }
    37. char ReadPWMA(char addr)
    38. {
    39.          char dat;
    40.          
    41.          while(HSPWMA_ADR & 0x80);                                                //等待前一个异步读写完成
    42.          HSPWMA_ADR= addr | 0x80;                                                   //设置间接访问地址,只需要设置原XFR地址的低7位
    43.                                                                                                                 //HSPWMA_ADR寄存器的最高位写1,表示读数据
    44.          while(HSPWMA_ADR & 0x80);                                                //等待当前异步读取完成
    45.          dat    = HSPWMA_DAT;                                                              //读取异步数据
    46.          
    47.          return dat;
    48. }
    49. void WritePWMA(char addr, char dat)
    50. {
    51.          while(HSPWMA_ADR & 0x80);                                                //等待前一个异步读写完成
    52.          HSPWMA_DAT= dat;                                                                 //准备需要写入的数据
    53.          HSPWMA_ADR= addr & 0x7f;                                                 //设置间接访问地址,只需要设置原XFR地址的低7位
    54.                                                                                                                 //HSPWMA_ADR寄存器的最高位写0,表示写数据
    55. }
    56. void main()
    57. {
    58.          P_SW2|= 0x80;                                                                            //使能访问XFR
    59.          XOSCCR = 0xc0; // 启动外部晶振
    60.         while (!(XOSCCR & 1));                   // 等待时钟稳定               
    61.         CLKDIV = 0x00; // 时钟不分频
    62.         CKSEL = 0x01;  // 选择外部晶振
    63.          //选择PLL输出时钟
    64. #if     (PLL_SEL == PLL_96M)
    65.          CLKSEL&= ~CKMS;                                                                  //选择PLL的96M作为PLL的输出时钟
    66. #elif (PLL_SEL == PLL_144M)
    67.          CLKSEL|= CKMS;                                                                      //选择PLL的144M作为PLL的输出时钟
    68. #else
    69.          CLKSEL&= ~CKMS;                                                                  //默认选择PLL的96M作为PLL的输出时钟
    70. #endif
    71.          
    72.          //选择PLL输入时钟分频,保证输入时钟为12M
    73.          PLLCR&= ~PCKI_MSK;
    74. #if     (FOSC == 12000000UL)
    75.          PLLCR|= PCKI_D1;                                                                   //PLL输入时钟1分频
    76. #elif (FOSC == 24000000UL)
    77.          PLLCR|= PCKI_D2;                                                                   //PLL输入时钟2分频
    78. #elif (FOSC == 36000000UL)
    79.          PLLCR|= PCKI_D3;                                                                   //PLL输入时钟3分频
    80. #elif (FOSC == 48000000UL)
    81.          PLLCR|= PCKI_D4;                                                                   //PLL输入时钟4分频
    82. #else
    83.          PLLCR|= PCKI_D1;                                                                   //默认PLL输入时钟1分频
    84. #endif
    85.          //启动PLL
    86.          PLLCR|= ENCKM;                                                                    //使能PLL倍频
    87.          
    88.          delay();                                                                                          //等待PLL锁频
    89.          //选择HSPWM/HSSPI时钟
    90. #if     (HSCK_SEL == HSCK_MCLK)
    91.          CLKSEL&= ~HSIOCK;                                                             //HSPWM/HSSPI选择主时钟为时钟源
    92. #elif (HSCK_SEL == HSCK_PLL)
    93.          CLKSEL|= HSIOCK;                                                                  //HSPWM/HSSPI选择PLL输出时钟为时钟源
    94. #else
    95.          CLKSEL&= ~HSIOCK;                                                             //默认HSPWM/HSSPI选择主时钟为时钟源
    96. #endif
    97.          HSCLKDIV= 0;                                                                            //HSPWM/HSSPI时钟源不分频
    98.          
    99.          HSPWMA_CFG= 0x03;                                                             //使能PWMA相关寄存器异步访问功能
    100.          
    101.          //通过异步方式设置PWMA的相关寄存器
    102.                                  WritePWMA((char)&PWMA_PSCRH,(48000 - 1)>>8);
    103.                                  WritePWMA((char)&PWMA_PSCRL,48000 - 1);
    104.          WritePWMA((char)&PWMA_CCER1,0x00);
    105.          WritePWMA((char)&PWMA_CCMR1,0x00);                           //CC1为输出模式
    106.          WritePWMA((char)&PWMA_CCMR1,0x60);                           //OC1REF输出PWM1(CNT<CCR时输出有效电平1)
    107.          WritePWMA((char)&PWMA_CCER1,0x05);                           //使能CC1/CC1N上的输出功能
    108.          WritePWMA((char)&PWMA_ENO,0x03);                                //使能PWM信号输出到端口
    109.          WritePWMA((char)&PWMA_BKR,0x80);                                //使能主输出
    110.          WritePWMA((char)&PWMA_CCR1H,200 >> 8);                    //设置输出PWM的占空比
    111.          WritePWMA((char)&PWMA_CCR1L,200);
    112.          WritePWMA((char)&PWMA_ARRH,2000 >> 8);                    //设置输出PWM的周期
    113.          WritePWMA((char)&PWMA_ARRL,2000);
    114.          WritePWMA((char)&PWMA_DTR,10);                                    //设置互补对称输出PWM的死区
    115.          WritePWMA((char)&PWMA_CR1,0x01);                                 //开始PWM计数
    116. //         WritePWMA((char)&PWMA_IER,0x01);             // 使能PWMA中断
    117. //       EA=1;                              
    118.                P1M0= 0;
    119.          P1M1= 0;                        
    120.          P2M0= 0;
    121.          P2M1= 0;
    122.          P3M0= 0;
    123.          P3M1= 0;
    124.          
    125. //         P2= ReadPWMA((char)&PWMA_ARRH);                               //异步方式读取寄存器
    126. //         P3= ReadPWMA((char)&PWMA_ARRL);
    127.          
    128.          while(1)
    129.       {
    130.             u8 i=ReadPWMA((char)&PWMA_SR1);   
    131.             if (i&0x01)  
    132.             {
    133.                 WritePWMA((char)&PWMA_SR1,i&~0x01);        
    134.                 P37=!P37;
    135.             }
    136.       }
    137. }
    138. //void PWMA_Isr() interrupt 26 // PWMA中断处理程序,用于产生1秒中断
    139. //{
    140. //                u8 i=ReadPWMA((char)&PWMA_SR1);
    141. //    if (i & 0x01)  
    142. //    {
    143. //       WritePWMA((char)&PWMA_SR1,i & ~0x01);         // 清除PWM中断
    144. //        P37=!P37;//P10=!P10;
    145. //    }
    146. //}
    复制代码


    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2024-2-6 15:26:10 | 显示全部楼层
    本帖最后由 xxkj2010 于 2024-2-7 08:33 编辑

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

    截图202402061526012306.jpg

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-13 12:29 , Processed in 0.056472 second(s), 37 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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