(發布三小時後更新...文章最尾端!)
"沒有最便宜,只有更便宜...",自從以前我在搞那個八核心MCU 時,
我就已經發現這個市場定律一樣可以套用在我們高科技MCU 市場上,
你說台灣那個八位元OTP MCU 賣個 US$ 0.03 算甚麼?有時候不是便宜的問題,
就是難用啊,OTP 的MCU雖然可以用ICE 模擬開發系統,但是就是不方便啊。
尤其是現在這種系統高度整合開發時代裡,哪一個新一代的年輕工程師還搞這些?
就連我這種LKK 的工程師,看到那個東西,就二話不說:下一個...
因為隨著時代與市場發展,有些東西隨著網路發達,許多傳統的產品開發方式
也都跟以前大不同了,沒有人說哪個方法好,但重點還是在於"人"啊。
現在有很多MCU 的系統開發,人家套個網路豐沛的資源:遍地開放源的東西,
不用三兩下,那些很基礎的系統架構就可以馬上跑起來驗證了。
尤其當你看到那個 stm32 的網路資料,那些滿街滿谷的標準開放程式碼,
都得讓你不得不拿個他的平台來跑一下系統評估的可行性,(當然一樣的道理
也是可以套用在八位元的 Arduino 平台上啊。如果你公司的系統開發人員不多的話,
那你就更需要這些豐沛的網路資源來支持你。但這又偏偏又是一個市場趨勢潮流:
因為以我們台灣或東方公司的慣老闆的心態:只要一兩個人員可以搞定的事,
他就不會想幫你多找個幾個幫手的。所以啦,這些網路資源就顯得格外重要了。
那你說:這個IC 或開發平台工具比較貴啊。有差嗎?至少這些也都還是一次性的
費用,(有時候對老闆來說:還可以拿來弄成硬體設備抵免稅金呢!),也總比雇用
工程師便宜許多了吧。(人真的比硬體設備還難搞啊。)
那你說:現在這些硬體的東西就真的比較貴嗎?還是標題:沒有最便宜,只有更便宜。
話說啊,最近客人提醒說:stm32 在市場有點缺貨,漲價了囉。
所以啦,我們這些搞系統的人,就得留意找找一些市場對策了。
其實我們也知道市場早就出現 stm32 的替代品了:有沒有發現有兩個比較奇怪的
MCU 型號:GD32 及MM32 ?
1、 系统
1) 晶振起振区别
描述:启动时间,GD32 与STM32 启动时间都是2ms,实际上GD 的执行效率快,
所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms,但是这个宏定义值
在GD 上时间就更加短了,所以要加大这个值的设置。
解决方法:将宏定义:
#define HSE_STARTUP_TIMEOUT
((uint16_t)0x0500)
修改为:
#define HSE_STARTUP_TIMEOUT
((uint16_t)0xFFFF)
备注:启动时间宏定义所在位置:
1、在V3.X
的库,其启动时间宏定义在stm32f10x.h 头文件中(路径:\..\Libraries\CMSIS\CM3)。
(库版本的不同,所在目录也有所不同)
2、在V3.0
以前的库,其启动时间宏定义在stm32f10x_rcc.c 源文件中(HSEStartUp_TimeOut)
(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)。
2) 部分客户使用有源晶振出现问题,在GD32F103 小容量产品,发现会在MCU 的复位管脚一直把
电平拉到0.89V,电平不能保持在高电平。
描述:是由于部分有源晶振起振时间太快,复位信号还没有完成导致的
解决方法:就是在有源晶振的输入端与地之前并上一个30pf电容。
3) GD32 MCU 主频支持108MHz
高性能,在代码移植方面需要注意事项
描述:GD32
通过芯片内部加大缓存,提高了相同工作频率下的代码执行速度,
带来了高性能的使用体验。
解决方法:因此如果代码有用到for 循环或while 循环语句做精确定时的,定时时间会由于代码执行
速度加快而使循环的时间变短。使用Timer 定时器则没有影响。
4) GD32F105/107 系列MCU 配置为108MHz 有何不同
描述:通过Clock
configuration register (RCC_CFGR) 中, 第21 : 18 位为PLLMUL[3:0],
再结合第29 位PLLMUL[4]组成5 位的位域来确定PLL 倍频系数,即通过软件配置来定义PLL 的倍频系数,
且PLL 输出频率绝对不得超过最高主频(108MHz)。
2. 内部Flash
1) 芯片设置读保护用法
描述:由于GD 的Flash 是自己的专利技术,STM 的Flash 是第三方提供的,所以GD 的Flash 和
STM 的Flash
有些许差异。GD 的擦除时间会长一点.
解决方法:在写完KEY 序列以后,需要读该位,确认key 已生效。 所以,这里应该插入
While( ! (FLASH->CR & 0x200 ) );
// Wait OPTWRE 或可简单插入两个NOP。
__NOP();
__NOP();
在ST 库中,只有
FLASH_Status
FLASH_EraseOptionBytes(void)
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
FLASH_Status
FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
FLASH_Status
FLASH_ReadOutProtection(FunctionalState NewState)
四个函数需要修改。
2) IAP 在应用中编程
描述:GD32
由于自有flash 的0 访问时序,同STM32 在Flash 的Erase 和Program 上存在差别,
GD32 的Erase
和Program 时间比STM32 的稍微长些,建议对Erase 和Program 时间进行修改。
解决方法:将宏定义
#define EraseTimeout
((uint32_t)0x000B0000)
#define ProgramTimeout ((uint32_t)0x00002000)
修改为:
#define EraseTimeout
((uint32_t)0x000FFFFF)
#define ProgramTimeout
((uint32_t)0x0000FFFF)
备注:
Erase 和Program 时间宏定义在stm32f10x_flash.c 源文件中
(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)
3) 用IAR 下载配置
解决方法:在批量生产的时候首先会烧写一个USB 的boot,这个boot
自动运行后在由上位机
软件进行烧写应用程序。如果boot 程序不能自动运行则需要重新插拔一次电源。给生产造成一
些麻烦。产生不能自动运行程序的原因是如果程序设置读保护的话需要等待FLASH_CR 的
第9[OPTWRE]位为1.如果没有置位的话继续执行就会出错。由于ST 的执行速度慢,程序执行到
读FLASH_CR
寄存器的时候该位已经置1,GD 的执行速度比较快,程序运行到这的时候该位还
没置1,因此需要在FLASH_ReadOutProtection 函数里面添加一些轮询该位为1 或者加一些延时。
3. ISP 烧写软件
1) ISP 烧写,建议使用官方烧写软件
描述:GD32
芯片内部flash 同STM32 有区别。
解决方法:建议到www.mcuisp.com 下载最新版本的MCUISP。另外GD32
也有专门的烧写软件
(GigaDevice MCU ISP
Programmer)可以到http://bbs.21ic.com/gd32 论坛下载。如果使用
自制的ISP 软件或脱机编程器,实现ST 和GD 完全兼容,建议修改以下参数:
1、 页擦除等待超时时间增加至300ms,整片擦除等待超时时间增加至3s 左右。
2、 字编程等待超时时间增加至2ms,页编程等等超时时间增加至300ms。
4.I/O 口
1) IO 口外部中断使用方法
描述:在关闭期间,如果外部引脚有电平的变化,在使用IMR 打开中断后会马上进入中断服务程序。
理论是打开中断前,不管管脚是否有电平的变化,都不会影响到打开后的中断响应。
解决方法:所以解决方法就是通过禁用上升沿或者下降沿检测寄存器来开关中断,不能使用IMR
屏蔽寄存器。程序如下:
EXTI->FTSR &= ~EXTI_Line3; //关闭沿检测,以达到关闭中断的目的,下降沿使用FTSR 寄存器,上升沿使用RTSR 寄存器
EXTI->PR = EXTI_Line3;
EXTI->FTSR |= EXTI_Line3;
2) 在待机模式,PA8 引脚特殊设置
描述:在使用低功耗的情况下,PA8 会被MCU 在内部被设置为地PA8 复用为MCU 内部频率输出,
超低功耗设置时需要悬空。
解决方法:在待机模式,PA8 悬空不用。
3) 低功耗下必须注意
描述:在使用低功耗情况下,把软件全部端口(A-F)时钟关掉,无论是否有该端口。
4) 当有脉冲群冲击管脚
描述:需要在在进入中断后关闭中断。
5. 定时器
1) 定时器输入捕获模式需要软件清中断
描述:STM 定时器输入捕获模式默认能硬件清中断,GD 为了更加严格要求配置,需要做软件清中断
。
解决方法:软件清除标志位。
2) 定时器向上脉冲计数模式设置
描述:定时器的用法差异。
解决方法:脉冲计数模式下,装载值必须设置为比预期值大,否则不计数在ST 上如果重载值不设置
(初始为0)的时候,CNT 可以正常计数。
在GD 上如果重载值不设置保持初始为0 的时候,会因为
重载值为零,即便是来一个脉冲也会导致所有的寄存器复位从而不能正常计数。
3) TIM、ADC 模块
描述:Timer、ADC 模块的触发信号宽度要求。
解决方法:由于内部有高速和低速两条外围总线,Timer、ADC 模块和其他外设共同使用这两个总线。
GD32F103/101 系列Flash
128KB 及以下的型号,Timer、ADC 等模块识别触发信号的条件是触发信号
宽度大于模块所在总线的时钟宽度。
6. 串口USART
1) USART 连续发送数据字节有空闲位
描述:字节间有空闲位。
解决方法:对于一般的通讯来说,不会有影响,只对于一般在通讯上有特殊协议的,才会产生数据不准确的情况所以,特定情况,修改程序。
7. I2C 总线
1) 硬件I2C 特殊配置
描述:GD 的I2C 相对STM 的来说要少一个标志位
解决方法
1、宏地址定义改变
#define
I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED
((uint32_t)0x00060002)
#define
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
((uint32_t)0x00070002)
2、硬件I2C 在会在向从机发送7bits 地址完成后,从机还没来得及识别。(看客户应用)我们可以在
发送完7bits 后加个延时,让从机完全识别:
I2C_Send7bitAddress(I2C1,
EEPROM_ADDRESS, I2C_Direction_Transmitter);
{
int i = 0xfff;
while(i --);
}
3、检测ADDR
不能使用I2C_CheckEvent 函数,因为他会清除ADDR,可以使用I2C_GetFlagStatus 函数。
就是把while(!I2C_CheckEvent(I2C1,
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
改为while(!I2C_GetFlagStatus(I2C1,
I2C_FLAG_ADDR));
4、还有个关于编程步骤的严谨性,跟STM 想比,我们是先Clear_ACK,再Clear_ARRD。
8. ADC 采集
1) ADC 采样设置
描述:ADC
启动
解决方法:
1. 当ADON=0
时写入1 后,需要等待一段时间t_WAIT,如果用ST 库的话就在ADC_CMD 后面加20us 左右的延时。
2. 如果采用中断获得采样数据后,需要软件清除中断。
9. SDIO
1) SDIO DAT 3 pin 的在 1
bit bus mode 和4 bit bus mode 下的配置
描述:
1、
SDIO 在 1 bit bus mode 下,DAT
3 pin 是低电平,这样会导致 SD Card 进入SPI 模式。
原因:初始化失败的原因主要是因为GD32 的芯片SDIO 的DAT3
口存在BUG。
2、 在4 位模式下,通过上面的方法,程序能正常初始化,但不能正常读写SD卡。
原因:因为DAT3
口在前面已经配置成推挽输出,所以在4 位模式下,不能正常读下。在调用4 位模式前,
把DAT3
的端口配置成复用推挽输入即可解决问题。
解决方法 1、 1 bit bus mode 的解决方法:建议在SDIO 使能之前,先把 SDIO DAT 3 pin 配置成推挽
输出,并且要置成高电平,使 SDIO DAT 3 pin 保持高电平即可.
2、 4
bit bus mode 的解决方法:在调用4 位模式前,把DAT3 的端口配置成复用输出即可解决问题。
2) 程序在刚烧完后能正常读写SD 卡,断电再上电后,SD 卡初始化失败,需要手动复位一次后才正常
描述 在某些SD 卡中,GD32 断电再上电,会引起SD 卡上的时钟信号不正常,导致SD 卡发送命令失败。
解决方法:在程序中,打开SD 卡时钟后,增加一小段延时,以保证SD 卡时钟信号稳定。这个延时添加
的地方:在sdcard.c(即SDIO 的配置文件中),然后在SD_Error SD_Init(void)这个函数中找到SDIO_DeInit();
就在这个后面加个延时。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
SDIO_DeInit();
{
int i = 0xffff;
while(i --);
}
10. USB
A. USB_OTG
1) 客户使用STM32
的DFU 原工程时需要注意几点
解决方法:
1、 在usb_istr.c
中,增加如下语句
for (i=0;i<8;i++) EP[i] =
_GetENDPOINT(i);
for (i=0;i<8;i++)
_SetENDPOINT(i, EP[i] & 0x7070);
2、 在usb_conf.h
中,按照下图红色字体语句进行修改
#if defined(STM32L1XX_MD) ||
defined(STM32L1XX_HD)||
defined(STM32L1XX_MD_PLUS)
#define INTERN_FLASH_SECTOR_ERASE_TIME
100
#define INTERN_FLASH_SECTOR_WRITE_TIME
104
#else
#define INTERN_FLASH_SECTOR_ERASE_TIME
100
#define INTERN_FLASH_SECTOR_WRITE_TIME
100
3、 把固件库中的stm32f10x_flash.c 使用附件的进行替换。
4、 软件进行读保护位时需要选使用FLASH_Unlock();函数
int main(void)
{
#if defined (USE_STM32L152D_EVAL)
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_OPTVERRUSR);
#endif
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
2) 部分USB 兼容性
解决方法:
1. 部分U 盘有3 个端点,数组越界导致Itf_Desc 被清空,所以主机不能识别设备类型。USBH_conf.h 文件的USBH_MAX_NUM_ENDPOINTS
的定义由2 改成3 就可以了将:#define
USBH_MAX_NUM_ENDPOINTS 2
改为:#define
USBH_MAX_NUM_ENDPOINTS 3
2. 在In 端点中断处理程序USB_OTG_USBH_handle_hc_n_In_ISR 中,对于NAK 中断,V1.0.0 版本的处理如下:
else if (hcint.b.nak)
{
if(hcchar.b.eptype == EP_TYPE_INTR)
{
UNMASK_HOST_INT_CHH (num);
USB_OTG_HC_Halt(pdev, num);
CLEAR_HC_INT(hcreg , nak);
}
else if ((hcchar.b.eptype ==
EP_TYPE_CTRL)||
(hcchar.b.eptype == EP_TYPE_BULK))
{
/* re-activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR,
hcchar.d32);
}
pdev->host.HC_Status = HC_NAK;
}
而V2.1.0
版本的NAK 处理过程如下:
else if (hcint.b.nak)
{
if(hcchar.b.eptype == EP_TYPE_INTR)
{
UNMASK_HOST_INT_CHH (num);
USB_OTG_HC_Halt(pdev, num);
}
else if ((hcchar.b.eptype ==
EP_TYPE_CTRL)||
(hcchar.b.eptype == EP_TYPE_BULK))
{
/* re-activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR,
hcchar.d32);
}
pdev->host.HC_Status[num] =
HC_NAK;
CLEAR_HC_INT(hcreg , nak);
}
唯一的区别就是CLEAR_HC_INT(hcreg ,
nak)的位置,在V1.0.0 版本中对于CTRL
和BULK 端点的NAK
中断没有清除NAK,我们的芯片会因此产生多次IN 传输的请求,导致数据传输错
误。改为V2.1.1 的
写法后传输正常。(注意HC_Status 在V2.1.0 是数组,在V1.0.0
是单个数据,直接拷贝的话要去掉
后面的[num])
B . USB 外设的工作频率有限制
描述:有最低工作频率的要求,也就是APB1
分频后的时钟必须大于12MHz,比如HCLK 为56MHz,APB1 的最大分频系数为4,56/4 = 14MHz,可以正常工作。
11. SPI
1) 输入与输出配置要求(STM32 不需要如此要求)
解决方法 :
GD32 在使用SPI 时,IO 的配置必须严格遵守主从模式下的输入与输出配置,而STM32 无此要求,相关代码如下:主机模式下IO 配置(主机以SPI 为例):
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_5|GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_InitStructure);
从机模式下IO 配置(从机以SPI2 为例):
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_13|GPIO_Pin_15;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_14;
GPIO_Init(GPIOB,&GPIO_InitStructure);
3) 在GD32
的SPI 的时钟信号,空闲状态需要配置成高电平,以保证数据的稳定性,具体代码如下
解决方法
SPI_InitStructure.SPI_Direction =
SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode =
SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize =
SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL =
SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA =
SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS =
SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler
= SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit =
SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
4) 当作为从机时,在GD32 中,时钟信号必须为8 的整数倍。
解决方法
SPI_InitStructure.SPI_Direction =
SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode =
SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize =
SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL =
SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA =
SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS =
SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler
= SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit =
SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
5) 在GD32
中,不能使用SPI_I2S_FLAG_BSY 该位来判断SPI 总线数据是否接收或发送完成。
12. 看门狗
1) 进入STOP
模式前打开看门狗,通过RTC 的ALR 唤醒后,程序会不断被复位的现像
描述:IWDG 内部有个Reload 信号,KEY 寄存器写AAAA 会使其拉高,过一段时间自动拉低。
在拉底之前进入STOP 状态会使Reload 信号一直为高,等到退出STOP 后也保持为高,之后再写AAAA
没有办法让Reload 产生上升沿,也就没办法更新计数器了。
解决方法:进STOP 之前不要Reload,也可以调整下程序的顺序,把IWDG
的配置放到RTC配置之前,效果是一样的。
https://www.smslit.top/2018/10/10/vscode-pio-ide/
回覆刪除另一個MCU開發工具的代表。它利用VS Code這個巨人editor,專心在多MCU共同開發平台發展。
硬體為主的人無法理解統一平台的重要性。
光是工程師每天有80%時間要看的editor介面,能用VS Code就大大加分,這個不流行才奇怪。
謝謝你所提供的資訊。
刪除不過,這些林林種種的工程輔助工具對我們這些老人家,真的負擔太重了。
我們也知道對許多老闆來說:他才不管你這些東西,怎麼把東西趕快搞定比較重要。
才是他們所在意的事情。所以啦,有些工程上的東西,就只能在我們這些工程師之間
流傳,拿出來跟老闆說:有時候,也只會自討沒趣,有時還有可能反過來給自己潑了一頭冷水。
喔~除非有特殊情況,我現在比較少時間一天花個 80% 時間來看 Editor 的東西,
年紀大了,這些東西看久了。傷身有傷眼睛,自己要懂得保養了。
表達不良,重點歪了。我是說別人只要著重CLI的程式是不是可以用,再利用VS Code做為IDE的外型。一個很漂亮的工具就成型了。就變成了VS Code一鍵安裝編譯及除錯工具,同時支援多家MCU的IDE就出來了。
刪除不過若是MCU開發,老闆才不管用那個editor。以前用漢書,黑底白字看得舒服,到windows上就沒有這樣的環境,白底黑字看二個小時就開始累。直到VS Code又回到黑底,就算只做編寫,我還是離不開vs code,因為開其他程式就很偒眼。
嗯,了解。
刪除以前我自己在寫那個多核心的IDE 時,也是從過去的習慣裡去建置整個IDE 開發環境,
後來這幾年,慢慢地許多越來越方便的開發平台都在許多大廠的支持下,走向一統。
所以對於擅長軟體開發平台的微軟,當然也不願意缺席啊。
而在這些不管是軟體或是硬體架構的慢慢走向一統天下的情形下,
對我們這些工程師來說:也是好事,也是壞事。
好事的是:對不同的硬體平台轉換越來越沒啥包袱了。
壞事的是:那這些開發工作就只剩下平淡無奇的固定循環工作而已吧。
真的很難想像未來還有怎樣的開發工具與平台出現呢?
或許那時候,我真的也不再撰寫任何韌體程式了吧。
開發平台越長越像的同時,對工程師好事是進入障礙降低,換哪家都差不多,原廠都作好好的
回覆刪除壞事反而是老闆也覺得換哪家MCU都差不多,就選最便宜的吧
苦的還是工程師
前輩曾經說過,便宜的IC不是人人都可以用的
到有年紀之後,更是有感,
有的職業越老越值錢,工程師則是越老越不值錢,眼睛衰退就是不可抗力
前公司就有類似的案例,一個MCU是1998年出的,現在還在出產品。電子及軟體都建議要換MCU,但提出來的時程很長大約要一年,老闆不同意,老闆認為換MCU無法增加收入還要額外支出是不值得的。去年我有提出可以同時換MCU及軟體轉換,還是不准。後來我一離開不久,同事就說收入停產通知,現在為了換MCU弄得很緊急。緊急趕出來的一定不會是好品質。我只能說老闆格局如此,我也幫不了。
刪除當然隨著時代進步,有很多事情都值得我們有空時就得要面對與思考的。
刪除這不只是老闆而已,就連我們這些領薪水的工程師也是要做的一個重要課題。
因為這不是你或老闆要不要改變的問題,而是真的環境與競爭都在改變的。
所以許多先進技術不是你要不要學或了解,因為這就是一個趨勢與潮流。
當然也不是叫你馬上見異思遷,而是真的需要你從各方面思考、與權衡輕重的。
這些都不是因為你不是老闆,就不用想,因為誠如各位許多經驗,當沒有認真思考的
老闆,對你來說也是風險。天下沒有幾家公司是真正的幸福企業啦。
所以啦,只有你比老闆的格局更高,更遠大,這樣子才能做到無欲則剛,
對你來說:是你在挑老闆,而不適老闆在挑你的。
其實對於一個成熟又賣了N年的產品,換MCU 平台,包括:電子硬體與軟體。
刪除花一年時間轉換,這很正常啊。因為所牽涉的零件重新選用、電路修改驗證,
再加上軟體效能平台轉換...當然還牽涉到後段生產備料,一年本來就是合理啊。
更糟糕的是:如果你早幾年換,或早一點決定,搞不好都已經順利完成了。
一年拖過一年,人的惰性,會讓你這些原本簡單容易的事情,會越搞越複雜。
就像你說的,當老闆聽不進去,就會牽涉到人性信任與管理問題。
我說了:大家都是領薪水的,有差嗎?最後倒楣的是誰?當然還是老闆或企業的形象啊。
所以你說的沒錯:人的格局到哪?結局就是到哪!
天下會變成這樣子,不是沒有道理的啦。
不要說一般小公司拖著不換.
刪除台灣幾個世界有名的大廠, 用著已經被併購再併購再併購再再併購的MCU, 也是拖阿.
不過對於小小員工來說, 都沒差啦.
我所知道的大公司,產品很多,所以它們真的不是很在乎。小公司不同,因為庫存壓力大,都是共用料多,包括MCU。缺料要是主料件,只能說是全公司動員。以前則是六日加班趕,真的是沒日夜。現在勞基法改了六日不能加班,老闆心態依舊。研發不可能像以前一樣幾個月出來,真的有可能斷貨,今年更糟,說斷就斷。斷了公司一定放無薪假,研發仍在跑,就看老闆口袋的深度了。
刪除小小員工是沒差,就反應不同代的想法。我知道新世代確實比較不在乎公司存亡。因為成長的環境不一樣了。
最近我參加的一個社團在玩RISC-V。一群人還想在上面寫組譯器。人家RISC-V是因為免費C才起來的,又倒走回去? 只能說寫了一輩子的組語,看到每一個CPU都是組語的好世界。這個世界不一樣了,不能再怪年青人不學組語,反面是自己不前進還在怪年青人不長進。
回覆刪除年底到了,趕手上的案子,真的比較少上部落格好好地寫寫東西。
刪除關於 RISC-V 的東西剛好最近也有朋友提起,國內有名的就是晶心IP 的東西。
廠商也有提到這個方案,不過,我還是以冷處理方式面對,不是我不看好這個東西,
而是以我的年紀來說:也真的不適合用看未來的方式來看產品布局了,
以這篇報導來說:
https://www.bnext.com.tw/article/59398/arm-nvidia-risc-v-semiconductor
"ARM失去中立性,是RISC-V的大好機會?晶心科總經理:「3年後有機會遍地開花」"
2025 年?我幾歲了,我還在等他以他的理想目標樂觀的預估?還等這些人來搞一些組譯器?
昨天是一位以前一位IC 設計公司的業務老同事的告別式,他還比我小個四、五歲。
前一陣子還跟我們討論:他們要跟老東家合作開發IOT 物聯網的教育平台方案。
結果一個周末的公司休閒健行活動時,因身體不適猝逝。老婆小孩都沒在身邊,
一句話也都沒交代,人就這樣子走了。
我並沒有反對RISC-V,有些東西能夠創造市場,不是光靠嘴巴說說的啦。
現在在技術上免費東西很多的,也不是你的東西OPEN Source 或是免費的就可以創造市場。
我常常說:看別人成功很簡單,事後諸葛講講就可以了。但實際上這個過程,還需要
許多外在的市場因素才能成功的啦。就像我這篇文章說的:
人家為什麼還要抄別人的東西?因為就是市場大啊,一家抄還不夠,還得再加一家。
結果呢?到了年底這個時候,這些公司還是不夠供市場需求啊,缺貨!大缺貨!
怎麼辦?大家彼此看一看,等啊。我們沒有那麼偉大的到那一種可以當市場白老鼠啊。
所以啦,很多東西就看看就好,有些自己的答案就在自己的經驗法則裡的。
---
PS:@Bee 另外一個題外話:
那天剛好在FB 的社團留言中,看到你的留言,也察看了你的FB 動態,
您也真的不容易耶,這一、二十年的職場工作經驗中,還可以在這幾家公司中,
不斷的交錯往返進出,或許你真的可以跟 @GoodSpeed 好好地交換一下工作經驗心得了吧。
離開總是有些理由或想法,但再回頭,也可能也是有一些理由或想法,
但可以不斷的交替著這些理由或想法,到底是以技術發展觀點來看的呢?
還是都是技術發展以外的觀點來考量的呢?
所以說啦,工程師有時候真的就不要太拘泥於本身的技術堅持了吧。
我們沒有那麼偉大的可以創造甚麼話題,因為就連我們在工作上也都未必有那麼大的影響力啊。
你說:是不是啊?
年底了。祝福大家新年愉快,未來一年鴻圖大展,當然最重要的還是身體健康啊。
加油。
第一次離開是因為薪水沒跟上。又回去是因為我已經可以設計下一代機器。二公司都一樣,我提出二代機,結果都是冰起來,冰久了也只能離開。中國人政治太嚴重,只能一次升0.1代,你要是大躍進,人的問題遠大於技術問題。這次只能去更遠的技術領域了。
刪除RISC-V我是沒那個屁股玩了,我不具備那樣的智力跟體力...更重要的是可以拿來賭的青春歲月已經消磨得差不多了,我現在比較認分一點,玩一些尚能掌握的東西如Linux,可大可小自娛娛人
刪除@Goodspeed 果然已經有老人家的那一種自知之明了。
刪除孔老夫子說:及其老矣,戒之在得。...就是告訴我們:年紀大了,不要再想太多了啦。
至於晶心的 RISC-V ,其實他們也有找我兒子去面試...但幾個同學約一約,就都沒去了。
現在呢?幾個同學在別家公司都上班上得很愉快,每逢周末假日就相約出去玩。
是啊~RISC-V 可能有它的未來,但我們都還是平凡人,你們要怎麼對市場產生影響力?
甚至要翻盤,真的要好好的想想吧。絕大部分的人還是喜歡以逸待勞的觀望吧。
也不算是以逸待勞,只是要認清主流。未來的路比較多。就上次我在FB和別人討論RTOS的使用,個人是用freertos但有人想推其他,我說別的可能也不差,但TI,NXP,ST都內建freertos,不用重架,其他的要自己架還要除錯,那有那個美國時間。要是廠商可以自動生成我是可以考慮。我用rtos也是不非用不可,但有rtos我就可以去git上抓一堆函式回來用,不然要手寫功能太多,不如架一架RTOS貼別人的比較快。但對方不是很認同。
刪除工程是苦過來的沒有錯,但工程也是苦完了,就不用再做辛苦的工作。太多工程師可能對工程不理解吧!
>可能對工程不理解吧!
回覆刪除不是不理解,是做慣了苦工不相信更好的工具
1. 別人走過的路比你吃過的米多:一項技術要能一直用下去一定
需要時間與人力的驗證,人家做的功夫可以比你多
2. 什麼都想自己來的工程師性格:一個人的時間與腦力精力有限,
比不過一個團隊甚至一個公司的心血結晶;甚至在工作上,時間
人力金錢種種資源有限,你要讓別人替你抬轎,還是自己先從輪子
開始造呢?
3. 了解別人在做什麼,增加自己的學習機會
4. 下大環境時間就是金錢的觀念下,台灣企業在軟體研發的心力
與人力投入可能還不及對岸(雖然很刺耳,但這是真的,這也跟他們
官方投入在軟體有關係),你聽過XX園區要蓋的新聞可能還比有什麼
新產品揚名海外的機會要多
留一點牢騷
現市場賣1C有無市場
回覆刪除這時候留言,的確也提醒我一件事:
刪除文章裡說的:一毛多的ARM 算不算"沒有最便宜,只有更便宜 "?
---
因為現在真的出現美金一毛錢的 32 Bits 的 RISC-V MCU 了。
距離這篇文章才幾年?兩年而已。
當然 ST 今年也推出 stm32C0 系列MCU 力守低價MCU 市場。
我以前說過了:這都只是在壓縮更低階MCU 的市場機會而已。
就看各家如何接招吧。