【有奖征集】分享你的开发故事-活动已停

  [复制链接]
HeroicZelensky | 2023-9-6 11:18:48 | 显示全部楼层
电子工程每天过得都很固定。
焊板子,盯示波器,捶桌子。
现在是在一家开发半导体设备的公司上班。半导体生产属于一个比较老的行业,从上世纪50年代左右的仙童公司开始,到如今的因特尔,三星,台积电等,这些公司也是我们的客户。当然单位时间内的芯片生产数量也可以通过增加生产设备的"运行速度"来提高。
所以,缩小工艺尺寸、提高设备的"运行速度"就变成了每一个半导体人所共同追求的目标,不管是做工艺的还是设计设备的。
不像搞互联网的,产品迭代的速度很快。为了让这些小单位的电流电压的电路稳定运行,通常需要大量的实验和多次的改版。所以我们的工作很磨人,简单的一个采样电路可能就要调试一年,电阻的温飘和热燥声等影响也不再可以忽略。
经常会因为莫名其妙的电路噪声变得躁动不安,所以日常的工作就是右手拿电烙铁,盯着示波器显示屏,并用左手捶桌子。
早上八点到公司找停车位,停好车上楼,到工位放下包,捅开电脑,然后去茶水间打一杯咖啡,然后回自己的工位,打开一包消化饼咖啡兑三元特品(一定得是保质期四天的那种巴氏奶)喝完,电脑就启动的差不多了。
打开ol,把未读邮件全部设置为已读,找出那些直接to我的,点开随便看看,心情好的话回复一下,心情不好的话直接转给一个小弟处理。等到九点半,第一个项目每日站会开始(对的,没错,就是敏捷开发的那种每日站会),戴上耳机,挂上会大概听一下项目进度,然后是项目经理m工程师,工程师嘬牙花子。

提交四五次,一直说我有不良信息,实在不知道怎么回事,只能删减篇幅了。
回复 支持 反对

使用道具 举报

可可~ | 2023-9-6 17:45:21 | 显示全部楼层

说一下最无语的一个开发经历吧,之前开发一个智能家居的WiFi模组,具体哪家的就不说了,用到的主要功能就是UART,WIFI,MQTT,BLE等功能,大体流程是是手机通过蓝牙将配网信息发送给WiFi模组,WiFi模组连接上网络后将串口数据通过MQTT发送到平台,同时还可以将平台的数据通过UART发给设备,实现远程控制的目的,开发过程中简直就是一步一个坑啊:

UART:

UART部分初始化代码如下(省略一些配置):

int uart_getchar(char *inbuf, int *len)
{
    if (inbuf == NULL)
    {
        os_printf("inbuf_null\r\n");
        return 0;
    }
    while (bk_uart_recv(UART_DEMO_POART1, &inbuf[*len], 1, BEKEN_WAIT_FOREVER) == 0)
    {
        if (*len >= IN_SIZE)//每次中断读取最大量为19字节,长数据会多次触发 连续读取,以下为数据长度判断
        {
            *len = 0;
            overflow = 1;
            return -1;
        }
        if (overflow == 1 && inbuf[*len] == '\r') 
        {
            os_printf("Error: input buffer overflow\r\n");
            *len = 0;
            overflow = 0;
            return -1;
        }
        if (inbuf[*len] == '\n')//以回车判断数据结尾
            continue;
        if (inbuf[*len] == '\r')
        {
            inbuf[*len] = '\0';
            *len = 0;
            return 1;
        }

        (*len)++;
    }
    return 0;
}
static void uart_recv_sema_callback(int uport, void *param)
{
    uint32_t cont = bk_uart_get_length_in_buffer(UART_DEMO_POART1);
    os_printf("bk_uart_get_length_in_buffer:%d\r\n", cont);
    rtos_set_semaphore(&rx_sema);
}
void uart_dome_init(void)
{
    int ret = -1, cont = 0;
    char rbuff[IN_SIZE] = {0};
    bk_uart_initialize(UART_DEMO_POART1, &demo_uart1_config[0], NULL);
    rtos_init_semaphore(&rx_sema, 32);
    bk_uart_set_rx_callback(UART_DEMO_POART1, uart_recv_sema_callback, NULL);
    while (1)
    {
        if (rtos_get_semaphore(&rx_sema, BEKEN_WAIT_FOREVER) == kNoErr);
        {
            ret = uart_getchar(rbuff, &cont);
            if (ret == 1)
            {
                ret = 0;
                demo_uart_test_send(rbuff, cont);
                cont = 0;
            }
        }
    }
}

从demo上看初始化了一个回调函数uart_recv_sema_callback,以为时串口接收完成一段数据会进入回调,其实不然。长度小于21的数据进一次回调,超过21的会进回调多次,也许就是初始化信号量数量为32的原因。由于串口协议没最后的回车换行,所以用这个demo无法判断数据结束,使用串口发给模组发一组数据日志如下:

