1. 程式人生 > >GD32 使用stm32 韌體庫

GD32 使用stm32 韌體庫

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配置之前,效果是一樣的。


相關推薦

GD32 使用stm32

1、 系統     1) 晶振起振區別     描述:啟動時間,GD32 與STM32 啟動時間都是2ms,實際上GD 的執行效率快,所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms,但是這個巨集定義值在GD 上時間就更

如何新建stm32工程

1、首先先新建一個工程資料夾,在它之下再新建7個資料夾 DOC用於存放程式說明檔案 Listing存放的是編譯器編譯時候產生的c/彙編/連結的列表清單 Output存放的是編譯產生的除錯資訊、hex檔案、預覽資訊、封裝庫等 Project用來存放工程 CMSIS

STM32F429 >> 3. STM32

CMSIS 標準中最主要的為 CMSIS 核心層,它包括了: 核心函式層:其中包含用於訪問核心暫存器的名稱、地址定義; 裝置外設訪問層:提供了片上的核外外設的地址和中斷定義。 庫目錄,檔案簡介 在STM32F4xx_DSP_StdPeriph_Lib_V

stm32替換過程中出現的問題

USE_STDPERIPH_DRIVER, STM32F10X_HD compiling stm32f10x_usart.c... .\CMSIS\stm32f10x.h(96): error:  #35: #error directive: "Please select first the target

STM32之GPIOx操作理解

   關於使用韌體庫操作GPIO管腳,在配置時,使用了這樣的語句: GPIOx->BRR = GPIO_Pin;   韌體庫相關原始碼: typedef struct {   __IO uint32_t CRL;   __IO uint32_t CRH;   __I

STM32 標準的下載,檔案介紹和工程的建立(綜合)

前言 博文基於ARM Cortex-M3核心的STM32F103ZET6晶片和標準3.5.0庫; 博文介紹標準庫中個資料夾的含義和以及一個簡單工程的建立; 如有不足之處還請博友多多指教; 標準庫的下

Linux下開發stm32(四) | 工程開發

st官方韌體庫是在暫存器操作之上的,但是使用暫存器操作的話,需要注意的地方很多,需要對照參考手冊一個一個賦值,稍有不慎便會出錯,所以韌體庫將外設的初始化封裝成初始化結構體,將外設的操作封裝在函式中,將暫存器賦值的操作都封裝起來,我們只需要呼叫API就可以,這樣一來既提高了開發效率,也減少了程

STM32F407VET6之IAR之ewarm7.80.4工程建立(基於官方1.6版本) 的工程檔案目錄

最後整理結構如下所示,├─cmsis│ startup_stm32f401xx.s│ startup_stm32f40xx.s│ startup_stm32f40_41xxx.s│ startup_stm32f410xx.s│ startup_stm32f411xe.s│ startup_stm32f427x

STM32F407VET6之IAR之ewarm7.80.4工程建立(基於官方1.6版本)

今天把stm32F407的工程之IAR建立完成了,特此記錄下。 下載官方韌體庫,STM32F4xx_DSP_StdPeriph_Lib_V1.6.1,V1.8.0版本的同理。新建以下幾個檔案 src放官方的各個c檔案 inc放官方的各個h檔案,以及使用者的h檔案,這樣可以方便在options裡只需要一個

FSMC_NORSRAMInit( )函式程式碼分析

相關結構體 typedef struct { uint32_t FSMC_Bank; //指定FSMC NOR/SRAM的儲存區 塊一的1~4區 uint32_t FSMC_DataAddressMux; //資料地址匯流排複用位設定

STM32F1xx微控制器使用時串列埠列印亂碼的解決辦法

有時STM32F1系列微控制器在配置完串列埠之後進行列印時,會出現列印亂碼的問題,此時有可能是以下幾種情況引起:1. 串列埠工具所選擇的波特率和微控制器設定的波特率不一致,請認真排查波特率問題;2. 串列埠的TX、RX管腳可能接觸或焊接不好,請排查硬體問題;3. 程式中使用的

ESP8266 01S 刷AT

       今天經歷了亂碼改變世界的想法,  刷完at韌體庫之後一直亂碼, 亂碼......   後來才發現是flash選錯了 廢話不多說, 直接來下韌體吧,先貼一張esp8266 01s的美圖 刷韌體時 ESP8266

STM8S GPIO設定問題

ST對STM8S系列都有提供韌體庫,而不同的版本自然存在一些不同,版本也一直從V1.0.0升級到目前的V1.1.1。 環境: FWLIB V1.0.1版本,採用STM8SF103 在使用GPIO庫時,一個偶然發現stm8s_gpio.h中的巨集定義是存在問題的。 程式碼定義

如何從ST網站找到STM32F103對應的

ST官方網站改版後,基本上很難搜尋到韌體庫的地址,找了半天才找到韌體庫的下載地址,通過此方法可以找到其他需要的資源,故記下來方便大家。 下載的網站地址為: Home>Tools and Software> Software> MCU Softwar

如何從ST官網上下載STM32F10x晶片

如何從ST官網上下載STM32F10x晶片韌體庫 步驟1:     首先進入ST官網,可以選中文。如圖1。選擇Products->Microcontroller.   步驟2:     選擇software,再點選STM32 EmbeddedSoftware

STM32網路遠端升級的IAP程式實現與解析 ---附親測穩定能用的程式

STM32網路遠端升級韌體的IAP程式實現與解析 ---附親測穩定能用的程式 http://www.openedv.com/thread-104667-1-1.html (出處: OpenEdv-開源電子網)  

STM32 IAP更新,bootloader起始地址偏移後,程式碼中還需設定中斷向量的偏移。

在 stm32f10x_flash.icf 中設定ROM的起始結束地址 /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08004000; /*-Memory Regions-*/ define symbo

聊聊從iOS提取系統符號

“民之失德,乾餱以愆;他山之石,可以攻玉。”- 《詩經》            當程式發生崩潰並有機會獲取到崩潰堆疊時,還原崩潰堆疊從而定位錯誤顯得非常重要。使用者符號的還原非常簡單,因為在打包

stm32的兩種下載模式:JTAG和SWD

一、JTAG模式 這種模式一般有10pin的、14pin的和20pin的,儘管引腳數和引腳的排列順序不同,但是其中有一些引腳是一樣的。值得注意的是,不同的IC公司會自己定義自家產品專屬的Jtag頭,來下載或除錯程式。 Test Clock Input (TCK) --

STM32 BootLoader升級

BootLoader 關於Bootloader,從書上的文字描述,很難理解這個名詞是什麼,有什麼用。這次用到了,算是有了更進一步的認識。 一、知識點 1、BootLoader就是微控制器啟動