找回密码
 立即注册
查看: 652|回复: 19

【首测】DeepSeek V4 Flash更新了,STC-【AI助手】迅速跟进,极大提升代码能力

[复制链接]
已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
发表于 2026-7-31 20:07:11 | 显示全部楼层 |阅读模式
DeepSeek官方更新日志描述:

时间: 2026-07-31DeepSeek-V4-Flash 更新
DeepSeek-V4-Flash 正式版 API 上线公测,API 调用方式不变,模型名设置为 deepseek-v4-flash 即可使用最新版本。
Agent 能力大幅增强,基准测试远超 V4-Pro-Preview


现在来测试一下STC-【AI助手】的写代码能力是否有明显提升
测试的问题是:

“
帮忙用STC32G12K128写一个程序。功能是检测P32外部按键(按键按下时会被接地)短按,长按,双击。然后在串口1(P30,P31)使用115200波特率发送识别到的按键信息。同时在P2口上完成一个流水灯,短按切换流水方向,长按切换流水速度(三档循环切换),双击切换所有的led同时闪烁,再次双击切换回led的流水状态。按下按键的时候不能影响led动作,可以参考例程
”

这个主要考察了模型本身对于状态机和多种冲突的处理能力(按键按下和流水灯需要互相不冲突,主要考验逻辑能力)
经过了较长的思考时间后,STC-AI助手给出了最终程序
截图202607311959548662.jpg


复制对应的程序到Keil中
截图202607312000293387.jpg
一次编译直接通过
截图202607312001097683.jpg
按照注释设置24Mhz主频后,串口成功在上电接收到了启动信息


进行点击测试,成功出现了三种识别,且按下按键的过程中并未被堵塞
截图202607312003268814.jpg


以下是实际测试视频:



这里分析一下其输出内容:
截图202607312005443828.jpg
会进行自我反思,然后逐步更新模块内容


截图202607312006352502.jpg
开头部分会进行分析需求来梳理


