Budali11 发表于 2022-8-19 18:26:26

Windows 使用makefile和boot+app方式开发stm32h750

为啥论坛没法写md文档呢
文档在这Budali11/stm32h7-bootloader-application: 在stm32h750上使用bootloader+Application开发 (github.com)

eric2013 发表于 2022-8-19 19:00:30

谢谢楼主分享,整理的非常好,论坛不支持Markdown

akatsuki_lim 发表于 2022-8-23 11:32:24

openocd是怎么获取到外部qspi-flash的信息的?我按照步骤修改好了stm32h7x.cfg文件,用telnet打开openocd创建的端口查询当前的flash列表,列表有qspi-flash,但是查询信息出错。

Open On-Chip Debugger
> flash list
{name stm32h7x.bank1.cpu0 driver stm32h7x base 134217728 size 0 bus_width 0 chip_width 0 target stm32h7x.cpu0} {name stm32h7x.qspi driver stmqspi base 2415919104 size 0 bus_width 0 chip_width 0 target stm32h7x.cpu0}
> flash info 1
timeout
timeout
error retrieving flash info
#1 : stmqspi at 0x90000000, size 0x00000000, buswidth 0, chipwidth 0

QSPI flash bank not probed yet
> reset
> halt
target halted due to debug-request, current mode: Thread
xPSR: 0x81000000 pc: 0x08005e12 msp: 0x2001ffa8
> flash info 1
timeout
timeout
error retrieving flash info
#1 : stmqspi at 0x90000000, size 0x00000000, buswidth 0, chipwidth 0

QSPI flash bank not probed yet
>

另外,我用的是h750vb,qspi挂载在bank2,目前驱动正常能读写。

morning_enr6U 发表于 2022-8-24 11:29:25

MD文档用什么软件打开看比较方便? 浏览器除外,主要用于阅读本地文件哈,{:33:}

caicaptain2 发表于 2022-8-24 11:33:28

morning_enr6U 发表于 2022-8-24 11:29
MD文档用什么软件打开看比较方便? 浏览器除外,主要用于阅读本地文件哈,

notepad++可以显示md

he2002512 发表于 2022-8-24 21:48:33

caicaptain2 发表于 2022-8-24 11:33
notepad++可以显示md

np++反华严重,已经弃用了!

morning_enr6U 发表于 2022-8-25 08:36:28

楼上的,有推荐的吗?

会飞的猪_2020 发表于 2022-8-25 09:46:30

morning_enr6U 发表于 2022-8-24 11:29
MD文档用什么软件打开看比较方便? 浏览器除外,主要用于阅读本地文件哈,

typora

会飞的猪_2020 发表于 2022-8-25 09:51:08

关于makefile和openocd这两个东西,你们都是从哪里找到玩法的?
我从百度上搜索,都是一些零零散散的资料。

现在只会简单的修改,但是不清楚这两个东西的原理是什么。自己想改的复杂一点去哪里可以学?

he2002512 发表于 2022-8-26 09:54:10

morning_enr6U 发表于 2022-8-25 08:36
楼上的,有推荐的吗?

VSCODE,这些都支持。除了一个会自动覆盖内容的bug,其他都挺好。

akatsuki_lim 发表于 2022-8-26 18:47:20

记录一下使用mingw32+makefile命令行+daplink+openocd的方式烧录h750外部qspi-flash的后续:

