国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32H7使用QSPI外擴(kuò)flash(linux下使用openocd操作)

這篇具有很好參考價(jià)值的文章主要介紹了STM32H7使用QSPI外擴(kuò)flash(linux下使用openocd操作)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

簡(jiǎn)介

根據(jù)安福萊的STM32H7教程,H7單片機(jī)的QSPI外設(shè)是直接連到芯片內(nèi)核上的,地址是0X90000000;那么就可以通過QSPI外設(shè),將外置flash內(nèi)存映射,并由此執(zhí)行代碼。

stm32 qspi flash,stm32,linux
相關(guān)操作在keil5上比較簡(jiǎn)單,配置點(diǎn)東西就行;可以參考安福萊教程。

這里要介紹的是在linux環(huán)境下沒有keil5 IDE的情況下,如何使用clion+openocd實(shí)現(xiàn)

  • 將大體積代碼下載到外置flash并執(zhí)行
  • 對(duì)外置flash執(zhí)行的代碼進(jìn)行仿真

代碼配置

修改系統(tǒng)配置文件

STM32的代碼都是有起始地址的,每一句代碼,編譯為相關(guān)機(jī)器碼執(zhí)行時(shí),都有對(duì)應(yīng)地址的;對(duì)于一般情況的代碼,起始地址都是0X8000000;

stm32 qspi flash,stm32,linux
該文件中詳細(xì)的配置了單片機(jī)所使用的flash大小,ram大小,地址等信息。

由于采用外置flash啟動(dòng),我們需要將flash地址配置為QSPI地址,并修改LENGTH為我們的flash芯片大小。