以及输出的程序部分:
  1. /*****************************************************************************
  2. * 文件名: main.c
  3. * 芯片  : STC32G12K128
  4. * 系统时钟: 24MHz 内部IRC
  5. * 编译环境: Keil C251 (选择 STC32G 型号)
  6. *
  7. * 功能说明:
  8. *   1. 检测 P32 外部按键(按键按下接地)的 短按 / 长按 / 双击 操作
  9. *   2. 串口1(P3.0/P3.1) 以 115200,8,N,1 发送按键识别信息
  10. *   3. P2口完成流水灯:
  11. *        - 短按: 切换流水方向(正/反)
  12. *        - 长按: 切换流水速度(慢/中/快 三档循环)
  13. *        - 双击: 所有LED同时闪烁, 再次双击切回流水状态
  14. *   4. 按键检测基于定时器0的1ms中断, 与LED动作相互独立
  15. *      (按下/识别按键不影响LED流水动作)
  16. *
  17. * 硬件连接:
  18. *   P2.0~P2.7 -> 8个LED(建议高电平点亮,LED负极接GND)
  19. *   P3.2(P32) -> 按键, 另一端接GND (按下接地)
  20. *   P3.0/P3.1 -> 串口1 RXD/TXD(接USB转串口)
  21. *
  22. * 使用步骤:
  23. *   1. 用 AiCube-ISP 下载时选择"内部IRC时钟", 频率选 24MHz
  24. *   2. 编译后用 ISP 工具下载到 STC32G12K128
  25. *   3. 打开串口助手, 波特率 115200, 即可看到按键信息
  26. *****************************************************************************/
  27. #include "stc32g.h"        // STC32G 头文件(见下载软件)
  28. #include "intrins.h"
  29. #define FOSC  24000000UL   // 系统时钟 24MHz
  30. // 定时器2做串口1波特率发生器: 重载值计算(加2为四舍五入)
  31. #define BRT   (65536 - (FOSC/115200 + 2)/4)
  32. // ------------------- LED 模式与事件定义 -------------------
  33. #define LED_MODE_FLOW    0    // 流水灯模式
  34. #define LED_MODE_BLINK   1    // 全部闪烁模式
  35. #define KEY_NONE      0       // 无按键事件
  36. #define KEY_SINGLE    1       // 短按
  37. #define KEY_LONG      2       // 长按
  38. #define KEY_DOUBLE    3       // 双击
  39. // 按键状态机状态
  40. #define KEY_ST_IDLE      0   // 空闲
  41. #define KEY_ST_PRESS     1   // 第一次按下(判断长按/短按)
  42. #define KEY_ST_RELEASE   2   // 第一次释放(等待是否双击)
  43. #define KEY_ST_SECOND    3   // 第二次按下(双击确认中)
  44. #define KEY_ST_LONGED    4   // 长按已触发(等待释放)
  45. // 时间阈值(单位: 1ms)
  46. #define LONG_PRESS_MS     900    // 长按判定阈值
  47. #define DOUBLE_WINDOW_MS  300    // 双击间隔窗口
  48. // ------------------- 全局变量 -------------------
  49. unsigned char led_mode = LED_MODE_FLOW;  // LED工作模式
  50. unsigned char led_dir  = 0;              // 流水方向 0正向 1反向
  51. unsigned char led_speed = 0;             // 流水速度 0慢 1中 2快
  52. unsigned char led_pos  = 0;              // 当前点亮LED位置
  53. unsigned char key_event = KEY_NONE;      // 按键事件标志
  54. volatile unsigned int sys_tick = 0;      // 1ms时基(定时器0产生)
  55. // ------------------- 函数声明 -------------------
  56. void UartInit(void);
  57. void Timer0_Init(void);
  58. void UartSend(char dat);
  59. void UartSendStr(char *p);
  60. void UpdateLed(void);
  61. void Key_Task(void);                     // 按键状态机, 每1ms调用
  62. // =================== 串口1相关函数 ===================
  63. // 串口1初始化: 使用定时器2做波特率发生器, 115200
  64. void UartInit(void)
  65. {
  66.     SCON = 0x50;        // 串口1模式1: 8位数据, 可变波特率(由T2产生)
  67.     T2L  = BRT;         // 定时器2波特率重载低字节
  68.     T2H  = BRT >> 8;    // 定时器2波特率重载高字节
  69.     S1BRT = 1;          // 串口1使用定时器2做波特率发生器
  70.     T2x12 = 1;          // 定时器2工作在1T模式
  71.     T2R   = 1;          // 启动定时器2
  72. }
  73. // 发送一个字节(轮询方式)
  74. void UartSend(char dat)
  75. {
  76.     SBUF = dat;
  77.     while(!TI);         // 等待发送完成
  78.     TI = 0;
  79. }
  80. // 发送字符串
  81. void UartSendStr(char *p)
  82. {
  83.     while(*p)
  84.     {
  85.         UartSend(*p++);
  86.     }
  87. }
  88. // =================== 定时器0 1ms时基 ===================
  89. // 定时器0初始化: 12T模式, 16位自动重载, 1ms中断
  90. void Timer0_Init(void)
  91. {
  92.     TMOD &= 0xF0;       // 清零T0相关位, 设为16位自动重载模式(模式0)
  93.     // 重载值 = 65536 - FOSC/12/1000 = 65536 - 24000000/12000 = 63536 = 0xF830
  94.     TL0 = 0x30;
  95.     TH0 = 0xF8;
  96.     TR0 = 1;            // 启动定时器0
  97.     ET0 = 1;            // 使能定时器0中断
  98. }
  99. // 定时器0中断服务函数: 1ms一次
  100. void TM0_Isr() interrupt 1
  101. {
  102.     sys_tick++;         // 1ms时基计数
  103.     Key_Task();         // 执行按键状态机扫描
  104. }
  105. // =================== 按键识别状态机 ===================
  106. // 每1ms调用一次, 识别短按/长按/双击, 结果存入 key_event
  107. void Key_Task(void)
  108. {
  109.     static unsigned char key_state = KEY_ST_IDLE;
  110.     static unsigned int  press_cnt  = 0;   // 按下持续计数
  111.     static unsigned int  wait_cnt   = 0;   // 双击窗口等待计数
  112.     unsigned char pin_level;
  113.    
  114.     pin_level = P32;    // 读取按键电平, 按下为0(接地)
  115.    
  116.     switch(key_state)
  117.     {
  118.         case KEY_ST_IDLE:                // 空闲, 等待按下
  119.             if(pin_level == 0)
  120.             {
  121.                 press_cnt = 0;
  122.                 key_state = KEY_ST_PRESS;
  123.             }
  124.             break;
  125.             
  126.         case KEY_ST_PRESS:               // 第一次按下中
  127.             if(pin_level == 0)
  128.             {
  129.                 press_cnt++;
  130.                 if(press_cnt >= LONG_PRESS_MS)   // 达到长按阈值
  131.                 {
  132.                     key_event = KEY_LONG;        // 判定为长按
  133.                     key_state = KEY_ST_LONGED;   // 进入长按已触发状态
  134.                 }
  135.             }
  136.             else                         // 释放
  137.             {
  138.                 wait_cnt = 0;
  139.                 key_state = KEY_ST_RELEASE;      // 进入等待双击窗口
  140.             }
  141.             break;
  142.             
  143.         case KEY_ST_RELEASE:             // 等待双击窗口内是否再次按下
  144.             if(pin_level == 0)           // 窗口内再次按下
  145.             {
  146.                 key_state = KEY_ST_SECOND;       // 进入第二次按下
  147.             }
  148.             else
  149.             {
  150.                 wait_cnt++;
  151.                 if(wait_cnt >= DOUBLE_WINDOW_MS) // 窗口超时
  152.                 {
  153.                     key_event = KEY_SINGLE;      // 判定为短按
  154.                     key_state = KEY_ST_IDLE;     // 回到空闲
  155.                 }
  156.             }
  157.             break;
  158.             
  159.         case KEY_ST_SECOND:              // 第二次按下(等待释放确认双击)
  160.             if(pin_level == 1)           // 第二次释放
  161.             {
  162.                 key_event = KEY_DOUBLE;  // 判定为双击
  163.                 key_state = KEY_ST_IDLE;
  164.             }
  165.             break;
  166.             
  167.         case KEY_ST_LONGED:              // 长按已触发, 等待释放
  168.             if(pin_level == 1)
  169.             {
  170.                 key_state = KEY_ST_IDLE;
  171.             }
  172.             break;
  173.     }
  174. }
  175. // =================== LED 流水灯控制 ===================
  176. // 基于 sys_tick 时基更新LED, 与按键检测相互独立
  177. void UpdateLed(void)
  178. {
  179.     static unsigned int last_tick = 0;
  180.     unsigned int cur = sys_tick;
  181.     unsigned int diff = cur - last_tick;
  182.     unsigned int interval;
  183.    
  184.     if(led_mode == LED_MODE_FLOW)
  185.     {
  186.         // 根据速度档位选择更新间隔
  187.         switch(led_speed)
  188.         {
  189.             case 0: interval = 500; break;   // 慢: 500ms
  190.             case 1: interval = 200; break;   // 中: 200ms
  191.             default: interval = 80;  break;  // 快: 80ms
  192.         }
  193.         
  194.         if(diff >= interval)
  195.         {
  196.             last_tick = cur;
  197.             if(led_dir == 0)                 // 正向流水
  198.                 led_pos = (led_pos + 1) & 0x07;
  199.             else                             // 反向流水
  200.                 led_pos = (led_pos + 7) & 0x07;
  201.             
  202.             P2 = (unsigned char)(1 << led_pos);   // 单灯点亮
  203.         }
  204.     }
  205.     else   // LED_MODE_BLINK: 全部LED同时闪烁
  206.     {
  207.         if(diff >= 200)                      // 200ms翻转一次
  208.         {
  209.             last_tick = cur;
  210.             P2 = ~P2;                        // 取反闪烁
  211.         }
  212.     }
  213. }
  214. // =================== 主函数 ===================
  215. void main(void)
  216. {
  217.     EAXFR = 1;          // 使能访问XFR(需访问扩展寄存器)
  218.     CKCON = 0x00;       // 设置外部数据总线速度为最快
  219.     WTST  = 0x00;       // 设置程序代码等待参数, 执行速度最快
  220.    
  221.     // P2口配置为推挽输出(驱动LED)
  222.     P2M0 = 0xFF;
  223.     P2M1 = 0x00;
  224.    
  225.     // P3口配置为准双向口(弱上拉)
  226.     //   P3.0/P3.1 -> 串口1
  227.     //   P3.2     -> 按键输入(准双向内部上拉,按键接地时为0)
  228.     P3M0 = 0x00;
  229.     P3M1 = 0x00;
  230.    
  231.     P32 = 1;            // P32作为输入, 准双向口读外部状态前需锁存为1
  232.    
  233.     UartInit();         // 串口1初始化(115200)
  234.     Timer0_Init();      // 定时器0初始化(1ms中断)
  235.    
  236.     EA = 1;             // 打开总中断
  237.    
  238.     UartSendStr("STC32G12K128 Key Test Start!\r\n");
  239.    
  240.     while(1)
  241.     {
  242.         // ---------- 处理按键事件(中断中置位,主循环消费) ----------
  243.         if(key_event != KEY_NONE)
  244.         {
  245.             switch(key_event)
  246.             {
  247.                 case KEY_SINGLE:           // 短按: 切换流水方向
  248.                     led_dir = !led_dir;
  249.                     UartSendStr("Key: Single  Press\r\n");
  250.                     break;
  251.                     
  252.                 case KEY_LONG:             // 长按: 三档速度循环
  253.                     led_speed++;
  254.                     if(led_speed > 2)
  255.                         led_speed = 0;
  256.                     UartSendStr("Key: Long    Press\r\n");
  257.                     break;
  258.                     
  259.                 case KEY_DOUBLE:           // 双击: 切换LED模式
  260.                     if(led_mode == LED_MODE_FLOW)
  261.                     {
  262.                         led_mode = LED_MODE_BLINK;
  263.                         P2 = 0xFF;         // 进入闪烁模式先全亮
  264.                     }
  265.                     else
  266.                     {
  267.                         led_mode = LED_MODE_FLOW;
  268.                         P2 = 1;            // 回到流水, 从第一个LED开始
  269.                     }
  270.                     UartSendStr("Key: Double  Press\r\n");
  271.                     break;
  272.             }
  273.             key_event = KEY_NONE;          // 清除事件
  274.         }
  275.         
  276.         // ---------- 更新LED(按键检测不影响LED) ----------
  277.         UpdateLed();
  278.     }
  279. }
