数码之家

 找回密码
 立即注册
搜索
查看: 3197|回复: 20

试试让百度的AI帮我们写单片机程序

[复制链接]
发表于 2023-8-31 15:41:18 | 显示全部楼层 |阅读模式
本帖最后由 猪小呆 于 2023-8-31 15:57 编辑

百度文心一言今天免费对社会开放了,之前看坛友做内阻仪里面提到了一个DFT算法计算内阻,不懂DFT是啥也不会写程序,就让百度帮忙写试试,它还真能写出来,以后不会写单片机程序就让百度AI帮我们写就可以了,大家看看它写的怎么样?
https://yiyan.baidu.com/




这是用STM32编写的代码:
  1. ; DFT program for STM32 microcontroller  
  2.   
  3. ; Define memory banks  
  4. bank1 .word 0x20000000  
  5. bank2 .word 0x20002000  
  6. bank3 .word 0x20004000  
  7. bank4 .word 0x20006000  
  8.   
  9. ; Define variables  
  10. input1 bank1, 8 ; input data, 8 words  
  11. input2 bank2, 8 ; input data, 8 words  
  12. output bank3, 16 ; output data, 16 words  
  13. temp bank4, 16 ; temporary storage, 16 words  
  14.   
  15. ; Define constants  
  16. TWID = $3FF ; twiddle factor table index  
  17.   
  18. ; Define functions  
  19. DFT:  
  20.     push {r4-r7, lr} ; save registers  
  21.     mov r4, r0 ; copy address of input1 to r4  
  22.     mov r5, r1 ; copy address of input2 to r5  
  23.     mov r6, r2 ; copy address of output to r6  
  24.     mov r7, #8 ; set loop counter to 8  
  25.     mov lr, pc ; jump to loop address  
  26. loop:  
  27.     push {r4-r6, lr} ; save registers  
  28.     mov r4, r0 ; copy address of input1 to r4  
  29.     mov r5, r1 ; copy address of input2 to r5  
  30.     mov r6, r2 ; copy address of output to r6  
  31.     mov r7, #16 ; set loop counter to 16  
  32.     mov lr, pc ; jump to inner loop address  
  33. inner_loop:  
  34.     push {r4-r7} ; save registers  
  35.     ldr r4, [r4, #0] ; load input1 word  
  36.     ldr r5, [r5, #0] ; load input2 word  
  37.     mul r4, r5 ; multiply input1 and input2  
  38.     ldr r5, =TWID * 4 ; load address of twiddle factor table  
  39.     add r5, r6, r5, lsl #2 ; add output address to twiddle table address  
  40.     ldr r5, [r5] ; load twiddle factor from table  
  41.     mls r4, r5, r4, r4 ; multiply and subtract  
  42.     ldr r5, =temp ; load address of temp storage  
  43.     str r4, [r5, #0] ; store result in temp word 1  
  44.     ldr r4, [r4], #4 ; load input1 word (next)  
  45.     str r4, [r5, #4] ; store result in temp word 2  
  46.     subs r7, #1 ; decrement loop counter  
  47.     bne inner_loop ; repeat inner loop if not done (loop counter != 0)  
  48.     pop {r4-r7} ; restore registers  
  49.     strh r0, [r6], #2 ; store input1 word in output (next)  
  50.     strh r1, [r6], #2 ; store input2 word in output (next)  
  51.     subs lr, #1 ; decrement outer loop counter  
  52.     bne loop ; repeat outer loop if not done (loop counter != 0)  
  53.     pop {r4-r6, lr} ; restore registers and return address  
  54.     pop {r4-r7, lr} ; restore saved registers and return address  
  55.     bx lr ; return to caller  
  56. twiddle_loop:  
  57.     push {lr} ; save return address  
  58.     bl DFT ; call DFT function with twiddle factors as inputs and outputs
复制代码



这是用STM32 C语言写的:
  1. #include "stm32f10x.h"  
  2. #include "arm_math.h"  
  3.   
  4. #define PI 3.14159265358979323846  
  5.   
  6. int main(void)  
  7. {  
  8.     arm_cfft_instance_f32 cfft_inst;  
  9.     arm_cfft_radix2_instance_f32 radix2_inst;  
  10.     arm_status status;  
  11.     float32_t input[8] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};  
  12.     float32_t output[16];  
  13.     float32_t twiddle[16] = {  
  14.         1.0, 0.999938962986879f, 0.9998889545483401f, 0.9998345776851702f,  
  15.         0.9997854545884765f, 0.9997385866311457f, 0.9996956057329524f,  
  16.         0.9996547117300371f, 0.9996162617181657f, 0.999580453731158f,  
  17.         0.999547428715867f, 0.9995168486287347f, 0.999488734243279f,  
  18.         0.9994634058435854f, 0.9994406618322378f};  
  19.   
  20.     // Initialize FFT instances  
  21.     status = arm_cfft_init_f32(&cfft_inst, 8);  
  22.     status = arm_cfft_radix2_init_f32(&radix2_inst, 8);  
  23.   
  24.     // Perform FFT on input data using CFFT and CFFTRI instances  
  25.     arm_cfft_f32(&cfft_inst, input, output);  
  26.     arm_cfft_radix2_f32(&radix2_inst, output);  
  27.   
  28.     // Multiply twiddle factors with output data  
  29.     for (int i = 0; i < 8; i++) {  
  30.         output[i] *= twiddle[i];  
  31.         output[i + 8] *= twiddle[i + 8];  
  32.     }  
  33.   
  34.     // Print the DFT results  
  35.     for (int i = 0; i < 16; i++) {  
  36.         printf("%f\n", output[i]);  
  37.     }  
复制代码
  1.   
  2.     while (1); // Infinite loop to keep program running  
  3. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2023-8-31 16:02:49 | 显示全部楼层
你不烧录试一下吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-31 16:04:48 | 显示全部楼层
sadfun 发表于 2023-8-31 16:02
你不烧录试一下吗?

我对单片机一窍不通。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-31 16:15:48 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2023-8-31 16:15:55 | 显示全部楼层
让百度当回黑客
回复 支持 反对

使用道具 举报

发表于 2023-8-31 16:16:25 | 显示全部楼层
写程序基本框架及简单程序可以  
回复 支持 反对

使用道具 举报

发表于 2023-8-31 16:32:45 | 显示全部楼层
AI再智能也不过是事先汇集了所有的作者成果。如编程和写文章之类纯文字性的工作,使用AI的确成倍提高工作效率。
回复 支持 反对

使用道具 举报

发表于 2023-8-31 17:00:26 | 显示全部楼层
说白了就是爬虫的变种,所有都是网上别人发作品取的。没有了网络,什么也不是!
回复 支持 反对

使用道具 举报

发表于 2023-8-31 17:03:59 | 显示全部楼层
以后简单程序都不用自己写了
回复 支持 反对

使用道具 举报

发表于 2023-8-31 17:25:18 | 显示全部楼层
ling11052001 发表于 2023-8-31 17:00
说白了就是爬虫的变种,所有都是网上别人发作品取的。没有了网络,什么也不是! ...

非常同意
回复 支持 反对

使用道具 举报

发表于 2023-8-31 18:24:18 来自手机浏览器 | 显示全部楼层
今天刚用过
回复 支持 反对

使用道具 举报

发表于 2023-8-31 18:26:39 | 显示全部楼层
百度AI那种垃圾还是算了,试了下基本就是去广告版百度……不过换个角度一想,貌似用来替代baidu.com也不错
回复 支持 反对

使用道具 举报

发表于 2023-9-1 12:46:49 | 显示全部楼层
问Chat GPT的
用stm32汇编语言帮我写一个DFT程序

当使用STM32汇编语言编写DFT(离散傅里叶变换)程序时,需要先了解DFT的算法和实现方法。以下是一个使用STM32汇编语言编写DFT程序的示例:

assembly
; STM32汇编语言DFT程序示例

; 定义输入信号数组
section .data
input_data: dw 1, 2, 3, 4, 5, 6, 7, 8   ; 输入信号数组
N equ 8  ; 输入信号长度

; 定义变量
section .bss
real_part: resw N   ; 实部数组
imag_part: resw N   ; 虚部数组

section .text
global _start

_start:
  ; 初始化变量
  mov ecx, 0   ; 初始化计数器
  mov esi, input_data   ; 输入信号数组地址
  mov edi, real_part   ; 实部数组地址
  mov ebx, imag_part   ; 虚部数组地址

  ; 计算DFT
  loop_start:
    ; 清零实部和虚部
    xor word [edi], [edi]
    xor word [ebx], [ebx]

    ; 计算实部和虚部的和
    mov eax, 0   ; 清零暂存寄存器
    mov edx, 0   ; 清零暂存寄存器
    mov ecx, 0   ; 重置计数器
    mov esi, input_data   ; 重置输入信号数组地址

    loop_sum:
      ; 计算实部和虚部的和
      movzx ax, word [esi]   ; 加载输入信号
      mov bx, cx   ; 保存计数器的值
      imul bx   ; 实部乘以cos分量
      add ax, dx   ; 实部加上虚部
      add [edi], ax   ; 累加实部
      sub ax, dx   ; 实部减去虚部
      add [ebx], ax   ; 累加虚部

      ; 更新计数器和指针
      inc ecx   ; 计数器加1
      add esi, 2   ; 指针指向下一个输入信号
      cmp ecx, N   ; 比较计数器和输入信号长度
      jl loop_sum   ; 如果计数器小于输入信号长度,则继续循环

    ; 输出结果
    mov eax, [edi]   ; 加载实部
    mov ebx, [ebx]   ; 加载虚部
    ; 在这里可以进行实部和虚部的处理和输出

    ; 更新指针
    add edi, 2   ; 实部指针指向下一个位置
    add ebx, 2   ; 虚部指针指向下一个位置

    ; 更新计数器
    inc ecx   ; 计数器加1
    cmp ecx, N   ; 比较计数器和输入信号长度
    jl loop_start   ; 如果计数器小于输入信号长度,则继续循环

  ; 结束程序
  mov eax, 1   ; 设置退出系统调用号
  xor ebx, ebx   ; 设置退出状态为0
  int 0x80   ; 执行系统调用
这个示例程序使用汇编语言在STM32上实现了DFT算法。首先,定义了输入信号数组和变量。然后,在`_start`标签下,通过循环计算DFT。在每次循环中,清零实部和虚部,然后计算实部和虚部的和。最后,可以在适当的位置进行实部和虚部的处理和输出。程序最后通过系统调用退出。

请注意,上述示例程序是使用汇编语言编写的,需要使用适当的汇编器和链接器进行编译和链接。并且,根据具体的需求,可能需要进行一些调整和修改。
回复 支持 反对

使用道具 举报

发表于 2023-9-1 12:49:53 | 显示全部楼层
用STM32 C语言帮我写一个DFT程序

当使用STM32的C语言编写DFT(离散傅里叶变换)程序时,可以使用标准库中的复数运算函数来简化计算过程。以下是一个使用STM32的C语言编写DFT程序的示例:

cpp
#include <stdio.h>
#include <math.h>
#include <complex.h>

#define N 8  // 输入信号长度

int main() {
  // 定义输入信号数组
  float input_data[N] = {1, 2, 3, 4, 5, 6, 7, 8};

  // 定义实部和虚部数组
  float real_part[N];
  float imag_part[N];

  // 计算DFT
  for (int k = 0; k < N; k++) {
    real_part[k] = 0;
    imag_part[k] = 0;
    for (int n = 0; n < N; n++) {
      float complex_factor = -2 * M_PI * k * n / N;
      float complex_value = input_data[n] * cexpf(I * complex_factor);
      real_part[k] += crealf(complex_value);
      imag_part[k] += cimagf(complex_value);
    }
  }

  // 输出结果
  for (int k = 0; k < N; k++) {
    printf("DFT[%d] = %.2f + %.2fj\n", k, real_part[k], imag_part[k]);
  }

  return 0;
}
在这个示例中,我们定义了输入信号数组`input_data`,以及实部数组`real_part`和虚部数组`imag_part`。然后,使用两个嵌套的循环计算DFT。在内层循环中,根据DFT的定义计算复数系数和复数值,并将其分别累加到实部和虚部数组中。最后,使用`printf`函数输出结果。

请注意,上述示例程序是使用C语言编写的,可以直接在STM32的开发环境中编译和运行。并且,根据具体的需求,可能需要进行一些调整和修改。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 18:46:18 | 显示全部楼层
okplay 发表于 2023-9-1 12:49
用STM32 C语言帮我写一个DFT程序

当使用STM32的C语言编写DFT(离散傅里叶变换)程序时,可以使用标准库中 ...

感觉它不是用stm32写的,因为没看到任何stm32文件字样,百度的里面就有:
#include "stm32f10x.h"  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 18:49:18 | 显示全部楼层
okplay 发表于 2023-9-1 12:46
问Chat GPT的
用stm32汇编语言帮我写一个DFT程序

这个汇编也不像是stm32的汇编,里面的指令跟百度生成的明显不一样
回复 支持 反对

使用道具 举报

发表于 2023-9-1 18:54:33 | 显示全部楼层
现在的ai就是个数据收集器,收集好了从里面找结果吐给你
ai不会的东西,他居然能编造出来东西吐给你。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 18:56:04 | 显示全部楼层
firseve 发表于 2023-9-1 18:54
现在的ai就是个数据收集器,收集好了从里面找结果吐给你
ai不会的东西,他居然能编造出来东西吐给你。。。 ...

对,用AI编出来的假新闻比真的看上去还真,让人无法分辨
回复 支持 反对

使用道具 举报

发表于 2023-9-2 08:50:51 | 显示全部楼层
ling11052001 发表于 2023-8-31 17:00
说白了就是爬虫的变种,所有都是网上别人发作品取的。没有了网络,什么也不是! ...

有道理。
回复 支持 反对

使用道具 举报

发表于 2023-9-4 16:44:16 | 显示全部楼层
看着像那么回事,但估计烧录之后运行不起来
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 18:55 , Processed in 0.171600 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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