|
From: Aurelio L. <al...@us...> - 2017-03-21 11:10:09
|
Hi Cezary, thanks for the summary of the memory layouts, this is what I panned to look into as well... At the moment I'm trying out your patch: http://openocd.zylin.com/#/c/4074/ http://openocd.zylin.com/#/c/4074/2/src/flash/nor/stm32lx.c It looks like a nice solution and works for my STM32L082! (Are really all variants covered?) The only thing I needed to add was the config file, to tell OpenOCD that there is second flash bank. ~~~ ~/git/openocd/src/openocd -f interface/stlink-v2.cfg -f ./stm32l0x2.cfg -c "program build/prj.elf verify reset exit" --search ~/git/openocd/tcl $ tail -n+72 stm32l0x2.cfg | head -n5 set _FLASHNAME $_CHIPNAME.flash flash bank $_FLASHNAME stm32lx 0x08000000 0 0 0 $_TARGETNAME set _FLASHNAME $_CHIPNAME.flash1 flash bank $_FLASHNAME stm32lx 0x08018000 0 0 0 $_TARGETNAME ~~~ Luckily the size will be determined by OpenOCD. So, do you think this would work for a all STM32L0xs on the list? If so, we might add a very similar CFG file for the L0x, like that one: openocd/tcl/target/stm32l1x_dual_bank.cfg. ~~~ $ cat stm32l0x_dual_bank.cfg source [find target/stm32l0.cfg] # The stm32l0x might have a dual bank flash. # Let's add a definition for the second bank here. # Add the second flash bank. set _FLASHNAME $_CHIPNAME.flash1 flash bank $_FLASHNAME stm32lx 0 0 0 0 $_TARGETNAME ~~~ *But what about the the L0s that don't have two flash banks?* Is it up to the user to decide whether to use stm32l0.cfg or stm32l0x_dual_bank.cfg ? - The latter would only be needed for large binaries, otherwise the stm32l0.cfg would work fine? Jan Čapek also worked on a solution for the same problem: http://openocd.zylin.com/#/c/4076/2 --- ** [tickets:#148] STM32L0x: flash size and dual bank support** **Status:** new **Milestone:** 0.9.0 **Created:** Sun Mar 19, 2017 01:47 AM UTC by Aurelio Lucchesi **Last Updated:** Mon Mar 20, 2017 12:04 PM UTC **Owner:** nobody Flash programming large binaries to my STM32L082 board failed, and I had to recompile OpenOCD in order to make it work. Without modification, it looks like this: ~~~ $ openocd -f interface/stlink-v2.cfg -f target/stm32l0.cfg -c "program build/prj.elf reset exit verify" ... Info : Device: STM32L0xx (Cat.5) Info : STM32L flash has dual banks. Bank (0) size is 128kb, base address is 0x8000000 ... Error: checksum mismatch - attempting binary compare diff 0 address 0x08020000. Was 0x3e instead of 0x69 diff 1 address 0x08020001. Was 0x79 instead of 0x21 diff 2 address 0x08020002. Was 0x79 instead of 0x3d diff 3 address 0x08020003. Was 0x74 instead of 0x59 diff 4 address 0x08020004. Was 0x6f instead of 0x59 diff 5 address 0x08020005. Was 0x73 instead of 0x5f ... ~~~ Then I've realized that there are two flash program memory banks: STM32L0xx category 5 MCUs come with 192 KiB of Flash program memory: * Bank 1: starting at 0x0800 0000, size 96 KiB * Bank 2: starting at 0x0801 8000, size 96 KiB So I've added a second one to a copy of the stm32l0.cfg script: ~~~ # flash size will be probed set _FLASHNAME $_CHIPNAME.flash flash bank $_FLASHNAME stm32lx 0x08000000 0 0 0 $_TARGETNAME # add second flash bank set _FLASHNAME $_CHIPNAME.flash1 flash bank $_FLASHNAME stm32lx 0x08018000 0x18000 0 0 $_TARGETNAME ~~~ But that revealed another problem: ~~~ $ openocd -f interface/stlink-v2.cfg -f ./stm32l0.cfg -c "program build/prj.elf reset exit verify" ... Info : Device: STM32L0xx (Cat.5) Info : STM32L flash has dual banks. Bank (0) size is 128kb, base address is 0x8000000 Warn : couldn't use loader, falling back to page memory writes Info : Device: STM32L0xx (Cat.5) Warn : STM32L flash bank base address config is incorrect. 0x8018000 but should rather be 0x8000000 or 0x8020000 Error: auto_probe failed ** Programming Failed ** shutdown command invoked ~~~ So I tried to fix things by rebuilding OpenOCD, and changed the size of the first (and second) flash page in src/flash/nor/stm32lx.c:261 from 128 to 96 KiB: ~~~ { .id = 0x447, .revs = stm32_447_revs, .num_revs = ARRAY_SIZE(stm32_447_revs), .device_str = "STM32L0xx (Cat.5)", .page_size = 128, .pages_per_sector = 32, .max_flash_size_kb = 192, .first_bank_size_kb = 96, // 128, .has_dual_banks = true, .flash_base = 0x40022000, .fsize_base = 0x1FF8007C, }, ~~~ That actually works for my hardware with the modified cfg script: ~~~ $ ~/git/openocd/src/openocd -f interface/stlink-v2.cfg -f ./stm32l0.cfg -c "program build/prj.elf reset exit verify" --search ~/git/openocd/tcl Open On-Chip Debugger 0.10.0+dev-00093-g6b2acc02 (2017-03-18-23:04) ... Info : Device: STM32L0xx (Cat.5) Info : STM32L flash has dual banks. Bank (0) size is 96kb, base address is 0x8000000 Warn : couldn't use loader, falling back to page memory writes Info : Device: STM32L0xx (Cat.5) Info : STM32L flash has dual banks. Bank (1) size is 96kb, base address is 0x8018000 Info : ignoring flash probed value, using configured bank size: 96kbytes ... ** Verified OK ** ** Resetting Target ** ~~~ So I've asked on IRC and tried to submit a really simple patch for that: http://openocd.zylin.com/#/c/4073/ But like Cezary pointed out: This **does not solve the problem of all STM32L0** Category 5 (or 3) devices, since they all have a different memory layout... See also: http://openocd.zylin.com/#/c/3554/ STM32L0x1 Ref Manual: http://st.com/resource/en/reference_manual/DM00108282.pdf STM32L0x2 Ref Manual: http://st.com/resource/en/reference_manual/DM00108281.pdf STM32L0x3 Ref Manual: http://st.com/resource/en/reference_manual/DM00095744.pdf I don't have access to other hardware to test things out nor enough knowledge about OpenOCD to really fix the issue for all cases... ----- Possible solutions that came to mind: 1) Don't use hardcoded size values. - Like Karl Palsson pointed out: Using the probed flash size (fsize_base/flash_size_in_kb, 0x1FF8004C on STM32L0x2, 33.1.1 Flash size register) and the device ID (32.4.1 MCU device ID code, stm32lx_read_id_code()), it should be possible to figure out the exact flash memory layout (size, addresses, dual bank). 2) Hardcode the values for all possible combinations for all STM32L0 MCU types/categories code the sizes. 3) Maybe the easiest: Make it possible to change first_bank_size_kb in a config script? Or is this already possible somehow? I'd like to help fixing this issue... --- Sent from sourceforge.net because ope...@li... is subscribed to https://sourceforge.net/p/openocd/tickets/ To unsubscribe from further messages, a project admin can change settings at https://sourceforge.net/p/openocd/admin/tickets/options. Or, if this is a mailing list, you can unsubscribe from the mailing list. |