复制代码


还有可以测试的程序:
test stc32g led.zip (154.67 KB, 下载次数: 50)


回复

使用道具 举报 送花

已绑定手机

32

主题

446

回帖

2869

积分

金牌会员

积分
2869
发表于 2026-7-31 20:16:35 | 显示全部楼层
跟进挺快。
学习MCU
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-7-31 23:35:55 | 显示全部楼层
看起来更强了
提供样板原理图
可以用AI写程序验证
偶尔看看玩玩
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-7-31 23:56:43 | 显示全部楼层
看看编码能力:
使用STC8H4K64TL-40I-LQFP32 单片机,驱动两个数码管模块,每个模块有4个带小数点的共阴极数码管,初始状态仅亮小数点,通过TK0到TK7共8个按键,按下熄灭小数点并显示对应的TK后的值,再次按下切换回来,通过串口发送操作信息出去,可以通过串口助手发送控制按键和数码管是否启用,其余两个引脚接蜂鸣器和LED状态灯,模块化编程,使用支持滑动的框框输出程序

点评

虽然代码能力增强,但是还是要给指定一下硬件连接的,否则AI只能随便拟定一个来生成  详情 回复 发表于 2026-7-31 23:57
偶尔看看玩玩
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
 楼主| 发表于 2026-7-31 23:57:40 | 显示全部楼层