1.目前openocd最新的版本(0.11.0 (2021-11-18))已经对st的qspi有了很好的支持,具体可以看官方github上的stmqpsi.c的实现,并配合stm32h750b-disco.cfg和stm32h7x_dual_qspi.cfg这两个文件来看。
[https://github.com/sysprogs/openocd]附上我编改的.cfg配置文件



2.在stm32h7x_qspi.cfg中重点实现了io映射初始化和qpsi初始化,这部分配置要确保无误。

3.openocd的烧录命令可参考网上的一些方法,这里放出我在makefile上的命令作参考:
OCD_EXE = ./tools/OpenOCD/bin/openocd.exe
OCD_INF = ./tools/OpenOCD/scripts/interface/cmsis-dap.cfg
OCD_TARGET = ./tools/OpenOCD/scripts/target/stm32h7x.cfg
OCD_TARGET_QSPI = ./tools/OpenOCD/scripts/target/stm32h7x_qspi.cfg

flash:
        $(OCD_EXE) -f $(OCD_INF) -c "transport select swd" -f $(OCD_TARGET) -c init -c halt -c "flash write_image erase $(FLASH_HEX)" -c reset -c shutdown
#        $(OCD_EXE) -f $(OCD_INF) -c "transport select swd" -f $(OCD_TARGET) -c "init; halt; flash write_image erase $(FLASH_HEX); reset; shutdown;"

flash-qspi:
        $(OCD_EXE) -f $(OCD_TARGET_QSPI) -c "init; reset init; halt;" -c "flash write_image erase ./testbin.bin 0x90000000" -c reset -c shutdown



4.实现原理:命令openocd.exe -f $(CFG)启动openocd后,再输入命令“reset init”即可启动stm32h7x_qspi.cfg文件中的初始化代码,从而MCU相应的外设得到了初始化,随后openocd调用自身的stmqspi部分代码进行flash的擦除与写入。

参考网址:
https://club.rt-thread.org/ask/article/95a03d2494e01ada.html

Budali11 发表于 2022-8-27 10:38:52

akatsuki_lim 发表于 2022-8-26 18:47
记录一下使用mingw32+makefile命令行+daplink+openocd的方式烧录h750外部qspi-flash的后续:

1.目前open ...

我靠!大佬!一开始我也遇到读不了flash信息的问题,不过后来我貌似是通过修改qspi部分的代码解决的。

Budali11 发表于 2022-8-27 10:48:19

morning_enr6U 发表于 2022-8-24 11:29
MD文档用什么软件打开看比较方便? 浏览器除外,主要用于阅读本地文件哈,

我是用typora的,这个比较适合编辑吧。不过只用来看的话其他免费的也还行吧。

Budali11 发表于 2022-8-27 10:52:10

会飞的猪_2020 发表于 2022-8-25 09:51
关于makefile和openocd这两个东西,你们都是从哪里找到玩法的?
我从百度上搜索,都是一些零零散散的资料 ...

可以在官网找到参考手册的。
make:GNU make
openocd:openocd document

Budali11 发表于 2022-8-27 10:57:05

会飞的猪_2020 发表于 2022-8-25 09:51
关于makefile和openocd这两个东西,你们都是从哪里找到玩法的?
我从百度上搜索,都是一些零零散散的资料 ...

中文的阅读起来会方便一点

yuyike 发表于 2024-2-21 14:29:18

akatsuki_lim 发表于 2022-8-26 18:47
记录一下使用mingw32+makefile命令行+daplink+openocd的方式烧录h750外部qspi-flash的后续:

1.目前open ...

你好可以重新发一下这两个cfg文件吗   下载不了了

mowenan 发表于 2024-2-21 16:48:22

vs code 装MD插件就可以很方便的编写查看MD文件了

akatsuki_lim 发表于 2024-2-22 09:22:53

yuyike 发表于 2024-2-21 14:29
你好可以重新发一下这两个cfg文件吗   下载不了了

我把源码贴一下


stm32h7x_qspi.cfg:
# SPDX-License-Identifier: GPL-2.0-or-later

# This is a stm32h750b-dk with a single STM32H750XBH6 chip.
# www.st.com/en/product/stm32h750b-dk.html
#

# This is for using the onboard STLINK
source

# transport select hla_swd

# set CHIPNAME stm32h750vbt6

# enable stmqspi
if {!} {
        set QUADSPI 1
}

source

# reset_config srst_only

# QUADSPI initialization
# qpi: 4-line mode
proc qspi_init { qpi } {
        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

        # QSPI BK2 IO
        # QSPI_BK2_NCS: PC11/AF9, QSPI_CLK: PB2/AF9,
        # QSPI_BK2_IO0: PE7/AF10, QSPI_BK2_IO1: PE8/AF10, QSPI_BK2_IO2: PE9/AF10, QSPI_BK2_IO3: PE10/AF10

        # PB02:AF09:V, PC11:AF09:V, PE10:AF10:V, PE09:AF10:V, PE08:AF10:V, PE07:AF10:V
        # Port B: PB02:AF09:V
        mmw 0x58020400 0x00000020 0x00000010    ;# MODER
        mmw 0x58020408 0x00000030 0x00000000    ;# OSPEEDR
        mmw 0x5802040C 0x00000000 0x00000030    ;# PUPDR
        mmw 0x58020420 0x00000900 0x00000600    ;# AFRL
        # Port C: PC11:AF09:V
        mmw 0x58020800 0x00800000 0x00400000    ;# MODER
        mmw 0x58020808 0x00C00000 0x00000000    ;# OSPEEDR
        mmw 0x5802080C 0x00000000 0x00C00000    ;# PUPDR
        mmw 0x58020824 0x00009000 0x00006000    ;# AFRH
        # Port E: PE10:AF10:V, PE09:AF10:V, PE08:AF10:V, PE07:AF10:V
        mmw 0x58021000 0x002A8000 0x00154000    ;# MODER
        mmw 0x58021008 0x003FC000 0x00000000    ;# OSPEEDR
        mmw 0x5802100C 0x00000000 0x003FC000    ;# PUPDR
        mmw 0x58021020 0xA0000000 0x50000000    ;# AFRL
        mmw 0x58021024 0x00000AAA 0x00000555    ;# AFRH

        # Port D: 14 15 for led
        mmw 0x58020C00 0x50000000 0xA0000000        ;# MODER
        mmw 0x58020C04 0x00000000 0x00000000        ;# OTYPER
        mmw 0x58020C08 0x50000000 0xA0000000        ;# OSPEEDR
        mmw 0x58020C0C 0x50000000 0xA0000000        ;# PUPDR
        mmw 0x58020C14 0x00000000 0x00000000        ;# ODR
        sleep 1

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

        # for quad flash mode w25q64jv
        mww 0x52005000 0x01000390                                ;# QUADSPI_CR: PRESCALER=5, APMS=1, FTHRES=0, FSEL=0, DFM=1, SSHIFT=1, TCEN=1
        mww 0x52005004 0x00160200                                ;# QUADSPI_DCR: FSIZE=0x16, CSHT=0x02, CKMODE=0

        mww 0x52005030 0x00001000                                ;# QUADSPI_LPTR: deactivate CS after 4096 clocks when FIFO is full
        mww 0x52005014 0x0D002503                                ;# QUADSPI_CCR: FMODE=0x3, DMODE=0x1, DCYC=0x0, ADSIZE=0x3, 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

        if { $qpi == 1 } {
                # Write Enable
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005014 0x00000106                        ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x0, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=Write Enable
                # sleep 1

                # # Configure dummy clocks via volatile configuration register
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005010 0x00000001                        ;# QUADSPI_DLR: 2 data bytes
                # mww 0x52005014 0x01000181                        ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x1, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=Write Volatile Conf. Reg.
                # mwh 0x52005020 0xABAB                                ;# QUADSPI_DR: 0xAB 0xAB for 10 dummy clocks
                # sleep 1

                # # Write Enable
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005014 0x00000106                        ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x0, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=Write Enable
                # sleep 1

                # # Enable QPI mode via enhanced volatile configuration register
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005010 0x00000001                        ;# QUADSPI_DLR: 2 data bytes
                # mww 0x52005014 0x01000161                        ;# QUADSPI_CCR: FMODE=0x0, DMODE=0x1, DCYC=0x0, ADSIZE=0x0, ADMODE=0x0, IMODE=0x1, INSTR=Write Enhanced Conf. Reg.
                # mwh 0x52005020 0x3F3F                                ;# QUADSPI_DR: 0x3F 0x3F to enable QPI and DPI mode
                # sleep 1

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

                # # memory-mapped fast read mode with 4-byte addresses and 10 dummy cycles (for read only)
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005014 0x0F283FEC                        ;# QUADSPI_CCR: FMODE=0x3, DMODE=0x3, DCYC=0xA, ADSIZE=0x3, ADMODE=0x3, IMODE=0x3, INSTR=Fast READ
        } else {
                # memory-mapped read mode with 4-byte addresses
                # mmw 0x52005000 0x00000002 0                        ;# QUADSPI_CR: ABORT=1
                # mww 0x52005014 0x0D003513                        ;# QUADSPI_CCR: FMODE=0x3, DMODE=0x1, DCYC=0x0, ADSIZE=0x3, ADMODE=0x1, IMODE=0x1, INSTR=READ
        }
}

$_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 1
        }
}


