2020年11月25日 星期三

STM32_USB_DIY(五)--- 市場八卦(一) :沒有最便宜,只有更便宜

(發布三小時後更新...文章最尾端!) 

"沒有最便宜,只有更便宜...",自從以前我在搞那個八核心MCU 時,

我就已經發現這個市場定律一樣可以套用在我們高科技MCU 市場上,

你說台灣那個八位元OTP MCU 賣個 US$ 0.03 算甚麼?有時候不是便宜的問題,

就是難用啊,OTP 的MCU雖然可以用ICE 模擬開發系統,但是就是不方便啊。

尤其是現在這種系統高度整合開發時代裡,哪一個新一代的年輕工程師還搞這些?

就連我這種LKK 的工程師,看到那個東西,就二話不說:下一個...

因為隨著時代與市場發展,有些東西隨著網路發達,許多傳統的產品開發方式

也都跟以前大不同了,沒有人說哪個方法好,但重點還是在於"人"啊。

現在有很多MCU 的系統開發,人家套個網路豐沛的資源:遍地開放源的東西,

不用三兩下,那些很基礎的系統架構就可以馬上跑起來驗證了。

尤其當你看到那個 stm32 的網路資料,那些滿街滿谷的標準開放程式碼,

都得讓你不得不拿個他的平台來跑一下系統評估的可行性,(當然一樣的道理

也是可以套用在八位元的 Arduino 平台上啊。如果你公司的系統開發人員不多的話,

那你就更需要這些豐沛的網路資源來支持你。但這又偏偏又是一個市場趨勢潮流:

因為以我們台灣或東方公司的慣老闆的心態:只要一兩個人員可以搞定的事,

他就不會想幫你多找個幾個幫手的。所以啦,這些網路資源就顯得格外重要了

那你說:這個IC 或開發平台工具比較貴啊。有差嗎?至少這些也都還是一次性的

費用,(有時候對老闆來說:還可以拿來弄成硬體設備抵免稅金呢!),也總比雇用

工程師便宜許多了吧。(人真的比硬體設備還難搞啊。)

那你說:現在這些硬體的東西就真的比較貴嗎?還是標題:沒有最便宜,只有更便宜。

話說啊,最近客人提醒說:stm32 在市場有點缺貨,漲價了囉。

所以啦,我們這些搞系統的人,就得留意找找一些市場對策了。

其實我們也知道市場早就出現 stm32 的替代品了:有沒有發現有兩個比較奇怪的

MCU 型號:GD32 及MM32 ?


只是我們也沒有多留意就是了。但我們以前熟識的業務大人就非常熱情地幫我們

連絡這些可能的方案提供者。首先我們比較熟悉的是北京兆易的 GD32 系列。

是完全號稱與 stm32 Pin to pin 完全兼容,甚至還可以直接套用stm32 的標準程式庫,

朋友說:就連IC 內部的 ID 碼都是一樣的,二話不說馬上送我兩顆試用:


雖然 IC 上面的印刷沒有那麼清楚,但朋友說:在大陸已經很多用了,就連會碰到

甚麼奇怪的鳥問題,在大陸微博也有一缸子的文章讓你參考,呵~還是網路資源

充沛啊。果然是套我們一句話:站在巨人肩膀上,看世界果然是不同的。哈~哈~

據說:北京兆易在這一兩年也在台灣設立公司服務台灣市場了:


以上是今年九月份 DigiTimes 辦的微控制器論壇內容。這個論壇我也去當過演講者。

大家有沒有注意到:除了北京兆易之外還有一家大家比較陌生的公司:台灣靈動微電子。

會這樣子取公司名字的也大概就是大陸公司了。其實,我是後來才查到這份網路資訊的。

因為我以前公司的業務大人早就安排我去拜訪他們了:


這公司在台灣就在竹北的台元園區內,所以很方便,就可以直接殺過去實地的了解一下

相關的產品資訊:


看到沒有:人家也有提供 Low Pin count 的ARM MCU 方案,據"了解"(非正式官方)說:

他們準備出低於美金兩毛錢的 Flash Based ARM MCU。而且你看人家除了美美的產品選型

型錄之外,還有美美的開發工具,看起來是不是有點眼熟啊?他們說:其實當初 stm32 

也是找她們大陸技術團隊開發這些開發工具的。所以呢?是誰抄誰的?

那你說:一毛多的ARM 算不算"沒有最便宜,只有更便宜 "?你在型錄往後翻的話:


沒錯,竟然還有 SOP8 包裝的 ARM ,這個算是我第一次看到的。

不過,我對 OTP 的MCU 比較沒興趣,也就沒有多問一些相關訊息了。

據他們表示:現在 32 Bit ARM MCU 都已經進入 55 奈米,甚至 50 奈米的製程了。

難怪在市場價格能夠如此殺,只不過就看你們可不可以衝出市場銷售量,

但以我對大陸那一種高度愛國情操的市場規模來看,應該也不成問題,甚至他們

還有政府對於高新技術的政策補貼。

在GD32 的官方網站你是沒有看到任何工程程式庫的技術支援,因為有了 stm32 兼容之下

幹嘛還要自己搞程式庫碼呢?但MM32 就不一樣了,據他們的說法:他們還是對中國以外

的海外市場還是有一定的企圖心的,所以,也就不會那麼明目張膽了。哈~哈~

所以啦,我就很快的手上就拿到一套對應 stm32F1 系列的開發平台了:


不過,真的還蠻不好意思的是:我還沒時間把他架起來跑看看的。

就把這些產品資訊分享給各位了。等我有空玩玩看之後,再找個機會分享一些

技術心得給各位了。

----

小小的結語:其實這些產品資訊對我來說,會不會很爆炸性?不會,一點也都不意外。

反而我離開台元園區時,心情還特別愉悅,還特地騎著機車去竹北晃了一圈才回去,

以前早在我離開八核心MCU 團隊時,就已經了然於胸了,當你看到人家這些現成的

開發工具,包括:Keil 、IAR 或是GCC 這些平台的支持,你說:誰還在那邊搞IDE 或

是自己的組譯器呢?你產品為了低價競爭策略,你到底省錢省到哪裡了?到了今天

你還在找相關組譯器或IDE 平台的開發人員?或是說:當你的業務從市場上回來跟你

報告說:老闆啊,我們公司要不要也來搞搞 32 bits MCU 啊?人家客人都在問耶。

這是以前我們在IC 設計公司,常常被產品企劃 PM 或是業務屌我們的一句話,

明明手上現有的產品開發都還沒搞定,你老兄就一天到晚在老闆耳朵邊吹風...

靠~沒有人家標準好賣的東西,你就不會賣了嗎?

是啊,我自己也在市場跑過啊,人家業務大人講得也沒錯啊。客人就是喜歡拿這些

藉口跟你講,看你會不會降價啊。但我覺得降價是一回事,但真正市場問題還是

出在許多系統開發的支援問題。

現在有很多案子,都是很趕很急,又每一個案子所能投入的技術支援真的都很有限,

有很多很底層或很一般簡單基礎的東西,真的也不需要我們花太多心思與心力投入,

如果有一些外部現成的資源可以套用,的確也可以省了許多工作,

對我們這些資深老鳥工程師來說:尤其需要這些資源,因為我們也不喜歡再把

有限的歲月浪費在這些玩意兒身上了。

如果在回到市場趨勢來看:這幾年 32 bits MCU 風潮,我認為台灣許多老牌的

MCU 大小廠都有點錯失機會了,一來可能太固守那一種傳統思維,我就是便宜

用傳統八位元 OTP MCU 來拚價格。二來就是凡事都想靠自己搞,來凸顯自己技術的

優越感吧。你要他們先付一筆ARM IP 授權金來搞標準ARM MCU?你看他們

這些公司講多少年了?有哪一家真的把市場作起來呢?那你說:像X 唐算是比較

早布局的,但說真的,以我們這些資深工程師來說:市場就是兩極化,人家老闆

客人就是要指定國外大廠的東西,要不然就是像大陸那一種低價便宜又可以直接

套用的東西。(更何況我們私底下也知道 X 唐的工程師們也是來來去去的...)

這下子產品企劃 PM 或是業務又要回去再老闆耳朵邊吹風或是屌工程師了。

這一種辛酸無奈,人生走過一遍就好,我們都已經放手單飛了,

搞MCU 平台?就看事求人;還是人求事吧。

出門騎機車吹風去吧。享受一下今年暖冬在新竹陽光下的日子吧。

==========================================
(發布三小時後,更新...)

在我貼文不到三小時,朋友就傳了一份關於 北京兆易的 GD32F103 的技術資料給我,

我就把他貼在文章最後,其實這樣子類似的文章,只要透過 Google 大神,

你應該也可以找得到的,這一點我都不意外,當然我也不會特定去一直轉貼

這樣子的文章內容的。反正經過這麼多年了,等大家突然回過神時,才會發現:

原來人家 stm32 早已經橫掃市場,也更不用說:人家也沒啥顧忌的就直接照抄啊。

你又能怎麼辦?

套一句我在文章中一直轉貼的名言:天要下雨,娘要嫁人。你能怎麼辦?

所有的產品也都不是一天兩天的故事,如果當你決定你的公司或你的產品該如何

定位時,你本來就應該要想清楚的,在未來市場會有怎樣的發展,如果連這一點

你也一直搞不清楚,而你也不懂得該如何去面對時,那你又該如何帶領公司

的往前進呢?而你又如何期望你的員工為什麼不跟你一直打拼呢?

故事就如此,就是如此簡單易懂的!

以下內容純屬轉載,原出處在哪?我想就連IC 都是用仿的,有差嗎?

(關於以下有一點是關於 Flash 的說法,據小道消息指出:那個也不是甚麼兆易

偉大的專利,反正這一塊的東西也不是大家想得那麼美好,所以後來兆易就

升級更新為 GD32Exxx 系列,你自己就多留一下吧。)

------

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 寄存器的时候该位已经置1GD 的执行速度比较快,程序运行到这的时候该位还

        没置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) TIMADC 模块

       描述:TimerADC 模块的触发信号宽度要求。

       解决方法:由于内部有高速和低速两条外围总线,TimerADC 模块和其他外设共同使用这两个总线。

       GD32F103/101 系列Flash 128KB 及以下的型号,TimerADC 等模块识别触发信号的条件是触发信号

       宽度大于模块所在总线的时钟宽度。

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 56MHzAPB1 的最大分频系数为456/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配置之前,效果是一样的。

 

 