狂热*** 发表于 2026-7-31 23:56
看看编码能力:
使用STC8H4K64TL-40I-LQFP32 单片机,驱动两个数码管模块,每个模块有4个带小数点的共阴极 ...

虽然代码能力增强,但是还是要给指定一下硬件连接的,否则AI只能随便拟定一个来生成
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-8-1 00:04:01 | 显示全部楼层
王*** 发表于 2026-7-31 23:57
虽然代码能力增强,但是还是要给指定一下硬件连接的,否则AI只能随便拟定一个来生成 ...

后续贴个原理图
偶尔看看玩玩
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-8-1 10:20:08 | 显示全部楼层
王*** 发表于 2026-7-31 23:57
虽然代码能力增强,但是还是要给指定一下硬件连接的,否则AI只能随便拟定一个来生成 ...

服务提示超时
截图202608011019401155.jpg

使用STC8H4K64TL-40I-LQFP32 单片机,驱动两个数码管模块,共用SEG管脚,每个模块有4个带小数点的共阴极数码管,初始状态仅亮小数点,通过TK0到TK7共8个按键,按下熄灭小数点并显示对应的TK后的值,再次按下切换回来,通过串口发送操作信息出去,可以通过串口助手发送控制按键和数码管是否启用(单独开关和总开关),其余两个引脚接蜂鸣器(按键按下响起)和LED状态灯(启用按键亮),模块化编程,使用支持滑动的框框输出程序


SCH_Schematic1_1-P1_2026-08-01.png


点评

[attachimg]145502[/attachimg][attachimg]145501[/attachimg][attachimg]145500[/attachimg] 实测可以输出。只需要让它每次输出一个文件。然后分多轮对话生成即可。一次性生成太长,使用太长时间会被掐掉  详情 回复 发表于 2026-8-1 11:55
超过 5 分钟的回答会被服务器端掐掉 你可以拆分成多个小部分让其生成  详情 回复 发表于 2026-8-1 11:46
偶尔看看玩玩
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
 楼主| 发表于 2026-8-1 11:46:05 | 显示全部楼层

超过 5 分钟的回答会被服务器端掐掉
你可以拆分成多个小部分让其生成
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
 楼主| 发表于 2026-8-1 11:55:25 | 显示全部楼层

1000036008.jpg 1000036007.jpg 1000036006.jpg

实测可以输出。只需要让它每次输出一个文件。然后分多轮对话生成即可。一次性生成太长,使用太长时间会被掐掉
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-8-1 11:55:35 | 显示全部楼层
复杂的得多次提问
STC8H4K64TL_40I_LQFP32
提问次数或者上下文长度有限制

截图202608011153491066.jpg


点评

一般的需求应该还没有复杂到十轮对话都生成不出来吧? 限制十轮对话是防止 API 处理的上下文过多 如果希望生成非常复杂的程序,可以通过 MCP 接入 Agent 工具来使用  详情 回复 发表于 2026-8-1 11:59
偶尔看看玩玩
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-8 02:00 , Processed in 0.077752 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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