; -------------------------------------------------------------------------------- ; @Title: STM32H747 QuadSPI FLASH Programming Script ; @Description: ; Twin Serial FLASH(MT25Q512, Micron)x2 are connected the QUADSPI interface ; ; Script arguments: ; DO stm32h747-qspi [PREPAREONLY] [DUALPORT=0|1] ; ; PREPAREONLY only declares flash but does not execute flash programming ; ; DUALPORT=0|1 default value is 0 (disabled). ; ; Example: ; ; DO ~~/demo/arm/flash/stm32h747-qspi PREPAREONLY DUALPORT=1 ; ; QSPI_BK1_NCS: PG6, ALT10 ; QSPI_CLK : PB2, ALT9 ; QSPI_BK1_IO0: PD11, ALT9 ; QSPI_BK1_IO1: PF9, ALT10 ; QSPI_BK1_IO2: PF7, ALT9 ; QSPI_BK1_IO3: PF6, ALT9 ; QSPI_BK2_IO0: PH2, ALT9 ; QSPI_BK2_IO1: PH3, ALT9 ; QSPI_BK2_IO2: PG9, ALT9 ; QSPI_BK2_IO3: PG14, ALT9 ; ; SRAM: 0x24000000 ; QUADSPI Addr: 0x52005000 ; ; @Author: JIM ; @Board: STM32H7-DK Discovery Kit ; @Chip: STM32H7* ; @Keywords: Cortex-M7, STM32, SPI,QSPI ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: stm32h747-qspi.cmm 11733 2023-01-16 08:55:12Z bschroefel $ &DUALFLASH=1 ;dual flash memories &QSPI_BASE=0x52005000 ;QuadSPI Controller &OSPI_AHB=0x90000000 ;QuadSPI_AHB (memory mapped) PRIVATE ¶meters ENTRY %LINE ¶meters PRIVATE ¶m_prepareonly ¶m_cpu ¶m_dualport ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0") ; -------------------------------------------------------------------------------- ; initialize and start the debugger RESet SYStem.RESet SYStem.CPU STM32H747XI-CM7 SYStem.CONFIG.DEBUGPORTTYPE SWD IF hardware.COMBIPROBE()||hardware.UTRACE() ( SYStem.CONFIG.CONNECTOR MIPI20T ) SYStem.Option DUALPORT ON SYStem.MemAccess DAP SYStem.JtagClock CTCK 10MHz Trace.DISable ETM.OFF SYStem.Up GOSUB RCC_Init GOSUB GPIO_PIN_MUX GOSUB Init_QSPI //EXIT QUAD INPUT/OUTPUT MODE, to make the single spi mode GOSUB WRITEBYTE_QPI 0xF5 GOSUB READ_ID_TEST //switch QSPI to the memory mapped mode Data.Set A:&QSPI_BASE %Long (Data.Long(A:&QSPI_BASE)&~0x1) ;disable Data.Set A:&QSPI_BASE+0x14 %Long 0x0F20356B ; FMODE, READ cmd(0x6B,1-1-4), ADSize 32b ;Data.Set A:&QSPI_BASE+0x14 %Long 0x0F203DEB ; FMODE, READ cmd(0xEB,1-4-4), ADSize 32b ;Data.Set A:&QSPI_BASE+0x14 %Long 0x0D003513 ; FMODE, READ cmd(0x13,1-1-1), ADSize 32b and so on... ;Data.Set A:&QSPI_BASE+0x14 %Long 0x0D002503 ; FMODE, READ cmd(0x03,1-1-1), ADSize 24b and so on... Data.Set A:&QSPI_BASE %Long (Data.Long(A:&QSPI_BASE)|0x1) ;enable ; ------------------------------------------------------------------------------ ; Flash declaration GOSUB FlashDeclaration "¶m_dualport" ; Flash script ends here if called with parameter PREPAREONLY IF ¶m_prepareonly ENDDO PREPAREDONE ; ------------------------------------------------------------------------------- ; Flash programming example DIALOG.YESNO "Program flash memory?" LOCAL &progflash ENTRY &progflash IF &progflash ( FLASH.ReProgram.ALL Data.LOAD.auto * FLASH.ReProgram.off ; Reset device SYStem.Down SYStem.Up ) ENDDO READ_ID_TEST: ( &QSPI_FCR=&QSPI_BASE+0xC &QSPI_CCR=&QSPI_BASE+0x14 &QSPI_DLR=&QSPI_BASE+0x10 &QSPI_DR=&QSPI_BASE+0x20 Data.Set A:&QSPI_FCR %LE %Long 0x1F ;clear status // 1 instruction , 4 read data Data.Set A:&QSPI_DLR %Long 0x3 ; 4byte data read &ccr=0x19F ; imode with insturction 1byte instruction write &ccr=&ccr|(0x1<<24.) ; dmode single &ccr=&ccr|(0x1<<26.) ; indirect read mode Data.Set A:&QSPI_CCR %LE %Long &ccr &read_data=Data.Long(A:&QSPI_DR) ;read little endian IF &DUALFLASH==1 ( PRINT "Dual flash memory ..." PRINT "1st 0x" &read_data&0xFF " (1st flash Manufacture)" PRINT "2nd 0x" (&read_data>>8.)&0xFF " (2nd flash Manufacture)" PRINT "3rd 0x" (&read_data>>16.)&0xFF " (1st flash Device ID)" PRINT "4th 0x" (&read_data>>24.)&0xFF " (2nd flash Device ID)" ) ELSE ( PRINT "1st 0x" &read_data&0xFF " (Manufacturer)" PRINT "2nd 0x" (&read_data>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (&read_data>>16.)&0xFF PRINT "4th 0x" (&read_data>>24.)&0xFF ) RETURN ) WRITEBYTE_QPI: ( ENTRY &wdata SCREEN.OFF Data.Set A:(&QSPI_BASE+0xC) %LE %Long 0x1F ;clear status &ccr=(0x3<<8)|&wdata ; imode with insturction 1byte instruction write Data.Set A:(&QSPI_BASE+0x14) %LE %Long &ccr SCREEN.ON RETURN ) RCC_Init: ( &BASE=0x58024400 Data.Set ASD:&BASE+0xE0 %Long 0x100807FF ; RCC_AHB4ENR for GPIO Data.Set ASD:&BASE+0x140 %Long 0x100807FF ; RCC_C1_AHB4ENR Data.Set ASD:&BASE+0x4C %Long 0x0 ; RCC_D1CCIPR for QSPI Data.Set ASD:&BASE+0x7C %Long 0x0 ; RCC_AHB3RSTR Data.Set ASD:&BASE+0x0D4 %LE %Long 0x00005000 ;RCC_AHB3ENR for QSPI Data.Set ASD:&BASE+0x134 %LE %Long 0x00005000 ;RCC_C1_AHB3ENR Data.Set ASD:&BASE+0x194 %LE %Long 0x00000000 ;RCC_C2_AHB3ENR Data.Set ASD:&BASE+0x1FC %LE %Long 0xF0015131 ;RCC_AHB3LPENR for QSPI Data.Set ASD:&BASE+0x15C %Long 0xF0015131 ; RCC_C1_AHB3LPENR Data.Set ASD:&BASE+0x1BC %Long 0xF0015131 ; RCC_C2_AHB3LPENR RETURN ) GPIO_PIN_MUX: ( ;PB Data.Set ASD:0x58020400 %Long 0xFAAFFAAA Data.Set ASD:0x58020408 %Long 0x0FF00CFF Data.Set ASD:0x58020420 %Long 0x00A009AA Data.Set ASD:0x58020424 %Long 0x00AAAA00 ;PD Data.Set ASD:0x58020C00 %Long 0xAAAAFFEA Data.Set ASD:0x58020C08 %Long 0xFFFF003F Data.Set ASD:0x58020C20 %Long 0x00000CCC Data.Set ASD:0x58020C24 %Long 0xCC449CCC ;PF Data.Set ASD:0x58021400 %Long 0xAABBAAAA Data.Set ASD:0x58021408 %Long 0xFFCCFFFF Data.Set ASD:0x58021420 %Long 0x99CCCCCC Data.Set ASD:0x58021424 %Long 0xCCCCC0A0 ;PG Data.Set ASD:0x58021800 %Long 0xAFFAEA6A Data.Set ASD:0x58021808 %Long 0xF00F3FFF Data.Set ASD:0x58021820 %Long 0x0ACC0CCC Data.Set ASD:0x58021824 %Long 0xC900009C ;PH Data.Set ASD:0x58021C00 %Long 0xAAAAAAAF Data.Set ASD:0x58021C08 %Long 0xFFFFFFF0 Data.Set ASD:0x58021C20 %Long 0xCCCA9900 Data.Set ASD:0x58021C24 %Long 0xCCCCCCCC RETURN ) Init_QSPI: ( Data.Set A:&QSPI_BASE+0x0000 %Long 0x02000311 ; QUADSPI_CR, QUADSPI control register, enable clk and prescaler Data.Set A:&QSPI_BASE+0x0004 %Long 0x00190100 ; QUADSPI_DCR, flash size 2^26 (64MBytes), 0x00170100==16Mbytes IF &DUALFLASH==1 ( Data.Set A:&QSPI_BASE %Long Data.Long(A:&QSPI_BASE)|0x40 ;DFM enable Data.Set A:&QSPI_BASE+0x0004 %Long 0x001A0100 ; QUADSPI_DCR, flash size 2^27 (128MBytes) ) Data.Set A:&QSPI_BASE+0x000C %Long 0xFF ; QUADSPI_FCR, QUADSPI flag clear register RETURN ) ; Flash declaration FlashDeclaration: ( PRIVATE &FlashSize &FlashDriver &FlashBaseAddr PARAMETERS &DualPort &FlashDriver="snor_stm32h7.bin" &FlashBaseAddr=0x90000000 ;SPI AHB base address &FlashSize=0x400000 ;4Mbytes &FlashBlockSize=0x10000 IF &DUALFLASH==1 ( &FlashSize=0x8000000 &FlashBlockSize=0x20000 ) FLASH.Create 2. &FlashBaseAddr++(&FlashSize-0x1) &FlashBlockSize TARGET2 Byte IF "&DualPort"=="0" FLASH.TARGET2 0x20000000 0x20002000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver ELSE FLASH.TARGET2 0x20000000 EAHB:0x20002000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver /DualPort FLASH.List RETURN )