MEMORY
{
  FLASH (rx)     : ORIGIN = 0x90000000, LENGTH = 8192K
  DTCMRAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K
  RAM_D1 (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K
  RAM_D2 (xrw)   : ORIGIN = 0x30000000, LENGTH = 288K
  RAM_D3 (xrw)   : ORIGIN = 0x38000000, LENGTH = 64K
  ITCMRAM (xrw)  : ORIGIN = 0x00000000, LENGTH = 64K
}

修改系統(tǒng)初始化函數(shù)

STM32單片機(jī)啟動(dòng)時(shí)會(huì)先執(zhí)行匯編啟動(dòng)文件,先定義中斷向量表,再執(zhí)行復(fù)位,設(shè)置棧頂指針,再執(zhí)行系統(tǒng)初始化函數(shù),再跳轉(zhuǎn)main函數(shù)。

其中系統(tǒng)初始化函數(shù)中需要修改SCB->VTOR的值。
SCB->VTOR為Cortex內(nèi)核的中斷向量表的基地址,一般為程序執(zhí)行的初始地址。 #12AA9C
關(guān)于該變量理解,參考鏈接

這里需要修改為我們程序啟動(dòng)的地址0X90000000。
stm32 qspi flash,stm32,linux

編譯

點(diǎn)擊編譯,即可制作一個(gè)運(yùn)行在外部flash的代碼,下載到外置flash中,引導(dǎo)運(yùn)行即可。

那么現(xiàn)在出現(xiàn)兩個(gè)問題:

  • 如何下載到外置flash
  • 如何從外置flash中啟動(dòng)

代碼下載

使用CubeProgramer工具下載

使用ST提供的下載工具下載;
需要:

  • 對(duì)應(yīng)板子的下載算法文件
  • 燒錄器
  • 能夠運(yùn)行在外置flash的代碼

剛才已經(jīng)成功編譯了外置執(zhí)行代碼,燒錄器咱也有,而燒錄算法呢,推薦看安福萊的相關(guān)教程。
相關(guān)教程

使用Clion下載

這個(gè)是我主要想講的,在一個(gè)編輯器里完成編譯、下載、調(diào)試,嘿嘿

先解決下載問題。

我們知道,STM32下載代碼時(shí)會(huì)先執(zhí)行一個(gè)配置程序,該程序運(yùn)行在RAM中,會(huì)初始化部分關(guān)于下載代碼的外設(shè)。

使用keil5時(shí),我們會(huì)使用一個(gè).flm文件下載代碼,該文件就是下載引導(dǎo)程序,其制作流程安福萊里講的有。

stm32 qspi flash,stm32,linux

同樣,在正常下載的時(shí)候也會(huì)有一個(gè)keil5官方提供的.flm文件,這些文件就儲(chǔ)存在官方目錄里。

對(duì)于CubeMX而言,也有相應(yīng)的文件,

所以,我們使用的openocd工具也是有的,在我們的工程目錄里,有一些配置文件,都具有各自相應(yīng)的功能。

stm32 qspi flash,stm32,linux
在stm32h750b-disco.cfg文件中,初始化了芯片時(shí)鐘,和部分必要的下載外設(shè);

在19行、23行:跳轉(zhuǎn)到了其他配置文件中,執(zhí)行具體的操作

# enable stmqspi
if {![info exists QUADSPI]} {
	set QUADSPI 1
}

source [find target/stm32h7x.cfg]

reset_config srst_only

source [find board/stm32h7x_dual_qspi.cfg]

在這里,代碼定義了QUADSPI為1,即會(huì)在stm32h7x_dual_qspi.cfg中執(zhí)行該外設(shè)的初始化;

但是,這里該外設(shè)的初始化是以STM32官方出的板子的引腳定義的,不一定適合我們,而且實(shí)操下來,該文件改來改去效果不大,而且我覺得不建議跳到人家官方配置文件里修修改改,這里我們直接在該配置語句下面執(zhí)行我們板子的配置代碼;

# ART_Pi qspi.

# QUADSPI initialization
proc qspi_init {  } {
    global a
    mmw 0x580244E0 0x000007FF 0             ;# RCC_AHB4ENR |= GPIOAEN-GPIOKEN (enable clocks)
    mmw 0x580244D4 0x00004000 0             ;# RCC_AHB3ENR |= QSPIEN (enable clock)
    sleep 1                                 ;# Wait for clock startup

    # PF10:AF09:H, PF09:AF10:H, PF08:AF10:H, PF07:AF09:H, PF06:AF09:H, PG06:AF10:H

    # Port F: PF10:AF09:H, PF09:AF10:H, PF08:AF10:H, PF07:AF09:H, PF06:AF09:H
    mmw 0x58021400 0x002AA000 0x00155000    ;# MODER
    mmw 0x58021408 0x002AA000 0x00155000    ;# OSPEEDR
    mmw 0x5802140C 0x00000000 0x003FF000    ;# PUPDR
    mmw 0x58021420 0x99000000 0x66000000    ;# AFRL
    mmw 0x58021424 0x000009AA 0x00000655    ;# AFRH
    # Port G: PG06:AF10:H
    mmw 0x58021800 0x00002000 0x00001000    ;# MODER
    mmw 0x58021808 0x00002000 0x00001000    ;# OSPEEDR
    mmw 0x5802180C 0x00000000 0x00003000    ;# PUPDR
    mmw 0x58021820 0x0A000000 0x05000000    ;# AFRL

    # correct FSIZE is 0x16, however, this causes trouble when
    # reading the last bytes at end of bank in *memory mapped* mode

    # for single flash mode w25q64jv
                                            ;# 010101010000000000000 0 011000
    mww 0x52005000 0x05500018               ;# QUADSPI_CR: PRESCALER=5, APMS=1, FTHRES=1, FSEL=0, DFM=0, SSHIFT=1, TCEN=1
    mww 0x52005004 0x00160500               ;# QUADSPI_DCR: FSIZE=0x16, CSHT=0x05, CKMODE=0
                                            ;# FSIZE flash的大小。

    mww 0x52005030 0x00001000               ;# QUADSPI_LPTR: deactivate CS after 4096 clocks when FIFO is full
                                            ;# 11010000000000 10 010100000011
    mww 0x52005014 0x0D002503               ;# QUADSPI_CCR: FMODE=0x3, DMODE=0x1, DCYC=0x0, ADSIZE=0x2, ADMODE=0x1, IMODE=0x1
    mmw 0x52005000 0x00000001 0             ;# QUADSPI_CR: EN=1

    # Exit QPI mode
    #mmw 0x52005000 0x00000002 0            ;# QUADSPI_CR: ABORT=1
    #mww 0x52005014 0x000003F5              ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x0, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x3, INSTR=Exit QPI
    sleep 1

    # reset flash
    mmw 0x52005000 0x00000002 0             ;# QUADSPI_CR: ABORT=1
    mww 0x52005014 0x00000166               ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x0, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=0x66
    mww 0x52005014 0x00000199               ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x0, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=0x99

    # memory-mapped read mode with 3-byte addresses
    mmw 0x52005000 0x00000002 0             ;# QUADSPI_CR: ABORT=1
                                            ;# 11 11 0 00100 00 11 10 11 01 11101011
    mww 0x52005014 0x0F10EDEB               ;# QUADSPI_CCR: FMODE=0x3, DMODE=0x3, DCYC=0x4, ADSIZE=0x2, ADMODE=0x3, IMODE=0x1, INSTR=READ
    ;mww 0x52005014 0x0D002503
}

$_CHIPNAME.cpu0 configure -event reset-init {
    global QUADSPI

    mmw 0x52002000 0x00000004 0x0000000B    ;# FLASH_ACR: 4 WS for 192 MHZ HCLK

    mmw 0x58024400 0x00000001 0x00000018    ;# RCC_CR: HSIDIV=1, HSI on
    mmw 0x58024410 0x10000000 0xEE000007    ;# RCC_CFGR: MCO2=system, MCO2PRE=8, HSI as system clock
    mww 0x58024418 0x00000040               ;# RCC_D1CFGR: D1CPRE=1, D1PPRE=2, HPRE=1
    mww 0x5802441C 0x00000440               ;# RCC_D2CFGR: D2PPRE2=2, D2PPRE1=2
    mww 0x58024420 0x00000040               ;# RCC_D3CFGR: D3PPRE=2
    mww 0x58024428 0x00000040               ;# RCC_PPLCKSELR: DIVM3=0, DIVM2=0, DIVM1=4, PLLSRC=HSI
    mmw 0x5802442C 0x0001000C 0x00000002    ;# RCC_PLLCFGR: PLL1RGE=8MHz to 16MHz, PLL1VCOSEL=wide
    mww 0x58024430 0x01070217               ;# RCC_PLL1DIVR: 192 MHz: DIVR1=2, DIVQ=8, DIVP1=2, DIVN1=24
    mmw 0x58024400 0x01000000 0             ;# RCC_CR: PLL1ON=1
    sleep 1
    mmw 0x58024410 0x00000003 0             ;# RCC_CFGR: PLL1 as system clock
    sleep 1

    adapter speed 24000

    if { $QUADSPI } {
        qspi_init
    }
}

改代碼中主要就初始化了QSPI外設(shè)的GPIO,并配置了QSPI外設(shè),使用的板子是ART-Pi;

使用的GPIO是: PF10,PF09,PF08,PF07,PF06,PG06.

相關(guān)外設(shè)初始化主要時(shí)鐘匹配自己的芯片速度。

這里主要參考鏈接:

在CLion上實(shí)現(xiàn)STM32H750VBT6的Bootloader

使用openOCD擦寫ART_Pi外部qspi_flash

兩個(gè)教程都很全面,并且將代碼文件、配置文件都開源了,去點(diǎn)星星咯。

大家可以根據(jù)自己的板子的引腳定義進(jìn)行修改相關(guān)寄存器即可。

到這里,基本完成了配置,可以實(shí)現(xiàn)在clion中通過openocd實(shí)現(xiàn)向單片機(jī)外置flash下載代碼,并進(jìn)行仿真調(diào)試了。

從外置flash中啟動(dòng)代碼

不管上面如何下載代碼,都需要從外置flash啟動(dòng),前面也簡(jiǎn)略提到了——我們需要在單片機(jī)的內(nèi)置flash中下載一個(gè)bootloader代碼,用于從外置flash啟動(dòng)。

這個(gè)代碼比較簡(jiǎn)單,就初始化一點(diǎn)點(diǎn)外設(shè),主要還是QSPI,然后關(guān)閉Cache、MPU,對(duì)外置flash進(jìn)行內(nèi)存映射,并啟動(dòng)。具體內(nèi)容可以參考安福萊教程。

硬漢嵌入式的bootloader教程

我的是修改的反客科技的bootloader代碼,將其QSPI外設(shè)的引腳改成我的板子的就可以用了。是之前用keil5寫的,也可以自己用cubemx生成一個(gè),添加應(yīng)用代碼即可。比較簡(jiǎn)單。

適配ART-Pi的下載算法和bootloader

另外,從外置flash引導(dǎo)的代碼,受flash限制,運(yùn)行速度并不快,不如芯片內(nèi)部的flash,對(duì)此,我們參考安福萊教程,使用MPU配置外置flash內(nèi)存,用Cache預(yù)存取指令,提高代碼運(yùn)行速度。相關(guān)配置:
stm32 qspi flash,stm32,linux

  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x90000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_8MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

MPU配置代碼。

相關(guān)教程:

理論學(xué)習(xí),詳細(xì)好理解

硬漢哥的MPU教程

硬漢哥的實(shí)戰(zhàn)教程,超級(jí)好用

添加

在clion使用openocd仿真的話,為了查看各個(gè)寄存器的值,需要添加寄存器配置文件,一般keil5安裝目錄里有,我把我的上傳到Github上了,歡迎下載。

SVD文件

stm32 qspi flash,stm32,linux文章來源地址http://www.zghlxwxcb.cn/news/detail-792246.html

到了這里,關(guān)于STM32H7使用QSPI外擴(kuò)flash(linux下使用openocd操作)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • stm32h7中RTC的BCD模式與BIN模式

    stm32h7中RTC的BCD模式與BIN模式

    BCD(Binary-Coded Decimal)和BIN(Binary)是兩種不同的數(shù)字表示格式。 BCD格式: BCD是一種用二進(jìn)制編碼表示十進(jìn)制數(shù)字的格式。在BCD格式中,每個(gè)十進(jìn)制數(shù)位使用4位二進(jìn)制數(shù)來表示,范圍從0到9。例如,數(shù)字5在BCD格式中表示為0101,數(shù)字9表示為1001。這種編碼方式使得BCD數(shù)值的每

    2024年01月23日
    瀏覽(17)
  • STM32H7系列MCU的MPU和Cache功能介紹

    STM32H7系列MCU的MPU和Cache功能介紹

    參考資料 :PM0253 STM32F7 Series and STM32H7 Series Cortex?-M7 processor programming manualV5.0 1.1 MPU 的作用 防止不受信任的應(yīng)用程序訪問受保護(hù)的內(nèi)存區(qū)域; 防止用戶應(yīng)用程序破壞操作系統(tǒng)使用的數(shù)據(jù);通過阻止任務(wù)訪問其它任務(wù)的數(shù)據(jù)區(qū);允許將內(nèi)存區(qū)域定義為只讀,以便保護(hù)重要數(shù)據(jù);

    2024年02月01日
    瀏覽(16)
  • STM32 CubeMX 無法將 STM32H7 的最大 CPU 頻率設(shè)置為 480 MHz

    STM32 CubeMX 無法將 STM32H7 的最大 CPU 頻率設(shè)置為 480 MHz

    使用stm32cubemx設(shè)置時(shí)鐘樹為480MHz時(shí),提示 cpu clock frequency must be =200MHZ 對(duì)于STM32H7 需要CPU修訂版 為 V 才能達(dá)到 480 MHz 的最大頻率。 使用STM32Programmer查看芯片修訂版,確認(rèn)是V版本: 在STM32CubeMX PinConfiguration 界面修改RCC選項(xiàng),將Product Version設(shè)置為V: 此時(shí)時(shí)鐘樹界面已可以設(shè)置48

    2024年02月16日
    瀏覽(16)
  • STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

    STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

    通過cubemx配置 實(shí)現(xiàn)STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤 1.使用FAFTS文件操作系統(tǒng),實(shí)現(xiàn)STM32虛擬U盤,讀寫外部SD卡,fatfs和usb mass storage class共存。 2.請(qǐng)先完成上一個(gè)帖子的步驟 -- 跳轉(zhuǎn)https://blog.csdn.net/hjn0618/article/details/130383593 硬件平臺(tái):正點(diǎn)原子阿波羅 STM32H734IIT6 開發(fā)工具:

    2024年02月10日
    瀏覽(40)
  • STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    先了解一下AD7606,16位,單電源,200k采樣率,8路,除了貴沒有其他缺點(diǎn),數(shù)據(jù)相當(dāng)?shù)姆€(wěn),一個(gè)5V供電,不用運(yùn)放的情況下采集電壓精度可以達(dá)到1mv,非常Nice 與單片機(jī)相連 單片機(jī) 調(diào)用代碼 測(cè)試發(fā)現(xiàn)AD采集到的電壓要遠(yuǎn)小于實(shí)際電壓,H7的AD還是16位的,不能這么拉跨吧,在網(wǎng)上

    2024年02月11日
    瀏覽(25)
  • 【正點(diǎn)原子STM32】QSPI四線SPI模式(Quad-SPI存儲(chǔ)器、間接模式、狀態(tài)輪詢模式、內(nèi)存映射模式、命令序列、QSPI基本使用步驟、SPI FLASH基本使用步驟)

    【正點(diǎn)原子STM32】QSPI四線SPI模式(Quad-SPI存儲(chǔ)器、間接模式、狀態(tài)輪詢模式、內(nèi)存映射模式、命令序列、QSPI基本使用步驟、SPI FLASH基本使用步驟)

    一、QSPI介紹 1.1、QSPI功能框圖(雙閃存模式禁止) 1.2、QSPI 時(shí)鐘源 1.3、間接模式 1.4、內(nèi)存映射模式 1.5、命令序列(間接模式 或 內(nèi)存映射模式) 1.6、指令、地址、交替字節(jié)、空指令周期、數(shù)據(jù)各階段 1.7、QSPI FLASH設(shè)置 1.8、QSPI 中斷類型 二、QSPI相關(guān)寄存器介紹 三、QSPI相關(guān)

    2024年04月22日
    瀏覽(57)
  • 【STM32H7 開發(fā)筆記】| 02 - 通過定時(shí)器級(jí)聯(lián)方式同步啟動(dòng)多個(gè)定時(shí)器并輸出 PWM 波形

    【STM32H7 開發(fā)筆記】| 02 - 通過定時(shí)器級(jí)聯(lián)方式同步啟動(dòng)多個(gè)定時(shí)器并輸出 PWM 波形

    (STM32H723xE/G) 所有定時(shí)器包括 兩個(gè)高級(jí)控制定時(shí)器、十二個(gè)通用定時(shí)器、兩個(gè)基本定時(shí)器、五個(gè)低功耗定時(shí)器、兩個(gè)看門狗定時(shí)器和一個(gè)SysTick定時(shí)器 。所有計(jì)時(shí)器計(jì)數(shù)器都可以在Debug模式下凍結(jié)。 本次實(shí)驗(yàn)主頻配置的是500MHz 高級(jí)控制定時(shí)器(TIM1,TIM8)可以看作是在6通道

    2024年02月14日
    瀏覽(37)
  • STM32 使用HAL庫操作FLASH

    本文參考 :STM32CubeMX學(xué)習(xí)筆記(51)——讀寫內(nèi)部Flash - 簡(jiǎn)書 STM32F103C8T6 stmhalflash.h stmhalflash.c 使用示例

    2024年02月12日
    瀏覽(15)
  • 13.STM32F103C8使用PSRAM64H外擴(kuò)RAM空間

    13.STM32F103C8使用PSRAM64H外擴(kuò)RAM空間

    最近在調(diào)試STM32F103C8驅(qū)動(dòng)墨水屏的實(shí)驗(yàn),在使用過程中,需要使用大內(nèi)存的RAM需要,由于C8T6的RAM空間只有20KB,而墨水屏的需要的內(nèi)存為800*480*2/8=93.75KB。 在網(wǎng)上查了相關(guān)的方案,都是使用STM32F103ZE外擴(kuò)IS62WV51216這種并口SRAM的,使用IS62WV51216需要使用多引腳的STM32F103Zx系列,對(duì)于

    2024年02月15日
    瀏覽(24)
  • 【Clion+OpenOCD+Stm32CubeMX+gcc】linux交叉編譯開發(fā)stm32全過程

    【Clion+OpenOCD+Stm32CubeMX+gcc】linux交叉編譯開發(fā)stm32全過程

    雙系統(tǒng):ubuntu 22.04 電腦:拯救者Y7000 板子:stm32f103c8t6 一段摸爬滾打的辛酸史,囊括了我在過程中遇見的所有報(bào)錯(cuò)及解決方法! 記錄自己實(shí)現(xiàn)的步驟,過程已經(jīng)跟新完畢,筆者能力有限所用的方法以及代碼考慮的不一定全面,也希望大佬多多補(bǔ)充! 目錄 安裝stm32cubeIDE 官網(wǎng)下

    2024年02月22日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包