stm32h7x.cfg
# script for stm32h7x family

#
# stm32h7 devices support both JTAG and SWD transports.
#
source
source

if { } {
   set _CHIPNAME $CHIPNAME
} else {
   set _CHIPNAME stm32h7x
}

if { } {
        set $_CHIPNAME.DUAL_BANK $DUAL_BANK
        unset DUAL_BANK
} else {
        set $_CHIPNAME.DUAL_BANK 0
}

if { } {
        set $_CHIPNAME.DUAL_CORE $DUAL_CORE
        unset DUAL_CORE
} else {
        set $_CHIPNAME.DUAL_CORE 0
}

# Issue a warning when hla is used, and fallback to single core configuration
if { && } {
        echo "Warning : hla does not support multicore debugging"
        set $_CHIPNAME.DUAL_CORE 0
}

if { } {
        set $_CHIPNAME.USE_CTI $USE_CTI
        unset USE_CTI
} else {
        set $_CHIPNAME.USE_CTI 0
}

# Issue a warning when DUAL_CORE=0 and USE_CTI=1, and fallback to USE_CTI=0
if { ! && } {
        echo "Warning : could not use CTI with a single core device, CTI is disabled"
        set $_CHIPNAME.USE_CTI 0
}

set _ENDIAN little

# Work-area is a space in RAM used for flash programming
# By default use 64kB
if { } {
   set _WORKAREASIZE $WORKAREASIZE
} else {
   set _WORKAREASIZE 0x10000
}