19 則留言:

  1. https://www.smslit.top/2018/10/10/vscode-pio-ide/
    另一個MCU開發工具的代表。它利用VS Code這個巨人editor,專心在多MCU共同開發平台發展。
    硬體為主的人無法理解統一平台的重要性。
    光是工程師每天有80%時間要看的editor介面,能用VS Code就大大加分,這個不流行才奇怪。

    回覆刪除
    回覆
    1. 謝謝你所提供的資訊。

      不過,這些林林種種的工程輔助工具對我們這些老人家,真的負擔太重了。

      我們也知道對許多老闆來說:他才不管你這些東西,怎麼把東西趕快搞定比較重要。

      才是他們所在意的事情。所以啦,有些工程上的東西,就只能在我們這些工程師之間

      流傳,拿出來跟老闆說:有時候,也只會自討沒趣,有時還有可能反過來給自己潑了一頭冷水。

      喔~除非有特殊情況,我現在比較少時間一天花個 80% 時間來看 Editor 的東西,

      年紀大了,這些東西看久了。傷身有傷眼睛,自己要懂得保養了。

      刪除
    2. 表達不良,重點歪了。我是說別人只要著重CLI的程式是不是可以用,再利用VS Code做為IDE的外型。一個很漂亮的工具就成型了。就變成了VS Code一鍵安裝編譯及除錯工具,同時支援多家MCU的IDE就出來了。
      不過若是MCU開發,老闆才不管用那個editor。以前用漢書,黑底白字看得舒服,到windows上就沒有這樣的環境,白底黑字看二個小時就開始累。直到VS Code又回到黑底,就算只做編寫,我還是離不開vs code,因為開其他程式就很偒眼。

      刪除
    3. 嗯,了解。

      以前我自己在寫那個多核心的IDE 時,也是從過去的習慣裡去建置整個IDE 開發環境,

      後來這幾年,慢慢地許多越來越方便的開發平台都在許多大廠的支持下,走向一統。

      所以對於擅長軟體開發平台的微軟,當然也不願意缺席啊。

      而在這些不管是軟體或是硬體架構的慢慢走向一統天下的情形下,

      對我們這些工程師來說:也是好事,也是壞事。

      好事的是:對不同的硬體平台轉換越來越沒啥包袱了。

      壞事的是:那這些開發工作就只剩下平淡無奇的固定循環工作而已吧。

      真的很難想像未來還有怎樣的開發工具與平台出現呢?

      或許那時候,我真的也不再撰寫任何韌體程式了吧。

      刪除
  2. 開發平台越長越像的同時,對工程師好事是進入障礙降低,換哪家都差不多,原廠都作好好的
    壞事反而是老闆也覺得換哪家MCU都差不多,就選最便宜的吧
    苦的還是工程師

    前輩曾經說過,便宜的IC不是人人都可以用的
    到有年紀之後,更是有感,
    有的職業越老越值錢,工程師則是越老越不值錢,眼睛衰退就是不可抗力

    回覆刪除
    回覆
    1. 前公司就有類似的案例,一個MCU是1998年出的,現在還在出產品。電子及軟體都建議要換MCU,但提出來的時程很長大約要一年,老闆不同意,老闆認為換MCU無法增加收入還要額外支出是不值得的。去年我有提出可以同時換MCU及軟體轉換,還是不准。後來我一離開不久,同事就說收入停產通知,現在為了換MCU弄得很緊急。緊急趕出來的一定不會是好品質。我只能說老闆格局如此,我也幫不了。

      刪除
    2. 當然隨著時代進步,有很多事情都值得我們有空時就得要面對與思考的。

      這不只是老闆而已,就連我們這些領薪水的工程師也是要做的一個重要課題。

      因為這不是你或老闆要不要改變的問題,而是真的環境與競爭都在改變的。

      所以許多先進技術不是你要不要學或了解,因為這就是一個趨勢與潮流。

      當然也不是叫你馬上見異思遷,而是真的需要你從各方面思考、與權衡輕重的。

      這些都不是因為你不是老闆,就不用想,因為誠如各位許多經驗,當沒有認真思考的

      老闆,對你來說也是風險。天下沒有幾家公司是真正的幸福企業啦。

      所以啦,只有你比老闆的格局更高,更遠大,這樣子才能做到無欲則剛,

      對你來說:是你在挑老闆,而不適老闆在挑你的。

      刪除
    3. 其實對於一個成熟又賣了N年的產品,換MCU 平台,包括:電子硬體與軟體。

      花一年時間轉換,這很正常啊。因為所牽涉的零件重新選用、電路修改驗證,

      再加上軟體效能平台轉換...當然還牽涉到後段生產備料,一年本來就是合理啊。

      更糟糕的是:如果你早幾年換,或早一點決定,搞不好都已經順利完成了。

      一年拖過一年,人的惰性,會讓你這些原本簡單容易的事情,會越搞越複雜。

      就像你說的,當老闆聽不進去,就會牽涉到人性信任與管理問題。

      我說了:大家都是領薪水的,有差嗎?最後倒楣的是誰?當然還是老闆或企業的形象啊。

      所以你說的沒錯:人的格局到哪?結局就是到哪!

      天下會變成這樣子,不是沒有道理的啦。

      刪除
    4. 不要說一般小公司拖著不換.
      台灣幾個世界有名的大廠, 用著已經被併購再併購再併購再再併購的MCU, 也是拖阿.

      不過對於小小員工來說, 都沒差啦.

      刪除
    5. 我所知道的大公司,產品很多,所以它們真的不是很在乎。小公司不同,因為庫存壓力大,都是共用料多,包括MCU。缺料要是主料件,只能說是全公司動員。以前則是六日加班趕,真的是沒日夜。現在勞基法改了六日不能加班,老闆心態依舊。研發不可能像以前一樣幾個月出來,真的有可能斷貨,今年更糟,說斷就斷。斷了公司一定放無薪假,研發仍在跑,就看老闆口袋的深度了。
      小小員工是沒差,就反應不同代的想法。我知道新世代確實比較不在乎公司存亡。因為成長的環境不一樣了。

      刪除
  3. 最近我參加的一個社團在玩RISC-V。一群人還想在上面寫組譯器。人家RISC-V是因為免費C才起來的,又倒走回去? 只能說寫了一輩子的組語,看到每一個CPU都是組語的好世界。這個世界不一樣了,不能再怪年青人不學組語,反面是自己不前進還在怪年青人不長進。

    回覆刪除
    回覆
    1. 年底到了,趕手上的案子,真的比較少上部落格好好地寫寫東西。

      關於 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 好好地交換一下工作經驗心得了吧。

      離開總是有些理由或想法,但再回頭,也可能也是有一些理由或想法,

      但可以不斷的交替著這些理由或想法,到底是以技術發展觀點來看的呢?

      還是都是技術發展以外的觀點來考量的呢?

      所以說啦,工程師有時候真的就不要太拘泥於本身的技術堅持了吧。

      我們沒有那麼偉大的可以創造甚麼話題,因為就連我們在工作上也都未必有那麼大的影響力啊。

      你說:是不是啊?

      年底了。祝福大家新年愉快,未來一年鴻圖大展,當然最重要的還是身體健康啊。

      加油。

      刪除
    2. 第一次離開是因為薪水沒跟上。又回去是因為我已經可以設計下一代機器。二公司都一樣,我提出二代機,結果都是冰起來,冰久了也只能離開。中國人政治太嚴重,只能一次升0.1代,你要是大躍進,人的問題遠大於技術問題。這次只能去更遠的技術領域了。

      刪除
    3. RISC-V我是沒那個屁股玩了,我不具備那樣的智力跟體力...更重要的是可以拿來賭的青春歲月已經消磨得差不多了,我現在比較認分一點,玩一些尚能掌握的東西如Linux,可大可小自娛娛人

      刪除
    4. @Goodspeed 果然已經有老人家的那一種自知之明了。

      孔老夫子說:及其老矣,戒之在得。...就是告訴我們:年紀大了,不要再想太多了啦。

      至於晶心的 RISC-V ,其實他們也有找我兒子去面試...但幾個同學約一約,就都沒去了。

      現在呢?幾個同學在別家公司都上班上得很愉快,每逢周末假日就相約出去玩。

      是啊~RISC-V 可能有它的未來,但我們都還是平凡人,你們要怎麼對市場產生影響力?

      甚至要翻盤,真的要好好的想想吧。絕大部分的人還是喜歡以逸待勞的觀望吧。

      刪除
    5. 也不算是以逸待勞,只是要認清主流。未來的路比較多。就上次我在FB和別人討論RTOS的使用,個人是用freertos但有人想推其他,我說別的可能也不差,但TI,NXP,ST都內建freertos,不用重架,其他的要自己架還要除錯,那有那個美國時間。要是廠商可以自動生成我是可以考慮。我用rtos也是不非用不可,但有rtos我就可以去git上抓一堆函式回來用,不然要手寫功能太多,不如架一架RTOS貼別人的比較快。但對方不是很認同。
      工程是苦過來的沒有錯,但工程也是苦完了,就不用再做辛苦的工作。太多工程師可能對工程不理解吧!

      刪除
  4. >可能對工程不理解吧!
    不是不理解,是做慣了苦工不相信更好的工具

    1. 別人走過的路比你吃過的米多:一項技術要能一直用下去一定
    需要時間與人力的驗證,人家做的功夫可以比你多

    2. 什麼都想自己來的工程師性格:一個人的時間與腦力精力有限,
    比不過一個團隊甚至一個公司的心血結晶;甚至在工作上,時間
    人力金錢種種資源有限,你要讓別人替你抬轎,還是自己先從輪子
    開始造呢?

    3. 了解別人在做什麼,增加自己的學習機會

    4. 下大環境時間就是金錢的觀念下,台灣企業在軟體研發的心力
    與人力投入可能還不及對岸(雖然很刺耳,但這是真的,這也跟他們
    官方投入在軟體有關係),你聽過XX園區要蓋的新聞可能還比有什麼
    新產品揚名海外的機會要多

    留一點牢騷

    回覆刪除
  5. 現市場賣1C有無市場

    回覆刪除
    回覆
    1. 這時候留言,的確也提醒我一件事:
      文章裡說的:一毛多的ARM 算不算"沒有最便宜,只有更便宜 "?
      ---
      因為現在真的出現美金一毛錢的 32 Bits 的 RISC-V MCU 了。
      距離這篇文章才幾年?兩年而已。
      當然 ST 今年也推出 stm32C0 系列MCU 力守低價MCU 市場。
      我以前說過了:這都只是在壓縮更低階MCU 的市場機會而已。
      就看各家如何接招吧。

      刪除