; -------------------------------------------------------------------------------- ; @Title: OctoSPI flash program for STM32H735IG on STM32H735G-DK ; @Description: ; MACRONIX MX25LM51245GXDI00 is on the OCTOSPI controller ; ; DQS <-> GPIOB[2] en ALT_10 ; DQ_4,5,7 <-> GPIOD[4,5,7] en ALT_10 ; DQ_0,1,3 <-> GPIOD[11,12,13] en ALT_9 ; DQ_2 <-> GPIOE[2] en ALT_9 ; CLK <-> GPIOF[10] en ALT_9 ; NCS <-> GPIOG[6] en ALT_10 ; DQ6 <-> GPIOG[9] en ALT_9 ; ; @Keywords: ARM, Cortex-M7 ; @Author: JIM ; @Board: STM32H735G-DISCOVERY-KIT ; @Chip: STM32H735IG ; @Copyright: (C) 1989-2023 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Rev: 12745 $ ; $Id: stm32h735gdk-ospi.cmm 12745 2023-11-17 08:43:11Z mschaeffner $ &OSPI_BASE=0x52005000 ;OCTOSPI Controller &OSPI_AHB=0x90000000 ;OCTOSPI_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_cpu=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"CPU=","") ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0") ; -------------------------------------------------------------------------------- ; initialize and start the debugger RESet SYStem.CPU STM32H735IG SYStem.CONFIG.DEBUGPORTTYPE SWD IF hardware.COMBIPROBE()||hardware.UTRACE() ( SYStem.CONFIG.CONNECTOR MIPI20T ) SYStem.Option.DUALPORT ON SYStem.Up GOSUB RCC_Init GOSUB GPIO_PIN_MUX GOSUB OCTOSPI_Init ;GOSUB READ_ID_TEST ; ------------------------------------------------------------------------------ ; Flash declaration GOSUB FlashDeclaration "¶m_dualport" //Flash read_id test FLASH.SPI.CMD 2. 0x9F /READ 0x8 ;send 0x9F , read 8 bytes ; 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 RCC_Init: ( PER.Set.simple ASD:0x58024400 %LE %Long 0x0303F1A5 ;RCC_CR PER.Set.simple ASD:0x58024540 %LE %Long 0x1008007E ;GPIOB & GPIOD & GPIOE & GPIOF & GPIOG & Back up RAM clk enable PER.Set.simple ASD:0x5802444C %LE %Long 0x00000011 ;RCC_CDCCIPR PER.Set.simple ASD:0x5802447C %LE %Long 0x00000000 ;RCC_AHB3RSTR, release OCTO SPI memory controller reset PER.Set.simple ASD:0x580244B0 %LE %Long 0x00000000 ;RCC AXI clocks gating enable register PER.Set.simple ASD:0x58024534 %LE %Long 0x00205001 ;RCC AHB3 clock register (RCC_AHB3ENR) PER.Set.simple ASD:0x580244D4 %LE %Long 0x00205001 ;RCC_AHB3ENR PER.Set.simple ASD:0x5802455C %LE %Long 0xFDE95131 ;RCC AHB3 sleep clock register (RCC_AHB3LPENR) PER.Set.simple ASD:0x58024458 %LE %Long 0x00020000 RETURN ) GPIO_PIN_MUX: ( ; DQS <-> GPIOB[2] en ALT_10 ; DQ_4,5,7 <-> GPIOD[4,5,7] en ALT_10 ; DQ_0,1,3 <-> GPIOD[11,12,13] en ALT_9 ; DQ_2 <-> GPIOE[2] en ALT_9 ; CLK <-> GPIOF[10] en ALT_9 ; NCS <-> GPIOG[6] en ALT_10 ; DQ6 <-> GPIOG[9] en ALT_9 ;PD_4,5,7,11,12,13 PER.Set.simple ASD:0x58020C00 %LE %Long 0xFABFBAFF ; GPIOD_MODER PER.Set.simple ASD:0x58020C08 %LE %Long 0x0FC0CF00 ; 00:low sped, ... 11:Very high speed PER.Set.simple ASD:0x58020C20 %LE %Long 0xA0AA0000 ; AFRL[7:0] PD4,5,7 alt 10 PER.Set.simple ASD:0x58020C24 %LE %Long 0x00999000 ; AFRH[15:8] PD11,12,13 alt 9 ;PE2 PER.Set.simple ASD:0x58021000 %LE %Long 0xFFFFFFEF ; GPIOE_MODER PER.Set.simple ASD:0x58021008 %LE %Long 0x00000030 ; 00:low sped, ... 11:Very high speed PER.Set.simple ASD:0x58021020 %LE %Long 0x00000900 ; AFRL[7:0] PE2 alt 9 ;PF10 PER.Set.simple ASD:0x58021400 %LE %Long 0xFFEFFFFF ; GPIOF_MODER PER.Set.simple ASD:0x58021408 %LE %Long 0x00300000 ; 00:low sped, ... 11:Very high speed PER.Set.simple ASD:0x58021424 %LE %Long 0x00000900 ; AFRL[7:0] PF10 alt 9 ;PG6,9 PER.Set.simple ASD:0x58021800 %LE %Long 0xFFFBEFFF ; GPIOG_MODER PER.Set.simple ASD:0x58021808 %LE %Long 0x000C3000 ; 00:low sped, ... 11:Very high speed PER.Set.simple ASD:0x58021820 %LE %Long 0x0A000000 ; AFRL[7:0] PG6 alt 10 PER.Set.simple ASD:0x58021824 %LE %Long 0x00000090 ; AFRH[15:8] PG9 alt 9 RETURN ) OCTOSPI_Init: ( //OCTOSPIM_Init PER.Set.simple ASD:0x5200B404 %LE %Long 0x03010111 PER.Set.simple ASD:0x5200B408 %LE %Long 0x07050333 //OCTOSPI_Init PER.Set.simple ASD:&OSPI_BASE+0x000 %LE %Long 0x30400300 ;disable & memory mapped PER.Set.simple ASD:&OSPI_BASE+0x040 %LE %Long 0xFF ;clear status register PER.Set.simple ASD:&OSPI_BASE+0x00C %LE %Long 0x1 ;prescaler PER.Set.simple ASD:&OSPI_BASE+0x100 %LE %Long 0x01003101 ;ccr (1-1-1) PER.Set.simple ASD:&OSPI_BASE+0x008 %LE %Long 0x00190008 ;size 64MB PER.Set.simple ASD:&OSPI_BASE+0x108 %LE %Long 0x00000000 ;dummy cycles PER.Set.simple ASD:&OSPI_BASE+0x110 %LE %Long 0x13 ;opcode for read (1-1-1) PER.Set.simple ASD:&OSPI_BASE+0x180 %LE %Long 0x03002301 PER.Set.simple ASD:&OSPI_BASE+0x190 %LE %Long 0x32 PER.Set.simple ASD:&OSPI_BASE+0x000 %LE %Long Data.Long(ASD:&OSPI_BASE+0x000)|0x1 ;enable RETURN ) FlashDeclaration: ( PRIVATE &FlashSize &FlashDriver &FlashBaseAddr PARAMETERS &DualPort &FlashDriver="snor_stm32h7ospi.bin" &FlashSize=0x4000000 ;64MB &FlashBaseAddr=0x90000000 ;SPI AHB base address FLASH.RESet FLASH.Create 2. &FlashBaseAddr++(&FlashSize-1) 0x10000 TARGET2 Byte IF "&DualPort"=="0" FLASH.TARGET2 0x20000000 0x20002000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver /STACKSIZE 0x200 ELSE FLASH.TARGET2 0x20000000 E:0x20002000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver /STACKSIZE 0x200 /DualPort FLASH.List RETURN ) READ_ID_TEST: ( WHILE ((Data.Long(ANSD:&OSPI_BASE+0x20)>>8.)&0x1F)!=0x0 ( PRINT "read 0x" Data.Byte(ANSD:&OSPI_BASE+0x50) ;read data.. ) PER.Set.simple ANSD:&OSPI_BASE %Long 0x10400300 ;indirect-read mode and disable OCTOSPI &ccr_data= (0x0<<4.)|(1<<0.) ; 8bit(1byte) | 1bit opcode &ccr_data=&ccr_data|(0x2<<12.)|(0<<8.) ; 24bit(3bytes) | no addr out &ccr_data=&ccr_data|(0<<16.) ; no extra bytes &ccr_data=&ccr_data|(1<<24.) ; 24bit | 1bit data no extra bytes ;data enable PER.Set.simple ANSD:&OSPI_BASE+0x40 %Long 0xF ;4bytes read PER.Set.simple ANSD:&OSPI_BASE+0x108 %Long 0x0 ;no dummy PER.Set.simple ANSD:&OSPI_BASE %Long Data.Long(ANSD:&OSPI_BASE)|0x1 ;enable PER.Set.simple ANSD:&OSPI_BASE+0x100 %Long &ccr_data ; ccr_register PER.Set.simple ANSD:&OSPI_BASE+0x110 %Long 0x9f ; cmd opcode RePeaT Data.Byte(ANSD:&OSPI_BASE+0x40)+1. ( PRINT "read 0x" Data.Byte(ANSD:&OSPI_BASE+0x50) ;read data.. ) GOSUB OCTOSPI_Init RETURN )