本帖最后由 起个名字好难啊 于 2025-2-6 16:49 编辑
简介
DeepSeek,一家以代码编写能力为核心竞争力的AI科技公司,致力于通过高性能AI模型赋能企业智能化转型。公司拥有一支由顶尖程序员和AI专家组成的团队,他们以卓越的代码编写能力,不断优化和创新AI技术,为全球用户提供高效、智能的解决方案。DeepSeek的AI模型以高效的代码实现和强大的性能表现著称,能够在金融、医疗、教育等多个行业中发挥重要作用。其最新发布的大模型R1,以极低的训练成本达到了行业领先水平,彰显了DeepSeek在代码编写和AI技术创新方面的强大实力。凭借卓越的代码能力和创新的商业模式,DeepSeek正逐步成为全球AI领域的佼佼者,为全球科技产业的发展贡献力量。
之前还痴心妄想让他帮我搭建二次开发环境,但是因为权限问题,DeepSeek无法操作终端。那就试试DeepSeek给Ai-WB2模组编程,能不能直接编译运行呢?
在写这帖子之前,做了好多测试,大部分时间浪费在了服务器繁忙这个问题上!
在开始让DeepSeek 生成之前,注意要提前搭建好Ai-WB2的二次开发环境和测试工程,生成的代码才能直接复制。
提问技巧
AI 工具毕竟还不是人,所以在提问的时候,尽量提供要求和一些信息。比如使用那些库,需要达到什么效果等。
如果回复较慢,可以试试siliconflow:链接:https://cloud.siliconflow.cn/models
GPIO 点灯
提问内容
我需要一个bl602芯片的点灯程序,条件及要求如下:
1、LED灯接入了GPIO3
2、提供能一个闪烁程序,闪烁周期为1s
DeepSeek 响应
![image.png image.png](data/attachment/forum/202502/06/151947ee51ezc6gzombe5a.png)
已经喜闻乐见了,接下来试试硅基流动的:
![image.png image.png](data/attachment/forum/202502/06/153123lmbcyu99abw12a3o.png)
尝试了两次之后,至少给我生成了代码,接下来完全不改动,复制测试一下;
#include <bl_gpio.h>
#include <bl_irq.h>
#include <bl_sec.h>
#include <hosal_timer.h> // 包含硬件定时器头文件
#include <FreeRTOS.h>
#include <task.h>
#define LED_PIN 3 // 定义GPIO3引脚
#define BLINK_INTERVAL 500 // 闪烁间隔500ms(周期1秒)
void led_init(void)
{
/* 初始化GPIO时钟 */
bl_gpio_enable_output(LED_PIN, 0, 0); // 配置GPIO3为输出模式
/* 初始状态设置为低电平(根据电路设计可能需要反转) */
bl_gpio_output_set(LED_PIN, 0);
}
void led_blink_task(void *pvParameters)
{
while (1) {
// 翻转GPIO状态
bl_gpio_output_set(LED_PIN, !bl_gpio_input_get(LED_PIN));
// 使用FreeRTOS延时函数
vTaskDelay(BLINK_INTERVAL / portTICK_PERIOD_MS);
}
}
void main(void)
{
// 硬件初始化
led_init();
// 创建闪烁任务
xTaskCreate(led_blink_task, "led_task", 512, NULL, 15, NULL);
// 启动任务调度器
vTaskStartScheduler();
// 程序不会执行到这里
while(1) {}
}
代码测试
![image.png image.png](data/attachment/forum/202502/06/153349gqqr8djrvaa3g1be.png)
初步看着没什么错误,编译试试。
编译提示出了错误,只能手动改一下了。
修改之后
![image.png image.png](data/attachment/forum/202502/06/153914p80881bsid4489i6.png)
运行成功的代码
#include <bl_gpio.h>
#include <bl_irq.h>
#include <bl_sec.h>
#include <hosal_timer.h> // 包含硬件定时器头文件
#include <FreeRTOS.h>
#include <task.h>
#define LED_PIN 3 // 定义GPIO3引脚
#define BLINK_INTERVAL 500 // 闪烁间隔500ms(周期1秒)
void led_init(void)
{
/* 初始化GPIO时钟 */
bl_gpio_enable_output(LED_PIN, 0, 0); // 配置GPIO3为输出模式
/* 初始状态设置为低电平(根据电路设计可能需要反转) */
bl_gpio_output_set(LED_PIN, 0);
}
void led_blink_task(void* pvParameters)
{
int cnt = 0;
while (1) {
// 翻转GPIO状态
bl_gpio_output_set(LED_PIN, cnt % 2);
// 使用FreeRTOS延时函数
vTaskDelay(BLINK_INTERVAL / portTICK_PERIOD_MS);
cnt++;
if (cnt>10)
{
cnt = 0;
}
}
}
void main(void)
{
// 硬件初始化
led_init();
// 创建闪烁任务
xTaskCreate(led_blink_task, "led_task", 512, NULL, 15, NULL);
// 启动任务调度器
// vTaskStartScheduler();
// 程序不会执行到这里
while (1) {}
}
测试结果
![1.gif 1.gif](data/attachment/forum/202502/06/163652dzwszocx4omygyom.gif)
PWM 调色
开发板上自带了RGB,对应得GPIO如下:
![image.png image.png](data/attachment/forum/202502/06/154625ly1nf4iihryfm1si.png)
提问内容(新对话)
我需要一份基于BL602芯片使用PWM进行RGB灯调色得程序,要求如下:
1、RGB灯的接口为,红色(GPIO14),绿色(GPIO17),蓝色(GPIO3),
2、灯为高电平点亮
3、使用15KHz 的频率
4、提供呼吸灯效果测试程序
DeepSeek 响应
我已经麻木了!
硅基流动尝试几次之后,给了回复:
![image.png image.png](data/attachment/forum/202502/06/160425gt3d9frv6dba9ndi.png)
提供的完整代码
#include <bl_pwm.h>
#include <bl_gpio.h>
#include <FreeRTOS.h>
#include <task.h>
// PWM通道配置(根据实际GPIO-PWM映射关系调整)
#define PWM_RED_CH 0 // GPIO14对应PWM通道0
#define PWM_GREEN_CH 1 // GPIO17对应PWM通道1
#define PWM_BLUE_CH 2 // GPIO3对应PWM通道2
// PWM频率参数(假设系统时钟144MHz)
#define PWM_FREQ 15000 // 15kHz
#define PWM_CLK_DIV 1 // 分频系数
#define PWM_PERIOD (144000000 / PWM_CLK_DIV / PWM_FREQ) // 周期值计算
void pwm_init() {
// 配置GPIO为PWM功能
bl_pwm_init(PWM_RED_CH, GPIO_PIN_14);
bl_pwm_init(PWM_GREEN_CH, GPIO_PIN_17);
bl_pwm_init(PWM_BLUE_CH, GPIO_PIN_3);
// 统一设置PWM参数
for(int ch = 0; ch < 3; ch++) {
bl_pwm_set_freq(ch, PWM_FREQ);
bl_pwm_set_duty(ch, 0); // 初始占空比0%
}
bl_pwm_start();
}
void breathing_effect(uint8_t ch, uint32_t duration_ms) {
const uint32_t steps = 100;
const uint32_t delay = duration_ms / (steps * 2);
// 渐亮
for(int i = 0; i <= steps; i++) {
bl_pwm_set_duty(ch, (PWM_PERIOD * i) / steps);
vTaskDelay(delay / portTICK_PERIOD_MS);
}
// 渐暗
for(int i = steps; i >= 0; i--) {
bl_pwm_set_duty(ch, (PWM_PERIOD * i) / steps);
vTaskDelay(delay / portTICK_PERIOD_MS);
}
}
void rgb_test_task(void *pvParameters) {
while(1) {
// 红色呼吸
breathing_effect(PWM_RED_CH, 2000);
// 绿色呼吸
breathing_effect(PWM_GREEN_CH, 2000);
// 蓝色呼吸
breathing_effect(PWM_BLUE_CH, 2000);
// 白色混合呼吸
for(int i = 0; i <= 100; i++) {
bl_pwm_set_duty(PWM_RED_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_GREEN_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_BLUE_CH, (PWM_PERIOD * i) / 100);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
for(int i = 100; i >= 0; i--) {
bl_pwm_set_duty(PWM_RED_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_GREEN_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_BLUE_CH, (PWM_PERIOD * i) / 100);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
}
}
void main() {
pwm_init();
xTaskCreate(rgb_test_task, "rgb_test", 512, NULL, 2, NULL);
vTaskStartScheduler();
}
代码测试
![image.png image.png](data/attachment/forum/202502/06/160614qbqzuqfcb2j6apu6.png)
有三个错误,做一下修改就好,修改或如下:
![image.png image.png](data/attachment/forum/202502/06/160844m2koy8p21wq5z9q5.png)
编译测试
编译正常,通过了。
运行测试
最后测试失败了,因为PWM通道全都没有对应上GPIO,所以需要把PWM通道号改回来,再测试:
灯,颜色正确了,但是呼吸效果不对,直接让DeepSeek帮我们修改,提问如下:
所提供的呼吸效果不加,只有闪烁效果,没有呼吸效果。
回复
根据意见,调节了PWM频率和分频系数,得到了非常不错的呼吸效果。
完整程序
#include <bl_pwm.h>
#include <bl_gpio.h>
#include <FreeRTOS.h>
#include <task.h>
// PWM通道配置(根据实际GPIO-PWM映射关系调整)
#define PWM_RED_CH 4 // GPIO14对应PWM通道0
#define PWM_GREEN_CH 2 // GPIO17对应PWM通道1
#define PWM_BLUE_CH 3 // GPIO3对应PWM通道2
// PWM频率参数(假设系统时钟144MHz)
#define PWM_FREQ 15000 // 15kHz
#define PWM_CLK_DIV 16 // 分频系数
#define PWM_PERIOD (32000000 / PWM_CLK_DIV / PWM_FREQ) // 周期值计算
void pwm_init() {
// 配置GPIO为PWM功能
bl_pwm_init(PWM_RED_CH, 14, PWM_FREQ);
bl_pwm_init(PWM_GREEN_CH, 17, PWM_FREQ);
bl_pwm_init(PWM_BLUE_CH, 3, PWM_FREQ);
// 统一设置PWM参数
for (int ch = 0; ch < 3; ch++) {
bl_pwm_set_freq(ch, PWM_FREQ);
bl_pwm_set_duty(ch, 0); // 初始占空比0%
}
bl_pwm_start(PWM_RED_CH);
bl_pwm_start(PWM_GREEN_CH);
bl_pwm_start(PWM_BLUE_CH);
}
void breathing_effect(uint8_t ch, uint32_t duration_ms) {
const uint32_t steps = 100;
const uint32_t delay = duration_ms / (steps * 2);
// 渐亮
for (int i = 0; i <= steps; i++) {
bl_pwm_set_duty(ch, (PWM_PERIOD * i) / steps);
vTaskDelay(delay / portTICK_PERIOD_MS);
}
// 渐暗
for (int i = steps; i >= 0; i--) {
bl_pwm_set_duty(ch, (PWM_PERIOD * i) / steps);
vTaskDelay(delay / portTICK_PERIOD_MS);
}
}
void rgb_test_task(void* pvParameters) {
while (1) {
// 红色呼吸
breathing_effect(PWM_RED_CH, 2000);
// 绿色呼吸
breathing_effect(PWM_GREEN_CH, 2000);
// 蓝色呼吸
breathing_effect(PWM_BLUE_CH, 2000);
// 白色混合呼吸
for (int i = 0; i <= 100; i++) {
bl_pwm_set_duty(PWM_RED_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_GREEN_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_BLUE_CH, (PWM_PERIOD * i) / 100);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
for (int i = 100; i >= 0; i--) {
bl_pwm_set_duty(PWM_RED_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_GREEN_CH, (PWM_PERIOD * i) / 100);
bl_pwm_set_duty(PWM_BLUE_CH, (PWM_PERIOD * i) / 100);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
}
}
void main() {
pwm_init();
xTaskCreate(rgb_test_task, "rgb_test", 512, NULL, 2, NULL);
// vTaskStartScheduler();
}
测试结果
![2.gif 2.gif](data/attachment/forum/202502/06/163846sb0yrdwvmfr1hryr.gif)
总结
使用问题总结:
1、官方的服务器还是不给力,一直服务器繁忙
2、生成的代码有部分兼容性问题,达不到直接编译使用要求
3、接口不可能完全可用
使用经验
1、尽可能多的提供要求信息
2、需要结合自身编程经验完善程序细节,以达到想要的功能
3、嵌入式使用比较适合算法类的程序生成
最后最后,希望DeepSeek 尽快完善起来!过来人的服务器繁忙:
![image.png image.png](data/attachment/forum/202502/06/164908li5pl6oporto06xp.png)