ChatGPT 编写的STM32程序
就算说得过去吧。 好牛的AI,好像是一行一行写的,并不是在数据库翻查案例代码,以后百度谷歌都要下岗了 代码规范
注释精简详细 牛比,还会中文注释 只有我看到了 GPT 把 (-127+0.5, +127+0.5) 区间的 float 赋值给了 uint16_t 了么?
从功能上,这自动驾驶不错;从结果上,开坑里了还得挖。 这个也就是玩具级别的,真想让码农立刻就失业吗?但话又说回来,专门搞一个编程版的,好像也并不是很遥远的事。 另外是不是机器目前对这个芯片编程还处于学习过程中,还有提升空间?好歹他知道sin表送DAC之前得幅值提升保证都是正整数,但是它想到了提升一半0.5,但是没想到转换成2047。我今天没事的时候让机器改错看它能做到吗。 哪天能画pcb? TINXPST 发表于 2023-2-10 06:41
这个也就是玩具级别的,真想让码农立刻就失业吗?但话又说回来,专门搞一个编程版的,好像也并不是很遥远的 ...
(引用自6楼)
我一直想不通chatgpt让程序员失业的理由是什么
如果你是老板,你会把程序员裁掉,然后把产品的软件都交给chatgpt来完成吗?
就算把中初级程序员裁掉,留下高级程序员排错,那么高级程序员也可能要自离了 wychao 发表于 2023-2-10 08:11
哪天能画pcb?
(引用自8楼)
让楼主试下{:lol:} wychao 发表于 2023-2-10 08:11
哪天能画pcb?
(引用自8楼)
能画pcb简直是救星 落叶知秋 发表于 2023-2-10 08:50
我一直想不通chatgpt让程序员失业的理由是什么
如果你是老板,你会把程序员裁掉,然后把产品的软件都交给 ...
(引用自9楼)
短时间内这玩意不会让任何程序员失业。
长久看,也许会进化成一个比较好的助理,把你的一些想法通过模块的方式来实现。
但是结果还是需要你来核对。
所以现在说出让程序员失业的人,都是水平比较菜的人才说得出来的 原来需要10个程序员,之后只需要5个了 有这个助理可以大大提高效率,原来几个人的工作量可能就不需要这么多的人了,可不就有人要失业了吗?就算给的代码没那么完美,但对程序员来说,还是可以省很多力气,人写的一样会有错,何况现在还是刚推出的初级版本,再过几年,不可想象! wychao 发表于 2023-2-10 08:11
哪天能画pcb?
(引用自8楼)
估计要下一代或下下一代的模型才行吧
现有的几个PCB平台的文件描述都非文本格式,基于自然语言模型的ChatGPT,应该是无能为力的。画PCB的各位,暂时还是要各自继续努力了{:lol:} 。或者画PCB的体力活,发给我们这种外包团队也行;VIP服务,JlcedaPro/AD/Pads/Allegro都支持{:smile:}
看到网上讨论ChatGPT的代码能力超群时,也提心吊胆了一下,让ChatGPT写个PADS脚本看看,然后松口气,这家伙忽悠人的本事也不含糊的{:lol:}
shiva_shiva 发表于 2023-2-10 09:25
原来需要10个程序员,之后只需要5个了
(引用自13楼)
假设我是老板的话,
我以前招了10个程序员,现在有chatgpt这个也许可以提高生产力的“工具”了,我不会裁掉5个程序员
我会在保留10个程序员的情况下,将原来的3个在研产品,扩展到6个在研产品,保留人力而省掉商业试错的时间成本
如果真的裁掉5个程序员,相当于老板安于现状,吃枣药丸 weavr 发表于 2023-2-10 09:37
有这个助理可以大大提高效率,原来几个人的工作量可能就不需要这么多的人了,可不就有人要失业了吗?就算给 ...
(引用自14楼)
可以看看16楼的假设怎么样?哈哈{:titter:} lb0857 发表于 2023-2-9 22:18
代码规范
注释精简详细
(引用自3楼)
格式也很规范,注释还是中文的。
确实很智能 落叶知秋 发表于 2023-2-10 09:47
可以看看16楼的假设怎么样?哈哈
(引用自17楼)
如果是激进型的公司当然是有可能扩充的,前提是10个都是老板非常满意的程序员。 weavr 发表于 2023-2-10 10:27
如果是激进型的公司当然是有可能扩充的,前提是10个都是老板非常满意的程序员。 ...
(引用自19楼)
如果没有chatgpt的话,老板不满意程序员,也不会让其失业吗?
本质上,打工人失业不失业,只取决于企业单位的管理层基于现状做出的决策,跟有没有chatgpt关系不是很大
现在喊着chatgpt会让人失业的人,应该跟百多年前怕“机器换人”而罢工抗议的人想法差不多
但是现在的人口和生活质量倒是比以前增长了很多 t3486784401 发表于 2023-2-9 23:59
只有我看到了 GPT 把 (-127+0.5, +127+0.5) 区间的 float 赋值给了 uint16_t 了么?
从功能上,这自动驾驶 ...
(引用自5楼)
大神看的仔细 wychao 发表于 2023-2-10 08:11
哪天能画pcb?
(引用自8楼)
PCB软件都有自动布线啊。如果这些专业的做得不好,gpt看来也是不好的。 落叶知秋 发表于 2023-2-10 10:36
如果没有chatgpt的话,老板不满意程序员,也不会让其失业吗?
本质上,打工人失业不失业,只取决于企业单 ...
(引用自20楼)
开除掉不太满意的程序员,还需要招新人来补上,新来的也未必能满意,还有可能更差,所以能勉强用的不会轻意换。
事实上,自动化,智能化已经让很多人失业。例如线材加工的企业,多年前每个工序都需要大量人工,现在一个人可以管理好几台自动化机器,老板是选择精简人员,而不是扩大生产让以前那些人工都有机器管理,毕竟市场需求就那么大。
我觉得机器让人失业长期来看不是坏事,就像刘强东说的实现了”共产主义“,机器干活,人可以轻松一些享受生活,也就是生活质量提高了。 weavr 发表于 2023-2-10 12:48
开除掉不太满意的程序员,还需要招新人来补上,新来的也未必能满意,还有可能更差,所以能勉强用的不会轻 ...
(引用自23楼)
好吧,关于这个话题的讨论就此打住吧,讨论下去会没完没了
希望chatgpt能够像工业革命那样成功,为人类社会带来新的活力,虽然我认为概率非常小 试试请chatgpt 写一下测试用例
重新让chargpt写了一下程序,要求它使用DAC和DMA,上一次的抗完全不见了:
附完整程序:
#include "stm32f10x.h"
#include <math.h>
#define DAC_DHR12R1_Address 0x40007410
void RCC_Configuration(void);
void GPIO_Configuration(void);
void DAC_Configuration(void);
void DMA_Configuration(void);
const uint16_t Sine12bit = {
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
DAC_Configuration();
DMA_Configuration();
while (1)
{
}
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DAC_Configuration(void)
{
DAC_InitTypeDef DAC_InitStructure;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE);
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DAC_DMACmd(DAC_Channel_1, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);
}
TINXPST 发表于 2023-2-10 20:22
重新让chargpt写了一下程序,要求它使用DAC和DMA,上一次的抗完全不见了:
(引用自26楼)
太神奇 了,这么好用。 TINXPST 发表于 2023-2-10 20:22
重新让chargpt写了一下程序,要求它使用DAC和DMA,上一次的抗完全不见了:
(引用自26楼)
楼主请教一下这是用的那个网址,方便分享一下吗 fenglove 发表于 2023-2-10 21:30
楼主请教一下这是用的那个网址,方便分享一下吗
(引用自28楼)
就是火热的 chat.openai.com 啊! 本帖最后由 t3486784401 于 2023-2-11 12:33 编辑
TINXPST 发表于 2023-2-10 20:22
重新让chargpt写了一下程序,要求它使用DAC和DMA,上一次的抗完全不见了:
(引用自26楼)
然而挖了更多更深的坑:
a. 没有看到类似定时器的结构,如何确保 1kHz 发波频率?
从表格长度(32)来看,应该有一个 32kHz 的时间基准,但似乎连 DMA 的触发源配置都没找到。
b. PA4(DAC_OUT1) 配置成了 GPIO_Mode_AIN,这能输出电平?
c. DAC 寄存器 DHR12R1 在 F103 系列的物理地址是 0x40007408,
而文中给出的 0x40007410 则对应 DHR8R1,显然工作会发生异常。
----------------------------
当然也可以把这几个问题再行丢回给 AI,相信最终会写到满意。
编辑原因:发现更多坑 t3486784401 发表于 2023-2-11 12:27
然而挖了更多更深的坑:
a. 没有看到类似定时器的结构,如何确保 1kHz 发波频率?
(引用自30楼)
有这个精力和水平,自己写更快了。 t3486784401 发表于 2023-2-11 12:27
然而挖了更多更深的坑:
a. 没有看到类似定时器的结构,如何确保 1kHz 发波频率?
(引用自30楼)
大神看得很细!
关于b)问题,冤枉机器了,做DA输出确实是配置成GPIO_Mode_AIN,这个我之前的程序就是这样跑的,绝对没问题:
GPIO_StructInit(&GPIO_InitStructure);
// PA4 for sine wave
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
(以上是我之前用的程序)
关于a)问题机器马上就承认自己疏忽了然后更新的代码:
#include "stm32f10x.h"
#define DAC_DHR12R1_Address 0x40007410
uint16_t Sine12bit = {
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
void DAC_Config(void)
{
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DAC_DMACmd(DAC_Channel_1, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);
DAC_Cmd(DAC_Channel_1, ENABLE);
}
void TIM6_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 7199;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
TIM_Cmd(TIM6, ENABLE);
}
int main(void)
{
DAC_Config();
TIM6_Config();
while(1);
}
综合效果还是不错的。小的错误肯定有,但是确实可以作为编程帮手了。 TINXPST 发表于 2023-2-11 13:24
综合效果还是不错的。小的错误肯定有,但是确实可以作为编程帮手了。
(引用自33楼)
作为 AI 已经很不容易了,一定程度上脱离了智障的范围,至少是通过了图灵测试。
大家对于它的担忧,应该类似于恐怖谷理论。 TINXPST 发表于 2023-2-11 13:22
大神看得很细!
关于b)问题,冤枉机器了,做DA输出确实是配置成GPIO_Mode_AIN,这个我之前的程序就是这 ...
(引用自32楼)
仔细看了手册,确实是模拟输出模式时,GPIO 应配置为 AIN;
单从这点来看,这 AI 助手的搜集能力确实不一般 其实,通过这2天的简单测试我发现,如何正确,清晰,具体地提问或者描述需要解决的问题是达到理想结果的关键! 代码太长,一次对话它可能没写完,填入继续,让它继续写出后面内容 118139 发表于 2023-2-11 15:06
代码太长,一次对话它可能没写完,填入继续,让它继续写出后面内容
(引用自37楼)
是的 t3486784401 发表于 2023-2-9 23:59
只有我看到了 GPT 把 (-127+0.5, +127+0.5) 区间的 float 赋值给了 uint16_t 了么?
从功能上,这自动驾驶 ...
(引用自5楼)
这就是四舍五入取整的常规做法,没毛病。 dadatou 发表于 2023-2-12 20:50
这就是四舍五入取整的常规做法,没毛病。
(引用自39楼)
把取值含负数的 float,赋值给无符号的 uint16_t,你猜怎么着? 本帖最后由 Elex 于 2023-2-13 02:51 编辑
t3486784401 发表于 2023-2-9 23:59
只有我看到了 GPT 把 (-127+0.5, +127+0.5) 区间的 float 赋值给了 uint16_t 了么?
从功能上,这自动驾驶 ...
(引用自5楼)
我觉得是你搞错了
他的程序加上偏移量0.5,输出是0~1之间变化的,毕竟MCU输出不了负电压,单偏移量估计加错位置了 Elex 发表于 2023-2-13 02:47
我觉得是你搞错了
他的程序加上偏移量0.5,输出是0~1之间变化的,毕竟MCU输出不了负电压,单偏移量估计加 ...
(引用自41楼)
前一句是 A*sin 运算,范围直接就 -127~+127
后一句 0.5 从效果上没法理解为偏移量:结果仍有负值 t3486784401 发表于 2023-2-13 14:56
前一句是 A*sin 运算,范围直接就 -127~+127
后一句 0.5 从效果上没法理解为偏移量:结果仍有负值 ...
(引用自42楼)
所以说它偏移量搞错位置了,应该是在乘于振幅之前加上0.5或者最后加上0.5倍的振幅。
但最后结果是UINT16,这样可以赋值给PWM控制寄存器
页:
[1]