Description
Please, before reporting any issue
- Make sure you are using the latest Arduino_Core_STM32 version.
https://github.com/stm32duino/Arduino_Core_STM32/releases/latest
Oliver: I have installed Arduino Core STM32 last week (2.2.0) - Make sure the issue is not already reported/fixed on GitHub or discussed on the stm32duino forum
Oliver: I have looked for similar problems for STM32G031 but the total number of entries for the STM32G031 is very much limited and do not fit to my case - Submit a GitHub issue only for reporting a problem related to the Arduino_Core_STM32.
Oliver: Difficult to say, but I assume it is a problem within Arduino_Core_STM32 - Avoid to submit a GitHub issue for project troubleshooting.
Oliver: I have partly modified Arduino_Core_STM32 as a workaround (see below) and my project is just the Arduino "blink" example.
Any questions/feedback/suggestions should be discussed on the stm32duino forum:
- questions on the STM32 Core
- bugs/enhancements on the STM core: Bugs and enhancements
⚠ When reporting any issue, please try to provide all relevant information to help on its resolution.
Describe the bug
- After successful upload, the code (Arduino Blink) is not executed by STM32CubeProgrammer (Running the code after upload does not work)
- After hardware reset, the code (Arduino) is not executed
To Reproduce
Steps to reproduce the behavior:
- Open the Arduino Blink example
- Upload the Arduino Blink example
- Check whether the LED blinks
- Reconfigure target to execute the newly flashed code
- Execute a hardware reset on the target
- Check whether the LED blinks
Note: I will provide more information with partial findings below in this issue
Expected behavior
The code should be executed from STM32CubeProgrammer and after hardware reset
Screenshots
Here is the protocol of the successful upload (I can provide more screenshots on request)
sh /home/kraus/.arduino15/packages/STMicroelectronics/tools/STM32Tools/2.1.1/stm32CubeProg.sh 1 /tmp/arduino_build_310859/Blink_stm32g0.ino.bin ttyUSB0 -s
-------------------------------------------------------------------
STM32CubeProgrammer v2.9.0
-------------------------------------------------------------------
Serial Port ttyUSB0 is successfully opened.
Port configuration: parity = even, baudrate = 115200, data-bit = 8,
stop-bit = 1,0, flow-control = off
Activating device: OK
Board : --
Chip ID: 0x466
BootLoader protocol version: 3.1
Device name : STM32G03x/STM32G04x
Flash size : 64 KBytes (default)
Device type : MCU
Revision ID : --
Device CPU : Cortex-M0+
Memory Programming ...
Opening and parsing file: Blink_stm32g0.ino.bin
File : Blink_stm32g0.ino.bin
Size : 10332 Bytes
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 5]
Download in Progress:
File download complete
Time elapsed during download operation: 00:00:01.626
RUNNING Program ...
Address: : 0x8000000
Start operation achieved successfully
Desktop (please complete the following information):
- OS: Ubuntu Linnux
- Arduino IDE version: 1.8.19
- STM32 core version: 2.2.0
- Tools menu settings if not the default: [e.g. Newlib Standard, No Serial]
- Board: Generic STM32G0 series"
- Board part number: Generic G031J6MX
- USART support: Enabled
- C Runtime Library: Newlib Nano (default)
- Upload method: STM32CubeProgrammer (serial)
- Port: /dev/ttyUSB0
Board (please complete the following information):
- Name: Generic STM32G031J6
- STM32G031J6 with BOOT0 pin enabled (https://github.com/olikraus/stm32g031/tree/main/enable_boot0) and reset pin disabled (https://github.com/olikraus/stm32g031/tree/main/disable_nrst)
- USB USART converter connected to PA11/PA10 (pins 5&6)
- LED connected to PA13
Additional context
LED at PA13 (pin 7 of the SO8N )
I assume pin 7 of the SO8N can be accessed by Arduino pin number 6 (
So my initial code looks like this (didn't execute):
#define MYPIN 6
void setup() {
pinMode(MYPIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(MYPIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(MYPIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Bypassing pinMode and digitalWrite
To debug this, I have bypassed pinMode and digitalWrite:
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
//pinMode(MYPIN, OUTPUT);
GPIOA->MODER &= ~GPIO_MODER_MODE13; /* clear mode for PA13 */
GPIOA->MODER |= GPIO_MODER_MODE13_0; /* Output mode for PA13 */
GPIOA->OTYPER &= ~GPIO_OTYPER_OT13; /* no Push/Pull for PA13 */
GPIOA->OSPEEDR &= ~GPIO_OSPEEDR_OSPEED13; /* low speed for PA13 */
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPD13; /* no pullup/pulldown for PA13 */
//GPIOA->BSRR = GPIO_BSRR_BR13; /* atomic clr PA13 */
GPIOA->BSRR = GPIO_BSRR_BS13; /* atomic set PA13 */
}
// the loop function runs over and over again forever
void loop() {
//digitalWrite(MYPIN, HIGH); // turn the LED on (HIGH is the voltage level)
GPIOA->BSRR = GPIO_BSRR_BS13; /* atomic set PA13 */
delay(1000); // wait for a second
//digitalWrite(MYPIN, LOW); // turn the LED off by making the voltage LOW
GPIOA->BSRR = GPIO_BSRR_BR13; /* atomic clr PA13 */
delay(1000); // wait for a second
}
This code is also not executed, however if -DUSER_VECT_TAB_ADDRESS
is used as compiler arguments, then the code gets executed successfully.
I have added this dlag to
Arduino_Core_STM32/platform.txt
Line 31 in b8756be
compiler.extra_flags=-mcpu={build.mcu} {build.flags.fp} -DUSE_FULL_LL_DRIVER -mthumb "@{build.opt.path}" -DUSER_VECT_TAB_ADDRESS
This will at least start the above code (blink works), however:
- any call to pinMode() will again crash the code
- Startup of the code via hardware reset still doesn't work (this means: STM32CubeProgrammer can start the code, but HW reset still doesn't work).
To me it looks like that SCB->VTOR
is not setup correctly during startup for the STM32G031.
But there is another bug, because pinMode() still does not work and crashes the code.
Summary
- Everything works if only delay() is used and
SCB->VTOR
is assigned correctly - A call to pinMode() will halt/crash the code