这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 追风剑,全国智能车竞赛MCU,STC32F12K64,64MHz,硬件浮点,实验

共3条 1/1 1 跳转至

追风剑,全国智能车竞赛MCU,STC32F12K64,64MHz,硬件浮点,实验板程序,FOC方案征集

助工
2023-06-13 10:29:13     打赏

STC32F12K54-64MHz追风剑核心功能实验板,
硬件单精度浮点运算器,演示程序发布更新中

追风剑, 全国智能车竞赛MCU, STC32F12K64,64MHz,硬件浮点,实验板程序, FOC方案征集-1.png (105.59 KB, 下载次数: 0)

下载附件

1 小时前 上传


http://www.stcmcudata.com/STC8F-DATASHEET/STC32F12K54.pdf
===最新数据手册是 2023/5/31 发布的初版
更新记录
2023.06.12
1.  增加例程"22-硬件单精度浮点数运算";
2.  增加例程"23-DHT11温湿度数据读取-串口打印";
3.  增加例程"24-STC-ISP调试接口通过UART协议驱动虚拟设备";
4.  增加例程"25-STC-ISP调试接口通过USB CDC协议驱动虚拟设备";
5.  增加例程"26-STC-ISP调试接口通过USB HID协议驱动虚拟设备";
6.  增加例程"27-核心硬件功能初始化例程"。

2023.06.08
1.  初版发布 !

STC32F12K54-LQFP48-DIP48-DEMO-CODE-20230612.zip




关键词: 追风剑     STC32F12K64     64MHz     硬件    

助工
2023-06-13 10:30:13     打赏
2楼

征集 开源 FOC 电机控制方案@STC32F12K54-64MHz 为高校《单片机应用及原理》课程
===硬件材料费 www.STCAIMCU.com 出,  辛苦费 RMB5000 !
有强大的专门支持FOC运算硬件单精度浮点运算器,外部加上普通的运放就可以做FOC控制
32位8051世界共同进步,期待大家在此开源 STC32F12K54-64MHz-LQFP48的 FOC 方案

32位8051世界大礼,追风剑-STC32F12K54-64MHz,还是 STC的 那个 8051 回来了 !
少年强则国强,6/1 儿童节 新生代32位8051全面出击,全球 【免费+包邮】 送
硬件单精度浮点运算器/8051世界革命性的进步,64MHz 主频  ! 强大的DMA支持
===8K 高速 edata/堆栈/RTOS, 4k xdata/DMA缓冲区
288MHz PWM 时钟源,STC32F12K54
===奋起一剑斩不周,扳倒乾坤天且休!
自带硬件 USB 仿真】,【硬件 USB 高速下载】,同时支持【SWD仿真】,【串口仿真】

追风剑-STC32F12K54-64MHz-LQFP48转DIP48核心功能实验板

这个 STC32F12K54 的内部高达 [60MHz-HIRC] 的高速 HIRC,  不好做,
【5.5V ~ 2V 的压飘】,【-40度 ~ +85度的温漂】,对 60MHz的内部 HIRC是一大难题 !
暂时的解决方案就是用外部 32768 RTC 时钟来自动动态追频,动态调教内部高频时钟到 60MHz,
误差在 +/- 0.3% 
用内部高速IRC取代外部高频时钟的好处是 【对外电磁辐射小抗干扰强

后记,网友调侃:
平常吹水,自说水平高,现在【没能力开源个8051做的 FOC 方案,帮助大家共同进步 】!
只能说还是要虚心学习,共同进步


助工
2023-06-14 17:17:40     打赏
3楼

250MHz时钟源 PWM, STC32F12K54-64MHz
——高速PWM应用1:  高速PWM输出
——高速PWM应用2:捕获外部高速脉宽(查询方式)
——高速PWM应用3:捕获外部高速脉宽(中断方式)


