(基于ARM的)微機擴展篇(1):STM32H743系統(tǒng)實現(xiàn)
0:Introduction
在你航儀器科學與光電工程學院的《微機原理與接口技術(shù)》課程中我們接觸了R710F芯片開發(fā)板,它的核心是ARM7TDMI,主頻最高48MHz.
在這里說個題外話,這個課的考試里面不會考你怎么用C語言或者匯編語言給ARM開發(fā)板編程,怎么打開板子的時鐘和外設(shè),也不會考你動手接線用硬件實現(xiàn)什么功能,至于那個實驗開發(fā)板,一言難盡,它上面甚至沒有SYSTICK定時器.考試有不少是概念和默寫,你甚至不需要編程實現(xiàn)把硬件SPI的數(shù)據(jù)通過DMA搬到內(nèi)存里面,你需要背下來DMA的概念,咣咣咣都寫出來就能得高分,但是鄙人的記憶能力過于有限,所以考試成績并不是很高.我的老師曾經(jīng)教過我,能用硬件就不要軟件,比如說能用硬件IIC和硬件SPI就不要用軟件模擬IIC和SPI;能用硬件定時器做PWM就不要用軟延時做PWM因為根本跑不準.能用中斷或者DMA的情況下要考慮用下,在對性能要求不高的地方才考慮用輪詢.至于STM32F103硬件IIC的缺陷(暫時先不討論)
還是在你航儀光的《儀光科技》課程中我們簡單了解了STM32芯片,用的STM32F103ZET6開發(fā)板,還有STM32F103C8T6最小系統(tǒng)板它們的核心是Cortex-M3,主頻可以達到72MHz.(在下個學期會用STM32F103ZET6搭智能小車,可能會更新之前的坑)
稍微新一些的是樹莓派PICO.它的RP2040芯片,雙核Cortex-M0+,主頻最高可達到133MHz.
OK,我們跳過STM32的F2系列,F3系列,F4系列,G4系列,F7系列,直接快進到STM32的最高級芯片,H7系列高性能處理器.STM32H743是一種Cortex-M7內(nèi)核的單片機,主頻可以達到400MHz,自帶浮點數(shù)單元和DSP指令,可以用硬件處理float型和double型浮點數(shù)(注意STM32F4的硬件浮點數(shù)單元只是對float型的,如果是double型還是軟件;STM32F1和樹莓派PICO只有沒有硬件浮點數(shù)單元,對float和double操作全部是軟件),性能比STM32F103啥的要好的多.使用STM32H743這個板子可以做更多高級的事情,比如下面這個視頻,播放破2000是我真的沒想到的.

1:Environment configuration
環(huán)境選擇Visual Studio 2022,需要安裝最新版VisualGDB,需要和(po)諧(jie),相關(guān)工具可以私信我.在VisualGDB中安裝軟件依賴包(包管理器,點上STM32軟件包,最好裝到D盤),在這里為了方便以后的DSP相關(guān)實驗我把DSP庫給帶上了,畢竟雙精度FPU是真的香,拖進去DSP庫以后大概長這個樣子.Header Files和Source Files里面有VisualGDB幫你配置好的HAL庫和啟動文件(在VisualGDB里面啟動文件是用C語言寫的,配合arm-none-eabi-gcc編譯器).Shared里面是我自己寫的一些驅(qū)動(硬件IIC,硬件SPI,OLED屏幕,SDIO,串口).在這個視頻中我們用到了FATFS讀寫SD卡,所以還需要FATFS.

2:FATFS and its?transplantation

FATFS是一組管理文件的API(個人理解) ,使用它后,在應用層就不用顧慮"硬盤"的硬件細節(jié),進行文件操作,這里所謂的"硬盤"可以是SD卡,FLASH芯片甚至是U盤.它的文件包括以下的內(nèi)容

ff.h和ff.c兩個文件是FATFS的核心,這塊不用動.
ffunicode.c是unicode支持文件,需要帶著.
ffsystem.c是fatfs使用的內(nèi)存管理和RTOS支持,我沒有用到,扔了.
diskio.h是FATFS操作硬件的接口函數(shù)原型聲明和相關(guān)類型的定義,帶上,基本上不要動.

參考正點原子的例程(寄存器方式輪詢,又長又容易出錯,如果理解不了就直接粘進去,也能用)
還有下面的CSDN專欄
大佬包裝了中斷版的SDIO和DMA版的SDIO讀寫函數(shù),直接粘到disk_read和disk_write里面,讀寫0號硬盤(SD卡,pdrv等于0)
再魔改下,砍掉動態(tài)內(nèi)存分配(正點原子他們都是用的自己的內(nèi)存管理程序malloc.c實現(xiàn)了mymalloc函數(shù)),通過分析FATFS里面的一個配置,在處理長文件名的時候可能需要用到堆區(qū)和動態(tài)內(nèi)存分配(而且只在這里用了),我們改這個參數(shù)把LFN功能給挪到BSS區(qū)(全局變量和靜態(tài)變量區(qū))或者棧區(qū)(單片機的棧一般不會開的很大.注意修改啟動文件,小心棧溢出)

3:Hardware driver
OLED驅(qū)動就用正點原子的例程改的,把他的軟件模擬SPI改成硬件SPI,可以直接用.
思路:寫一個初始化函數(shù)打開SPI,HAL會調(diào)用一個callback函數(shù)初始化SPI管腳,我們用硬件SPI1,就查手冊寫callback函數(shù),把相關(guān)管腳配置為SPI復用模式.寫函數(shù)oled_writebyte實現(xiàn)硬件SPI讀寫一個字節(jié)(正點原子等各種例程用的軟件模擬SPI,我們直接用硬件SPI做,先拉低CS引腳,然后根據(jù)要寫的是DATA還是CMD修改DC引腳,最后用HAL硬件SPI把一個字節(jié)發(fā)過去,個人感覺用輪詢夠用了,實在不行就去研究實現(xiàn)SPI的中斷收發(fā)或者DMA收發(fā)).
在函數(shù)外面開個全局的FATFS變量.上電初始化時鐘和delay功能,先初始化硬件,把0號盤掛到開好的FATFS變量上(調(diào)用f_mount函數(shù))主函數(shù)里面讀一個SD卡二進制文件(做好的OLED視頻文件)然后用while循環(huán),每次讀1KB(注意緩沖區(qū)數(shù)組開成全局的)如果出錯了或者文件讀完了就退出循環(huán),否則把這1KB數(shù)據(jù)調(diào)用OLED驅(qū)動函數(shù)顯示出來即可.
SDIO目前實現(xiàn)了中斷讀寫SD卡(DMA版本在VisualGDB里面編譯的程序似乎有些小bug)感謝CSDN的NoDistanceY大佬助我逃離例程的屎山:)