#jtag scan chain
if { } {
   set _CPUTAPID $CPUTAPID
} else {
   if { } {
          set _CPUTAPID 0x6ba00477
   } {
      set _CPUTAPID 0x6ba02477
   }
}

swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu

if {} {
   jtag newtap $_CHIPNAME bs -irlen 5
}

if {!} {
        # STM32H7 provides an APB-AP at access port 2, which allows the access to
        # the debug and trace features on the system APB System Debug Bus (APB-D).
        target create $_CHIPNAME.ap2 mem_ap -dap $_CHIPNAME.dap -ap-num 2
        swocreate $_CHIPNAME.swo-dap $_CHIPNAME.dap -ap-num 2 -baseaddr 0xE00E3000
        tpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 2 -baseaddr 0xE00F5000
}

target create $_CHIPNAME.cpu0 cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap -ap-num 0

$_CHIPNAME.cpu0 configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0

flash bank $_CHIPNAME.bank1.cpu0 stm32h7x 0x08000000 0 0 0 $_CHIPNAME.cpu0

if {} {
        flash bank $_CHIPNAME.bank2.cpu0 stm32h7x 0x08100000 0 0 0 $_CHIPNAME.cpu0
}

if {} {
        target create $_CHIPNAME.cpu1 cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap -ap-num 3

        $_CHIPNAME.cpu1 configure -work-area-phys 0x38000000 -work-area-size $_WORKAREASIZE -work-area-backup 0

        flash bank $_CHIPNAME.bank1.cpu1 stm32h7x 0x08000000 0 0 0 $_CHIPNAME.cpu1

        if {} {
                flash bank $_CHIPNAME.bank2.cpu1 stm32h7x 0x08100000 0 0 0 $_CHIPNAME.cpu1
        }
}

# Make sure that cpu0 is selected
targets $_CHIPNAME.cpu0

