找回密码
 立即注册
查看: 323|回复: 0

STC32F12K54核心板使用感受

[复制链接]

该用户从未签到

2

主题

0

回帖

30

积分

新手上路

积分
30
发表于 2023-9-9 15:51:02 | 显示全部楼层 |阅读模式
本帖最后由 汉堡王 于 2023-9-10 20:19 编辑

7月份收到的追风剑STC32F12K54核心板,由于前段时间有点忙没来得及进行测试,正好这两天有时间就拿来测试一下

STC32F12K54开发环境使用的是KeilC251,下寨地址在Keil的官网,不过下载的比较慢,可以到下面的地址去下载(https://blog.csdn.net/qq_34901073/article/details/82887681
C251可以与KeilC51安装到同一个文件夹下面:

(默认是安装在C盘,建议改到D盘)

截图202309100900219338.jpg

安装完成之后还需要到STC-isp中添加Keil的头文件和型号信息,好的一点是软件上可以自动设置,只要自己选择路径就好了
(不得不说STC—ISP的功能是越来越强大了,希望能越做越好!)
截图202309100902453284.jpg

完成这些之后基本的开发环境就算是配置完成了。还是挺简单的。
截图202309100905298675.jpg

这是我收到的STC32F12K54核心板(追风剑),为了方便测试,给它焊接了排针,不过焊接完最右下角的排针之后我发现复位键好像不能用了,
不知道是不是焊接温度过高把复位按钮烫坏了,那个地方正好是GND,铜皮比较的厚,我烙铁功率不太行,接触了好一会才化锡,
不过整体来说问题不大!
后面又外接了一跟线去试,发现还是不太行,后面再研究研究!
原本的里面是有一个LED流水灯的demo,正好对应的P2端口的8个引脚。
截图202309100915488936.jpg

使用官方的例程要将demo文件夹放在工程文件夹的上级目录,参照程序中的定义:
截图202309100917105361.jpg

这点还是挺方便的,不用将这些重复的文件每份工程都复制一遍了。
截图202309100918481128.jpg

此外,还可根据需要灵活的选择是驱动硬件的LED还是驱动调试接口LED-DIP64虚拟设备,这点挺不错的,方便在没有硬件条件的情况下进行实验。
  1. void main(void)
  2. {
  3.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  4.     RSTFLAG |= 0x04;   //设置硬件复位后需要检测P3.2的状态选择运行区域,否则硬件复位后进入USB下载模式
  5.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  6.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  7.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  8.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  9.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  10.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  11.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  12.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  13.     usb_init(); //USB初始化
  14.     ICacheOn(); //开启ICache
  15.     Timer0_Init();
  16.     EUSB = 1;   //IE2相关的中断位操作使能后,需要重新设置EUSB
  17.     EA = 1;     //打开总中断
  18.     while(1)
  19.     {
  20.         #if(VirtualDevice)
  21.         SoftwareMarquee();
  22.         #else
  23.         HardwareMarquee();
  24.         #endif
  25.     }
  26. }
复制代码
流灯的主函数里面初始化了相关的端口,然后根据前面VirtualDevice选择是硬件流水灯还是软件流水灯
程序下载:
开发文档提供了两种下载的思路,一种硬件复位,复位后判断P3^2引脚的状态,另外一种是软件复位,需要用到定时器,每隔一段时间判断一下P3^2引脚的转态,按下超过1秒就进入进入USB下载模式,
在进入USB下载模式后,将用数据线连接核心板和电脑,
进入USB下载模式前显示: 截图202309101056024312.jpg ,此时可以使用虚拟USB串口和板子进行通信
进入USB下载模式后显示: 截图202309101057254001.jpg ,此时进入程序下载

然后打开程序文件,配置好程序下载设置,然后点击 截图202309101058587853.jpg 进行程序下载。
下载完成之后会显示当前芯片的运行频率等等
截图202309101100027540.jpg

整个的操作还是方便的。


定时器:
截图202309101450344827.jpg

STC32F12K54内置了5个24位的定时器,其中8位预分频和16位计数

定时器配置:以定时器0为例,使用定时器模式0进行定时
  1. void Timer0_init(void)
  2. {
  3.         TR0 = 0;    //停止计数
  4.     #if (Timer0_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
  5.         #error "Timer0设置的中断过快!"
  6.     #elif ((Timer0_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
  7.         ET0 = 1;    //允许中断
  8.     //  PT0 = 1;    //高优先级中断
  9.         TMOD &= ~0x03;
  10.         TMOD |= 0;  //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
  11.     //  T0_CT = 1;  //计数
  12.         T0_CT = 0;  //定时
  13.     //  T0CLKO = 1; //输出时钟
  14.         T0CLKO = 0; //不输出时钟
  15.         #if (Timer0_Reload < 65536UL)
  16.             T0x12 = 1;  //1T mode
  17.             TH0 = (u8)((65536UL - Timer0_Reload) / 256);
  18.             TL0 = (u8)((65536UL - Timer0_Reload) % 256);
  19.         #else
  20.             T0x12 = 0;  //12T mode
  21.             TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
  22.             TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
  23.         #endif
  24.         TR0 = 1;    //开始运行
  25.     #else
  26.         #error "Timer0设置的中断过慢!"
  27.     #endif
  28. }
复制代码
截图202309101524594326.jpg 定时器输出频率计算公示,用输出逻辑分析仪大概的看了一下例程里面的波形,还是十分准确的

截图202309101147085120.jpg

软件不好用波形不是很好看,凑合着看一下吧
在开例程的时候我发现有2段代码一时间没看懂是干什么的,就是这个ICACHE,于是就查了一下手册,这里还有必要讲一下ICACHE功能:
截图202309101707025481.jpg
可以看出,这个ICACHE的作用就是匹配单片机的核心频率和ROM的速率的,不过使用的时候要注意关闭ICACHE之后才能操作EEPROM
下面是开启ICACHE和关闭ICACHE的代码:

  1. void ICacheOn(void)     //打开ICACHE功能
  2. {
  3.     bit fEA;
  4.    
  5.     if(WTST > 0)
  6.     {
  7.         fEA = EA;
  8.         EA = 0;         //关闭中断,防止写触发命令序列中途产生中断
  9.         _nop_();
  10.         _nop_();
  11.         TA = 0xaa;      //写入触发命令序列1
  12.                         //此处不能有其他任何指令
  13.         TA = 0x55;      //写入触发命令序列2
  14.                         //此处不能有其他任何指令
  15.         ICHECR = 0x01;  //写保护暂时关闭,可以修改ICHECR中的EN位
  16.                         //EN为再次进入写保护状态
  17.         _nop_();
  18.         _nop_();
  19.         EA = fEA;
  20.     }
  21. }
  22. void ICacheOff(void)//关闭ICACHE功能
  23. {
  24.     bit fEA;
  25.     fEA = EA;
  26.     EA = 0;         //关闭中断,防止写触发命令序列中途产生中断
  27.     _nop_();
  28.     _nop_();
  29.     TA = 0xaa;      //写入触发命令序列1
  30.                     //此处不能有其他任何指令
  31.     TA = 0x55;      //写入触发命令序列2
  32.                     //此处不能有其他任何指令
  33.     ICHECR = 0x00;  //写保护暂时关闭,可以修改ICHECR中的EN位
  34.                     //EN位再次进入写保护状态
  35.     _nop_();
  36.     _nop_();
  37.     EA = fEA;
  38. }
复制代码
USB虚拟串口调试:

这个可以说是非常的方便了,以往的STM32下载和调试需要两根USB线,占用两个端口,而现在STC32F12K54内置了USB仿真和虚拟串口,功能十分的强悍!!!
单精度浮点运算:
  1. void main(void)
  2. {
  3.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  4.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  5.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  6.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  7.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  8.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  9.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  10.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  11.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  12.     usb_init();  //USB接口配置
  13.     Timer0_Init();
  14.     ICacheOn(); //开启ICache
  15.     EA = 1;
  16.     while(1)
  17.     {
  18.         delay_ms(1);
  19.         KeyScan();     //每毫秒检查一次按键状态
  20.         
  21.         if(DeviceState != DEVSTATE_CONFIGURED)  //等待USB完成配置
  22.             continue;
  23.         if(Key_Short_Function)      //P3.2按键短按
  24.         {
  25.             Key_Short_Function = 0; //短按一次P3.2按键,计算一次浮点数运算
  26.             
  27.             P01 = 0;
  28.             cfl3 = cfl1*cfl2;
  29.             cfl4 = cfl1/cfl2-cfl3;
  30.             cfl5 = cfl1*cfl2+cfl4;
  31.             cfl6 = cfl1/cfl2*sin(cfl5);
  32.             cfl7 = cfl1/cfl2*cos(cfl6);
  33.             cfl8 = cfl1/cfl2*tan(cfl7);
  34.             cfl9 = cfl1/cfl2*sqrt(cfl8);
  35.             cfl10 = cfl1/cfl2*atan(cfl9);
  36.             P01 = 1;
  37.             
  38.             printf("cfl3=%f\r\n",cfl3); //CDC串口打印计算结果
  39.             printf("cfl4=%f\r\n",cfl4);
  40.             printf("cfl5=%f\r\n",cfl5);
  41.             printf("cfl6=%f\r\n",cfl6);
  42.             printf("cfl7=%f\r\n",cfl7);
  43.             printf("cfl8=%f\r\n",cfl8);
  44.             printf("cfl9=%f\r\n",cfl9);
  45.             printf("cfl10=%f\r\n",cfl10);
  46.         }
  47.         if (bUsbOutReady)
  48.         {
  49.             //USB_SendData(UsbOutBuffer,OutNumber);    //发送数据缓冲区,长度
  50.             usb_OUT_done();    //接收应答(固定格式)
  51.         }
  52.     }
  53. }
复制代码
通过USB虚拟串口显示。
截图202309102018201344.jpg

目前就测试了这些,后面还会继续更新,希望大家相互交流!
截图202309100914286243.jpg
回复 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 04:15 , Processed in 0.060065 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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