由于STM32H743漲價(jià)到300元以上,項(xiàng)目換用了Pin2Pin替換的STM32H723,看上去cpu運(yùn)行速度快了20%達(dá)到550Mhz。 但是內(nèi)存布局存在很大不一樣,而且ST官方代碼庫升級(jí)迭代快,要手動(dòng)修改地方每個(gè)版本不一樣,在有H743的經(jīng)驗(yàn)下,花了2天時(shí)間搞好了記錄一下。很多信息來源于英文ST支持論壇才搞定。
1.預(yù)備知識(shí)
-
熟悉H7系列都知道,以太網(wǎng),DMA等設(shè)備,無法訪問0x20000000,也就是TCM區(qū)的地址。為了讓我們代碼使用DMA搬運(yùn)數(shù)據(jù),整個(gè)代碼的變量可以放在RAM D1區(qū)域,或者叫AXI區(qū)域,就要在.ld腳本中定義.data段,.bss段到 0x24000000. 這一塊我們有320KB可以用。
-
而DTCM(0x20000000)的128K由于不能DMA訪問,但是速度又很快,我們可以用于存放圖像數(shù)據(jù),高速ADC緩存數(shù)據(jù),或者把定義RAMCode函數(shù)。
-
而涉及到ETH,以及Lwip 的收發(fā)緩存相關(guān)的地址,把他們定義到D2區(qū)域的固定地址。這樣就可以使用MPU設(shè)置Cache規(guī)則,讓CPU拿到正確的數(shù)據(jù)。
2.準(zhǔn)備工作
有了以上2點(diǎn)準(zhǔn)備,還要注意,如果使用的是CubeMXIDE 1.9.0 , FW庫 1.9.0 以下的版本。 由于芯片比較新,ST官方仍然在進(jìn)行迭代,最好進(jìn)行升級(jí),否則生成代碼后仍然是不工作,不好查問題?,F(xiàn)在是2022-12月, 下面基于1.11.0版本。
軟件自動(dòng)下載的固件庫也是同樣:STM32Cube_FW_H7_V1.11.0
調(diào)試過程中看了2個(gè)參考文章:
https://community.st.com/s/article/How-to-create-project-for-STM32H7-with-Ethernet-and-LwIP-stack-working
(其中提到到多處H723系列的特殊內(nèi)存地址的問題,這個(gè)很關(guān)鍵)
https://blog.csdn.net/Motseturtle/article/details/126165780
(基本步驟有參考意義,但這個(gè)CSDN博文有一處內(nèi)存地址0x3007ffff沒寫對(duì)是超范圍的。另外幾個(gè)步驟不適用于最新的1.11.0版本)
下面是具體生成步驟:
- 選擇芯片
- 如果本機(jī)沒有H7固件庫會(huì)下載。1G,大概2分鐘左右。
3.配置基本時(shí)鐘外設(shè)
配置RCC,開啟外置晶振,以太網(wǎng)不適合使用內(nèi)置晶振。開啟內(nèi)置LDO,設(shè)置0檔,這樣支持芯片內(nèi)核跑到500Mhz以上。
進(jìn)入Clock Configuration, 自動(dòng)求解時(shí)鐘配置。一般硬件上是 16Mhz 或者 25Mhz無源晶振。按自己板子輸入。路徑選擇圓點(diǎn)也要點(diǎn)上, 主頻最高可以跑550Mhz。自動(dòng)求解后,沒有出現(xiàn)紅色部分即可。
4.配置FreeRTOS
接下來準(zhǔn)備配置 FreeRTOS。
把SYS內(nèi)選擇一個(gè)沒用到的計(jì)時(shí)器。 用于HAL時(shí)鐘,如自帶的Delay,HAL API內(nèi)超時(shí)等。
而原本的Systick要被RTOS占用,用于操作系統(tǒng)時(shí)鐘節(jié)拍,上下文切換。
在中間件選項(xiàng),打開Freertos,接口選擇“CMSIS_V1”,這樣代碼體積小一些。功能是一樣。
把默認(rèn)任務(wù)的堆棧從128改為512以上,因?yàn)槟J(rèn)任務(wù)內(nèi)有比較大的 LWIP 初始化。默認(rèn)的128太小會(huì)導(dǎo)致初始化會(huì)Hardfault。 一般1024可以很夠用了。
5.配置 Ethernet + Lwip
我用的LAN8742 / LAN8720(平替), 價(jià)格高一點(diǎn),但是好處是可以代碼全兼容不加額外PHY代碼。組要要改的是 ETH涉及的GPIO要手動(dòng)改為VeryHigh模式。默認(rèn)是Low,是會(huì)導(dǎo)致PHY通信失敗。
打開ETH全局中斷
當(dāng)使用CubeMXIDE時(shí),是使用Gcc編譯器, TX/RX Descriptor的內(nèi)存地址由 *.LD鏈接腳本決定。這里可以不設(shè)置,但也可以設(shè)置一下。
TX/RX Descriptor 是給dma用的, 里面包括了 內(nèi)存搬運(yùn)的起始地址 結(jié)束地址 什么的,dma 分析這個(gè)結(jié)構(gòu)體完成數(shù)據(jù)傳輸。所以這部分要單獨(dú)存儲(chǔ),并且用MPU保護(hù)防止Cache引起的數(shù)據(jù)不一致。
接下來配置 LWIP
由于我要固定IP地址,把DHCP設(shè)為Disbale,下面輸入固定IP的信息。
由于 STM32H723 / STM32H733 的 D2 RAM 是0x3000000開始,它的頭16K用于ETH的DMA,后16K可以用于LWIP堆棧。默認(rèn)的值0x30044000是適用于H743系列等,這里一定要改對(duì),否則LWIP開機(jī)內(nèi)存初始化函數(shù)會(huì)訪問0x30044000(不存在于H723)會(huì)導(dǎo)致HardFault。
PHY就選一下,而且只有一種選項(xiàng)。 如果要改為DP83848或者RTL8201 低成本PHY可以參考其他文章,就是代碼內(nèi)PHY相關(guān)寄存器和地址改一下。
LWIP其余選項(xiàng)默認(rèn)就行。
6.配置MPU
關(guān)于H7的MPU和Cache 可以看這個(gè)文章有了解
番外篇:STM32H7的Cache和MPU以及內(nèi)存分配問題
H7主頻工作在400MHz-550Mhz,除了ITCM DTCM 和Cache以滿速度工作,其它AXI SRAM,SRAM1-4等都是以200MHz工作。數(shù)據(jù)緩存D-Cache就是解決CPU加速訪問SRAM。
而以太網(wǎng)數(shù)據(jù)由于數(shù)據(jù)流量大,會(huì)被快速更新。被D-Cache緩存后已經(jīng)是面目全非,所以我們使用MPU關(guān)閉以太網(wǎng)用的相關(guān)內(nèi)存區(qū)域的Cache訪問權(quán),一旦Cache失效,CPU就老實(shí)去真實(shí)地址拿數(shù)據(jù)。這部分?jǐn)?shù)據(jù)會(huì)慢一點(diǎn),但是由于不是CPU自己生成的,來源于外部所以只能這樣。
第一部分,把32K整個(gè) D2區(qū)的SRAM 1 /2 處理為L(zhǎng)evel 1,關(guān)閉所有Cache行為。
第二部分,把頭256B,也就是DMA描述符部分配置為L(zhǎng)evel 0。具體這里不展開。
可以參考:
STM32H743+CubeMX-梳理MPU的設(shè)置
7.配置LD腳本
根據(jù)ST支持論壇,1.11.0 版本的以太網(wǎng)驅(qū)動(dòng)經(jīng)過重構(gòu)要手動(dòng)加上一塊代碼,讓我們能夠指定RX_buff區(qū)域。打開 LWIP\Target\ethernetif.c, #120行附近
實(shí)現(xiàn) memp_memory_RX_POOL_base 數(shù)組由.Rx_PoolSection段指定地址
/* USER CODE BEGIN 2 */
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma location = 0x30000400
extern u8_t memp_memory_RX_POOL_base[];
#elif defined ( __CC_ARM ) /* MDK ARM Compiler */
__attribute__((at(0x30000400)) extern u8_t memp_memory_RX_POOL_base[];
#elif defined ( __GNUC__ ) /* GNU Compiler */
__attribute__((section(".Rx_PoolSection"))) extern u8_t memp_memory_RX_POOL_base[];
#endif
/* USER CODE END 2 */
在LD腳本 STM32H723VETX_FLASH.ld 下部添加:
.lwip_sec (NOLOAD) : {
. = ABSOLUTE(0x30000000);
*(.RxDecripSection)
. = ABSOLUTE(0x30000200);
*(.TxDecripSection)
. = ABSOLUTE(0x30000400);
*(.Rx_PoolSection)
} >RAM_D2 AT> FLASH
到此配置結(jié)束,測(cè)試 Ping文章來源:http://www.zghlxwxcb.cn/news/detail-417079.html
后記: 測(cè)試發(fā)現(xiàn),UDP接受超過1180字節(jié)后,LWIP協(xié)議棧停止工作,無法ping通收發(fā)數(shù)據(jù)。排查后發(fā)現(xiàn)是LWIP的TX堆棧位置(下圖是設(shè)置為0x30004000)有問題,因?yàn)镽AM2 的32K已經(jīng)被ETH DMA用完了。改為0x2404B000,占用320K的RAM D1的末尾20KB就行了。同時(shí)在LD腳本把RAM D1 改小一點(diǎn),改為300K,防止編譯器占用我們需要的20K。
LD腳本把RAM D1 改小一點(diǎn),改為300K,防止編譯器占用我們需要的20K。
LD腳本把RAM D1 改小一點(diǎn),改為300K,防止編譯器占用最后20K。文章來源地址http://www.zghlxwxcb.cn/news/detail-417079.html
到了這里,關(guān)于STM32H723配置以太網(wǎng)+Freertos注意事項(xiàng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!