bk_uart_get_length_in_buffer:21
bk_uart_get_length_in_buffer:41
bk_uart_get_length_in_buffer:61
bk_uart_get_length_in_buffer:81
bk_uart_get_length_in_buffer:101
bk_uart_get_length_in_buffer:121
uart rx fifo full
bk_uart_get_length_in_buffer:128

由于发送数据超过了128字节(RX FIFO最大128字节),日志里面有底层输出uart rx fifo full,最大就只能接收128字节。这样子主循环里面会多次收到信号量,进行多次循环,与开发需求不符,稍作修改如下:

int uart_getchar(char *inbuf, int timeout)
{
    uint8_t length = 0, length_1 = 0;
    for(int i = 0; i <= timeout; i ++)
    {
        length_1 = bk_uart_get_length_in_buffer(UART_DEMO_POART1);
        if (length_1 == length)
        {
            i ++;
        }
        else
        {
            i = 0;
            length = length_1;
        }
        rtos_delay_milliseconds(1);
    }
    bk_uart_recv(UART_DEMO_POART1, inbuf, length, BEKEN_NO_WAIT);
    return length;
}
void uart_dome_init(void)
{
    int cont = 0, timeout = 3;
    char rbuff[128] = {0};
    rtos_init_semaphore(&au_rx_sema, 9);

    bk_uart_initialize(UART_DEMO_POART1, &au_uart_config[0], NULL);
    bk_uart_set_rx_callback( UART_DEMO_POART1, au_rx_callback, NULL);
    bk_uart_send(UART_DEMO_POART1, "1234567890ABCDEFGHIJKLMNOPQRSTUVWSYZ", 36);
    while(true)
    {
        if (rtos_get_semaphore(&au_rx_sema, BEKEN_WAIT_FOREVER) == kNoErr)
        {
            cont = uart_getchar(rbuff, timeout);
            os_printf("uart cont:%d\r\n", cont);
            if(0 != cont)
            {
                print_hex_dump("UART:", rbuff, cont);
            }
        }
    }
}

给模组发数据日志如下:

bk_uart_get_length_in_buffer:21
bk_uart_get_length_in_buffer:41
bk_uart_get_length_in_buffer:61
bk_uart_get_length_in_buffer:81
bk_uart_get_length_in_buffer:101
bk_uart_get_length_in_buffer:121
bk_uart_get_length_in_buffer:121
uart cont:121
UART:31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 
uart cont:0
uart cont:0
uart cont:0
uart cont:0
uart cont:0
uart cont:0

现象:还是会进中断多次,可以自动判断数据结束,一次发送数据不能超过128字节,遵循能用就行的原则,暂且先这么用,屏蔽掉回调里面的日志就可以了。后面如果有发送是数据量比较大的情况可以更改一下uart_getchar的逻辑。中间也做过一些其他的尝试,例如使用OSStatus bk_uart_recv( bk_uart_t uart, void *data, uint32_t size, uint32_t timeout );超时机制,无论timeout设置为多少,现象都是一样,查看源码才发现该参数直接没有用,没有用,没有用。还有就是API手册和SDK根本对不上,对不上,对不上。

WIFI:

WiFi连接过程中有时候带汉字的WiFi名称连接不上,查看demo发现在连接之前有个UTF-8的转换:

WIFI.png

就是这个函数,通过蓝牙发过来的数据编码格式就是UTF-8,这里再转换一下反而出错了。将蓝牙发过来的数据格式改成GB-2312或者将此处的转换删除即可。

简直了,以后选型模组还是需要先看下资料是否齐全,省的全网都找不到资料,只有一个多年没有维护的API手册还与SDK对应不上,开发过程极其不爽。

回复 支持 反对

使用道具 举报

zyh663 | 2023-9-6 21:41:31 来自手机 | 显示全部楼层
希望能参加到此活动
回复 支持 反对

使用道具 举报

十里画廊 | 2023-9-7 12:03:52 来自手机 | 显示全部楼层
本帖由 十里画廊 于 2023-9-7 12:21 编辑

翻车是一定会翻车的,不可能不翻车,有些车是自己技术不足翻,有些车是懒,搞好没检查,导致翻车(画好一定要检查,别偷懒)

我对电路感兴趣是从小学初始建立起来的,那时候我父亲不知道从哪里拿回来个小电机,小灯泡,还有个闸刀开关,和电池,我就是从玩的那一刻才喜欢上了电路,到大学才完善起来基础知识,这过程中肯定会有翻车了,我就选择其中一例细细到说。