高速PWM应用1:   高速PWM输出
高速PWM可使用内建500MHz高速HPLL作为时钟源【输出高速PWM】/【捕获外部高速脉宽】
(注:500MHz的HPLL时钟2分频输出50%占空比的PLL输出时钟可作为高速PWM的时钟源)

  1. /*************  功能说明    **************


  2. 时钟说明:由内部IRC产生24MHz的时钟分频为6M提供给HPLL当作HPLL输入时钟,PLL锁频到246MHz输出作为高速PWM的时钟源,


  3. PWM高速输出说明:PWMA的CC1通道配置为输出模式,并从P1.0/P1.1口输出频率为2.46MHz,占空比为50%的互补对称带死区的PWM波形


  4. 下载时, 选择默认IRC时钟 24MHz。


  5. ******************************************/


  6. #include "stc32g.h"


  7. #define FOSC            24000000UL


  8. #define HSCK_MCLK       0

  9. #define HSCK_PLL        1

  10. #define HSCK_SEL        HSCK_PLL


  11. #define HSIOCK          0x40


  12. #define ENHPLL          0x80

  13. #define HPLLDIV_52      0x00

  14. #define HPLLDIV_54      0x01

  15. #define HPLLDIV_56      0x02

  16. #define HPLLDIV_58      0x03

  17. #define HPLLDIV_60      0x04

  18. #define HPLLDIV_62      0x05

  19. #define HPLLDIV_64      0x06

  20. #define HPLLDIV_66      0x07

  21. #define HPLLDIV_68      0x08

  22. #define HPLLDIV_70      0x09

  23. #define HPLLDIV_72      0x0A

  24. #define HPLLDIV_74      0x0B

  25. #define HPLLDIV_76      0x0C

  26. #define HPLLDIV_78      0x0D

  27. #define HPLLDIV_80      0x0E

  28. #define HPLLDIV_82      0x0F


  29. #define ENCKM           0x80

  30. #define PCKI_MSK        0x60

  31. #define PCKI_D1         0x00

  32. #define PCKI_D2         0x20

  33. #define PCKI_D4         0x40

  34. #define PCKI_D8         0x60


  35. void delay()

  36. {

  37.     int i;


  38.     for (i=0; i<100; i++);

  39. }


  40. char ReadPWMA(char addr)

  41. {

  42.     char dat;

  43.    

  44.     while (HSPWMA_ADR & 0x80);              //等待前一个异步读写完成

  45.     HSPWMA_ADR = addr | 0x80;               //设置间接访问地址,只需要设置原XFR地址的低7位

  46.                                             //HSPWMA_ADDR寄存器的最高位写1,表示读数据

  47.     while (HSPWMA_ADR & 0x80);              //等待当前异步读取完成

  48.     dat = HSPWMA_DAT;                       //读取异步数据

  49.    

  50.     return dat;

  51. }


  52. void WritePWMA(char addr, char dat)

  53. {

  54.     while (HSPWMA_ADR & 0x80);              //等待前一个异步读写完成

  55.     HSPWMA_DAT = dat;                       //准备需要写入的数据

  56.     HSPWMA_ADR = addr & 0x7f;               //设置间接访问地址,只需要设置原XFR地址的低7位

  57.                                             //HSPWMA_ADDR寄存器的最高位写0,表示写数据

  58. }


  59. int main()

  60. {

  61.     EAXFR = 1;

  62.    

  63.     P0M0 = 0; P0M1 = 0;

  64.     P1M0 = 0; P1M1 = 0;

  65.     P2M0 = 0; P2M1 = 0;

  66.     P3M0 = 0; P3M1 = 0;

  67.     P4M0 = 0; P4M1 = 0;

  68.     P5M0 = 0; P5M1 = 0;


  69.     //选择HPLL输入时钟分频,保证输入时钟为6M

  70.     USBCLK &= ~PCKI_MSK;

  71. #if (FOSC == 6000000UL)

  72.     USBCLK |= PCKI_D1;                      //PLL输入时钟1分频

  73. #elif (FOSC == 12000000UL)

  74.     USBCLK |= PCKI_D2;                      //PLL输入时钟2分频

  75. #elif (FOSC == 24000000UL)

  76.     USBCLK |= PCKI_D4;                      //PLL输入时钟4分频

  77. #elif (FOSC == 48000000UL)

  78.     USBCLK |= PCKI_D8;                      //PLL输入时钟8分频

  79. #else

  80.     USBCLK |= PCKI_D4;                      //默认PLL输入时钟4分频

  81. #endif


  82.     //设置HPLL的除频系数

  83. //    HPLLCR = HPLLDIV_52;                  //F_HPLL=6M*52/2=156M

  84. //    HPLLCR = HPLLDIV_54;                  //F_HPLL=6M*54/2=162M

  85. //    HPLLCR = HPLLDIV_56;                  //F_HPLL=6M*56/2=168M

  86. //    HPLLCR = HPLLDIV_58;                  //F_HPLL=6M*58/2=174M

  87. //    HPLLCR = HPLLDIV_60;                  //F_HPLL=6M*60/2=180M

  88. //    HPLLCR = HPLLDIV_62;                  //F_HPLL=6M*62/2=186M

  89. //    HPLLCR = HPLLDIV_64;                  //F_HPLL=6M*64/2=192M

  90. //    HPLLCR = HPLLDIV_66;                  //F_HPLL=6M*66/2=198M

  91. //    HPLLCR = HPLLDIV_68;                  //F_HPLL=6M*68/2=204M

  92. //    HPLLCR = HPLLDIV_70;                  //F_HPLL=6M*70/2=210M

  93. //    HPLLCR = HPLLDIV_72;                  //F_HPLL=6M*72/2=216M

  94. //    HPLLCR = HPLLDIV_74;                  //F_HPLL=6M*74/2=222M

  95. //    HPLLCR = HPLLDIV_76;                  //F_HPLL=6M*76/2=228M

  96. //    HPLLCR = HPLLDIV_78;                  //F_HPLL=6M*78/2=234M

  97. //    HPLLCR = HPLLDIV_80;                  //F_HPLL=6M*80/2=240M

  98.     HPLLCR = HPLLDIV_82;                    //F_HPLL=6M*82/2=246M


  99.     //启动HPLL

  100.     HPLLCR |= ENHPLL;                       //使能HPLL


  101.     delay();                                //等待HPLL时钟稳定


  102.     //选择HSPWM/HSSPI时钟

  103. #if (HSCK_SEL == HSCK_MCLK)

  104.     CLKSEL &= ~HSIOCK;                      //HSPWM/HSSPI选择主时钟为时钟源

  105. #elif (HSCK_SEL == HSCK_PLL)

  106.     CLKSEL |= HSIOCK;                       //HSPWM/HSSPI选择PLL输出时钟为时钟源

  107. #else

  108.     CLKSEL &= ~HSIOCK;                      //默认HSPWM/HSSPI选择主时钟为时钟源

  109. #endif


  110.     HSCLKDIV = 0;                           //HSPWM/HSSPI时钟源不分频

  111.    

  112.     HSPWMA_CFG = 0x03;                      //使能PWMA相关寄存器异步访问功能

  113.    

  114.     PWMA_PS = 0x00;                         //PWMA_CC1/CC1N高速PWM输出到CC1/CC1N口

  115.                                             //注意:PWMA_PS属于I/O控制寄存器,不能使用异步方式进行读写


  116.     //通过异步方式设置PWMA的相关寄存器

  117.     WritePWMA((char)&PWMA_CCER1, 0x00);

  118.     WritePWMA((char)&PWMA_CCMR1, 0x00);     //CC1为输出模式

  119.     WritePWMA((char)&PWMA_CCMR1, 0x60);     //OC1REF输出PWM1(CNT<CCR时输出有效电平1)

  120.     WritePWMA((char)&PWMA_CCER1, 0x05);     //使能CC1/CC1N上的输出功能

  121.     WritePWMA((char)&PWMA_ENO, 0x03);       //使能PWM信号输出到端口P1.0/P1.1

  122.     WritePWMA((char)&PWMA_BKR, 0x80);       //使能主输出

  123.     WritePWMA((char)&PWMA_CCR1H, 0);        //设置PWM占空比为50个PWM时钟

  124.     WritePWMA((char)&PWMA_CCR1L, 50);

  125.     WritePWMA((char)&PWMA_ARRH, 0);         //设置输出PWM的周期为100个PWM时钟

  126.     WritePWMA((char)&PWMA_ARRL, 99);

  127.     WritePWMA((char)&PWMA_DTR, 10);         //设置互补对称输出PWM的死区

  128.     WritePWMA((char)&PWMA_CR1, 0x01);       //开始PWM计数


  129. //  P2 = ReadPWMA((char)&PWMA_ARRH);        //异步方式读取寄存器

  130. //  P0 = ReadPWMA((char)&PWMA_ARRL);


  131.     while (1);

  132. }

PWM使用HPLL时钟(输出高速PWM).zip


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]