找回密码
 立即注册
查看: 1338|回复: 12

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-4 19:20:04 | 显示全部楼层 |阅读模式
本帖最后由 xxkj2010 于 2024-2-6 15:28 编辑

芯片用STC8H2K17U,外部晶振为24MHz,这样配置使能PWM为144MHz,好像不成功,这是为什么?

sfr PLLCR = 0xdc;

  1.     P_SW2 |= 0x80; // 扩展寄存器(XFR)访问使能
  2.     // 使用外部晶振时, P1.6 P1.7被占用, PWM4没有功能.
  3.     XOSCCR = 0xc0; // 启动外部晶振
  4.     while (!(XOSCCR & 1));          // 等待时钟稳定
  5.         
  6.     CLKDIV = 0x00; // 时钟不分频
  7.     CKSEL = 0x01;  // 选择外部晶振
  8.                
  9.     PLLCR = 0xa0;//将外部晶振频率2分频(PCKI=01),使能PLL倍频(ENCKM=1)
  10.     CLKSEL |=0x80;//PLL输出144MHz(CKMS=1)
  11.     CLKSEL |=0x40;//PLL输出96MHz/144MHz的PLLCLK为高速I/O时钟源(HSIOCK=1)
复制代码
截图202402041927569530.jpg

截图202402041927149546.jpg



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-4 19:49:15 | 显示全部楼层

截图202402041949001094.jpg

截图202402041948077887.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-4 20:44:21 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-2-4 20:47 编辑

不能用常规的配置方式,非得异步控制模式下进行配置吗?

点评

144M要在高速模式下使用。  详情 回复 发表于 2024-2-4 21:39
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-2-4 21:39:09 | 显示全部楼层
xxkj*** 发表于 2024-2-4 20:44
不能用常规的配置方式,非得异步控制模式下进行配置吗?

144M要在高速模式下使用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-5 09:13:07 | 显示全部楼层
梁*** 发表于 2024-2-4 21:39
144M要在高速模式下使用。

难怪,我的时钟配置方面没有错,改了原来的分频系数,仍然无法得到10秒的延时。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-5 16:41:29 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-2-6 14:41 编辑

芯片用STC8H2K17U,外部晶振用24MHz,用范例改的,加了个分频和中断,还是不行,不知道在哪个地方出错。

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-6 08:38:25 | 显示全部楼层

用范例改的,还是调不通,特来请教{:5_300:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-6 09:40:59 | 显示全部楼层

先全部不动,测试通过后再移植

截图202402060939589932.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-6 09:46:39 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-2-6 14:10:48 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-2-6 14:14 编辑
神*** 发表于 2024-2-6 09:40
先全部不动,测试通过后再移植

现在PWM1P端口P10可以输出周期1秒的脉冲,就是无法产生中断
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:04 , Processed in 0.138263 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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