做的一个盖革计数器,使用air001芯片(主要防止吃灰)盖革管使用j305,升压使用lm3481芯片,开始程序死活上传不上去,然后后面不知怎么按,又可以上传上去,但是上传上去了,又死活不能运行,硬是浪费了我一天时间,后面检查原理图时候发现复位引脚画反了(说明一下,画完一定要检测原理图)复位引脚我给默认接到高电平了,所以按键反过来情况就是,一直按下才能运行,松开是一直进入到复位状态,所以之前偶尔可以下载进入的原因就知道了,没办法,只能手动飞线一下,把线飞到低电平(下图核心板位置)然后核心板下载运行程序没问题,后面驱动oled屏幕发现,没有使用标准iic引脚引出给oled屏幕显示,而且自定义iic引脚无法使用,最后只能强行飞线了(使用单片机,分配引脚,一定要看单片机手册,合理分配引脚),然后就该测试盖革计数仪功能部分,发现无法启动,没有供电,后面测量才发现共gnd,忘记连接到一起了,导致那边没有地,最后只能在飞一条线了,那个苦呀,不过好歹现在可以运行起来了,简单写了个脉冲计数显示,估算了一下,1分钟脉冲37个左右,j305管子的CPM值是210,即一分钟210个脉冲就是1uSv/h(微西弗每小时),计算当前辐射值uSv/h等于当前一分钟脉冲值,除以盖革管CPM值,即为37/210约等于0.176 uSv/h,介于国内平均辐射强度大概0.1-0.2uSv/h,测量本地辐射值0.176uSv/h,几乎符合如上换算公式,也就没问题了,至此开始完善ui界面。


IMG_20230907_114917.jpg
IMG_20230907_114839.jpg
IMG_20230907_114835.jpg
IMG_20230907_114830.jpg
回复 支持 反对

使用道具 举报

qianc | 2023-9-8 11:31:33 | 显示全部楼层
       非要说翻车经历的话,我这边也有两个,第一个是玩穿越机的时候,因为焊点比较小,焊接的时候导线把5v和gnd连起来了,结果把主控和磁力计烧了,还有一次测试3d打印机的驱动,没有看驱动的正反,结果把主控烧了,但是这里我有个与众不同的故事。我是电子专业毕业的,也参加过电子竞赛,毕业之后比较迷茫,想学嵌入式开发吗,后来在亲戚的推荐下,去学了java,后来工作忙,
没有时间搞嵌入式,但是在去年玩了穿越机跟3d打印,有让我从新接触了硬件。也很巧,今年的互联网行情很差,我还是决定自学嵌入式,换个赛道。
       现在的嵌入式资料比五年前要全的多,平台也比以前多很多,在朋友的推荐下,选择了小安的esp32和正点原子的stm32作为我的主要研究方向。也买了很多开发板和传感器,现在已经过去一个多月了,我也慢慢适应了嵌入式开发的模式。希望自己在后面能找个好工作,也希望安信可也能越来越好。
回复 支持 反对

使用道具 举报

iiv | 2023-9-9 08:47:05 | 显示全部楼层
插眼
回复

使用道具 举报

fly-ly | 2023-9-11 17:28:08 | 显示全部楼层
记得有一个晚上,在画开发板的扩展板,因为明天就要到活动的截止日期了,所以再赶工程,安静的房间只剩下鼠标嘎嘎点击的声音和键盘的按键落下的回声,就这样画到了4点,画完后没咋仔细看,就检查了一下drc然后就提交pcb订单,因为第二天还有课就立马去睡觉了。就这样等到了板子到的时候,我先检查了一下板子是否短路了,发现一切正常,然后焊上排母准备调代码,结果在看原理图的时候发现两个排母画反了,那时候庆幸自己还没接电源,不然就会发生短路了,无奈一下只好又重新画了一版扩展板。
回复 支持 反对

使用道具 举报

李白百 | 2023-9-13 20:30:05 | 显示全部楼层
姗姗来迟的小安派开箱
小安派.png
回复 支持 反对

使用道具 举报

爱笑 | 2023-9-14 08:22:19 | 显示全部楼层
李白百 发表于 2023-9-13 20:30
姗姗来迟的小安派开箱

开个贴去开箱哈~
用心做好保姆工作
回复 支持 反对

使用道具 举报

aterllmer | 2023-9-14 18:48:34 | 显示全部楼层
本帖最后由 aterllmer 于 2023-9-14 18:51 编辑

说起这个就有意思了,前一段时间做foc开发板在这方面的翻车不少,第一次翻车实在驱动电路设计的时候,有一个小点没注意上导致电源短路,上机直接烧了芯片,在改版后电源问题没有了,但是在焊接过程中因为没有热风枪,在焊接采样电路的时候焊盘直接掉了
回复 支持 反对

使用道具 举报

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

本版积分规则