if { && $QUADSPI } {
   set a ]
   set _QSPINAME $_CHIPNAME.qspi
   flash bank $_QSPINAME stmqspi 0x90000000 0 0 0 $_CHIPNAME.cpu0 0x52005000
} else {
   if { && $OCTOSPI1 } {
      set a ]
      set _OCTOSPINAME1 $_CHIPNAME.octospi1
      flash bank $_OCTOSPINAME1 stmqspi 0x90000000 0 0 0 $_CHIPNAME.cpu0 0x52005000
   }
   if { && $OCTOSPI2 } {
      set b ]
      set _OCTOSPINAME2 $_CHIPNAME.octospi2
      flash bank $_OCTOSPINAME2 stmqspi 0x70000000 0 0 0 $_CHIPNAME.cpu0 0x5200A000
   }
}

# Clock after reset is HSI at 64 MHz, no need of PLL
adapter speed 1800

adapter srst delay 100
if {} {
jtag_ntrst_delay 100
}

# use hardware reset
#
# The STM32H7 does not support connect_assert_srst mode because the AXI is
# unavailable while SRST is asserted, and that is used to access the DBGMCU
# component at 0x5C001000 in the examine-end event handler.
#
# It is possible to access the DBGMCU component at 0xE00E1000 via AP2 instead
# of the default AP0, and that works with SRST asserted; however, nonzero AP
# usage does not work with HLA, so is not done by default. That change could be
# made in a local configuration file if connect_assert_srst mode is needed for
# a specific application and a non-HLA adapter is in use.
reset_config srst_nogate

if {!} {
   # if srst is not fitted use SYSRESETREQ to
   # perform a soft reset
        $_CHIPNAME.cpu0 cortex_m reset_config sysresetreq

        if {} {
                $_CHIPNAME.cpu1 cortex_m reset_config sysresetreq
        }

   # Set CSW, which according to ARM ADI v5 appendix E1.4 maps to AHB signal
   # HPROT, which according to AMBA AHB/ASB/APB specification chapter 3.7.3
   # makes the data access cacheable. This allows reading and writing data in the
   # CPU cache from the debugger, which is far more useful than going straight to
   # RAM when operating on typical variables, and is generally no worse when
   # operating on special memory locations.
   $_CHIPNAME.dap apcsw 0x08000000 0x08000000
}

$_CHIPNAME.cpu0 configure -event examine-end {
        # Enable D3 and D1 DBG clocks
        # DBGMCU_CR |= D3DBGCKEN | D1DBGCKEN
        stm32h7x_dbgmcu_mmw 0x004 0x00600000 0

        # Enable debug during low power modes (uses more power)
        # DBGMCU_CR |= DBG_STANDBY | DBG_STOP | DBG_SLEEP D1 Domain
        stm32h7x_dbgmcu_mmw 0x004 0x00000007 0
        # DBGMCU_CR |= DBG_STANDBY | DBG_STOP | DBG_SLEEP D2 Domain
        stm32h7x_dbgmcu_mmw 0x004 0x00000038 0

        # Stop watchdog counters during halt
        # DBGMCU_APB3FZ1 |= WWDG1
        stm32h7x_dbgmcu_mmw 0x034 0x00000040 0
        # DBGMCU_APB1LFZ1 |= WWDG2
        stm32h7x_dbgmcu_mmw 0x03C 0x00000800 0
        # DBGMCU_APB4FZ1 |= WDGLSD1 | WDGLSD2
        stm32h7x_dbgmcu_mmw 0x054 0x000C0000 0

        # Enable clock for tracing
        # DBGMCU_CR |= TRACECLKEN
        stm32h7x_dbgmcu_mmw 0x004 0x00100000 0

        # RM0399 (id 0x450) M7+M4 with SWO Funnel
        # RM0433 (id 0x450) M7 with SWO Funnel
        # RM0455 (id 0x480) M7 without SWO Funnel
        # RM0468 (id 0x483) M7 without SWO Funnel
        # Enable CM7 and CM4 slave ports in SWO trace Funnel
        # Works ok also on devices single core and without SWO funnel
        # Hack, use stm32h7x_dbgmcu_mmw with big offset to control SWTF
        # SWTF_CTRL |= ENS0 | ENS1
        stm32h7x_dbgmcu_mmw 0x3000 0x00000003 0
}

$_CHIPNAME.cpu0 configure -event reset-init {
        # Clock after reset is HSI at 64 MHz, no need of PLL
        adapter speed 4000
}

# get _CHIPNAME from current target
proc stm32h7x_get_chipname {} {
        set t
        set sep
        if {$sep == -1} {
                return $t
        }
        return ]
}

if {} {
        $_CHIPNAME.cpu1 configure -event examine-end {
                set _CHIPNAME
                global $_CHIPNAME.USE_CTI

                # Stop watchdog counters during halt
                # DBGMCU_APB3FZ2 |= WWDG1
                stm32h7x_dbgmcu_mmw 0x038 0x00000040 0
                # DBGMCU_APB1LFZ2 |= WWDG2
                stm32h7x_dbgmcu_mmw 0x040 0x00000800 0
                # DBGMCU_APB4FZ2 |= WDGLSD1 | WDGLSD2
                stm32h7x_dbgmcu_mmw 0x058 0x000C0000 0

                if {} {
                        stm32h7x_cti_start
                }
        }
}

# like mrw, but with target selection
proc stm32h7x_mrw {used_target reg} {
        set value ""
        $used_target mem2array value 32 $reg 1
        return $value(0)
}

# like mmw, but with target selection
proc stm32h7x_mmw {used_target reg setbits clearbits} {
        set old
        set new
        $used_target mww $reg $new
}

# mmw for dbgmcu component registers, it accepts the register offset from dbgmcu base
# this procedure will use the mem_ap on AP2 whenever possible
proc stm32h7x_dbgmcu_mmw {reg_offset setbits clearbits} {
        # use $_CHIPNAME.ap2 if possible, and use the proper dbgmcu base address
        if {!} {
                set _CHIPNAME
                set used_target $_CHIPNAME.ap2
                set reg_addr
        } {
                set used_target
                set reg_addr
        }

        stm32h7x_mmw $used_target $reg_addr $setbits $clearbits
}

if {} {
        # create CTI instances for both cores
        cti create $_CHIPNAME.cti0 -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0043000
        cti create $_CHIPNAME.cti1 -dap $_CHIPNAME.dap -ap-num 3 -baseaddr 0xE0043000

        $_CHIPNAME.cpu0 configure -event halted { stm32h7x_cti_prepare_restart_all }
        $_CHIPNAME.cpu1 configure -event halted { stm32h7x_cti_prepare_restart_all }

        $_CHIPNAME.cpu0 configure -event debug-halted { stm32h7x_cti_prepare_restart_all }
        $_CHIPNAME.cpu1 configure -event debug-halted { stm32h7x_cti_prepare_restart_all }

        proc stm32h7x_cti_start {} {
                set _CHIPNAME

                # Configure Cores' CTIs to halt each other
                # TRIGIN0 (DBGTRIGGER) and TRIGOUT0 (EDBGRQ) at CTM_CHANNEL_0
                $_CHIPNAME.cti0 write INEN0 0x1
                $_CHIPNAME.cti0 write OUTEN0 0x1
                $_CHIPNAME.cti1 write INEN0 0x1
                $_CHIPNAME.cti1 write OUTEN0 0x1

                # enable CTIs
                $_CHIPNAME.cti0 enable on
                $_CHIPNAME.cti1 enable on
        }

        proc stm32h7x_cti_stop {} {
                set _CHIPNAME

                $_CHIPNAME.cti0 enable off
                $_CHIPNAME.cti1 enable off
        }

        proc stm32h7x_cti_prepare_restart_all {} {
                stm32h7x_cti_prepare_restart cti0
                stm32h7x_cti_prepare_restart cti1
        }

        proc stm32h7x_cti_prepare_restart {cti} {
                set _CHIPNAME

                # Acknowlodge EDBGRQ at TRIGOUT0
                $_CHIPNAME.$cti write INACK 0x01
                $_CHIPNAME.$cti write INACK 0x00
        }
}
页: [1]
查看完整版本: Windows 使用makefile和boot+app方式开发stm32h750