Add a new variant for WeAct MiniSTM32H743VITX and MiniSTM32H750VBT by ag88 · Pull Request #1552 · stm32duino/Arduino_Core_STM32 (original) (raw)
Summary
The board schematics, images at the time of this commit is found at
https://github.com/WeActTC/MiniSTM32H7xx
This variant is 'unofficial' (i.e. this is community contributed and not from the original vendor). This variant works well, the contributor has done various tests and is using it. But there would not be any direct support from ST should there be
issues as you can't expect original stm32duino developers to have this board.
There is a thread for this board in the forum
https://www.stm32duino.com/viewtopic.php?f=28&t=1348
You may post your queries, issues about this board in the thread in forum, but as this is community contributed, there is no assurance of a response.
This variant is actually adapted from the generic variant found in
https://github.com/stm32duino/Arduino_Core_STM32/tree/main/variants/STM32H7xx/H742V(G-I)(H-T)_H743V(G-I)(H-T)_H750VBT_H753VI(H-T)
the changes are:
- created a void SystemClock_Config(void) that use the external 25 Mhz
HSE crystal. this makes it run at 480 Mhz ! USB (CDC Serial) still
works per normal.
Much of the rest of the peripherals are clocked at 80 Mhz (from the
outputs of PLL2 and PLL3), that's the max allowable documented in ref
manual for the ADC.
- the rest of definitions are pretty much same as the generic variant
with the following redefinitions
a. #define LED_BUILTIN PE3 (per schematics and tested)
b. #define USER_BTN PC13 (per schematics and tested)
c. SERIAL_TX PA9, SERIAL_RX PA10 - this makes the 1st hardware serial
port UART1
2. added 2 conveinence functions - this is only for this board and is
only availaible if it is selected
/* power saving mode, mcu runs significantly cooler
* Sysclock 240 Mhz, bus clocks 120 Mhz */
void SysClkHalfSpeed();
/* full speed - sysclk from PLL1 P - 480 Mhz
* Sysclock 480 Mhz, bus clocks 240 Mhz */
void SysClkFullSpeed()
This variant runs the systemclock default at 480 MHz (published max)
and AHB at 240 MHz. The stm32h743 mcu tend to run pretty warm after a
while (around 50 deg C). The half speed function call changes
the system clock dividers (divide by 2 - gives 240 Mhz)
and AHB dividers (divide further by 2 - gives 120 Mhz)
so that it runs at 1/2 the PLL1 P speeds (480 Mhz).
the mcu runs significantly cooler running at 1/2 speeds.
some tests has been done to swtich the speeds calling the functions at
run time, they seem to work ok. But tests isn't thorough, so check
things if you use the speed changing functions.
This PR fixes/implements the following bugs/features
- Feature 1
new variant for WeAct MiniSTM32H743VITX
Explain the motivation for making this change. What existing problem does the pull request solve?
new variant for WeAct MiniSTM32H743VITX, uses onboard 25 Mhz HSE crystal,
defined LED_BUILTIN and USER_BTN
Validation
- Ensure CI build is passed.
- Demonstrate the code is solid. [e.g. Provide a sketch]
first a screen print
https://imgur.com/a/E97YKnf
sketch
you can find whetstone.h, whetstone.c here
https://www.stm32duino.com/viewtopic.php?p=106#p106
or here
https://github.com/stm32duino/STM32Examples/tree/main/examples/Benchmarking/Whetstone/SinglePrecision
it may take some adaptation in the codes to run
#include <Arduino.h>
#include <math.h>
#include "whetstone.h"
enum EnCpuSp {
SPFULL = 0,
SPHALF
};
void cpusetspeed(EnCpuSp speed);
void checkcmd(void);
void printtempvbat(void);
void cosfade();
void EnableCache();
void sleep(uint16_t ms);
int ledPin = LED_BUILTIN;
int print = false;
//used by cosfade()
#define PER 15
#define REP 20
int8_t led = 0;
int n = PER, cnt = 0;
uint8_t p = 0;
// the setup() method runs once when the sketch starts
void setup() {
EnableCache();
//initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
pinMode(ATEMP, INPUT_ANALOG);
pinMode(AVREF, INPUT_ANALOG);
pinMode(USER_BTN, INPUT_PULLDOWN);
}
//the loop() method runs over and over again,
void loop() {
checkcmd();
if (print && n == 0 && cnt == 0) printtempvbat();
cosfade();
}
/* a half hearted attempt to make a 'breathing' led, works quite well though */
void cosfade() {
digitalWrite(LED_BUILTIN,led);
led = ~led & 1;
if(led)
delay(PER-p);
else
delay(p);
if(cnt>REP) {
float nf, perf;
n = n>PER?0:n+1;
nf = n * 1.0;
perf = PER * 1.0;
p = perf * ( cos(2 * PI * nf/perf) / 2.0 + 0.5 );
cnt=0;
} else
cnt++;
}
void printtempvbat() {
uint16_t vrefint = analogRead(AVREF);
Serial.print("Vref int (1.21v):");
Serial.print(vrefint);
Serial.println();
uint16_t vtemp = analogRead(ATEMP);
Serial.print("temp sensor:");
Serial.print(vtemp);
Serial.println();
uint16_t mv = (1210 * vtemp) / vrefint;
Serial.print("mvolt:");
Serial.print(mv);
Serial.println();
// specs 5.3.22 temp sensor characteristics
// V 30 deg ~ 0.62v
// slope 2 mv/C
uint16_t v30 = 620;
float temp = (mv - v30) * 1.0 / 2.0 + 30.0;
Serial.print("temp:");
Serial.print(temp);
Serial.println();
}
void cpusetspeed(EnCpuSp speed) {
if (speed == EnCpuSp::SPHALF) {
SysClkHalfSpeed();
} else {
SysClkFullSpeed();
}
}
void checkcmd() {
if(Serial.available()) {
char r = Serial.read();
if(r=='p') {
print = ! print;
} else if (r=='w') {
//whetstone(F_CPU/1000000);
whetstone(SystemCoreClock/1000000);
} else if (r=='C') {
cpusetspeed(EnCpuSp::SPFULL);
Serial.print("sysclock Mhz:");
Serial.println(SystemCoreClock/1000000);
} else if (r=='c') {
cpusetspeed(EnCpuSp::SPHALF);
Serial.print("sysclock Mhz:");
Serial.println(SystemCoreClock/1000000);
} else {
Serial.println("p - print/stop print");
Serial.println("C - cpu full speed");
Serial.println("c - cpu half speed");
Serial.println("w - run whetstone");
}
}
if (digitalRead(USER_BTN) == HIGH) {
Serial.println("user btn pressed");
}
}
void blinks() {
for (int i = 0; i < 5; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
}
}
void EnableCache() {
SCB_CleanDCache();
__DSB();
SCB_InvalidateDCache();
SCB_EnableDCache();
__ISB();
SCB_InvalidateICache();
SCB_EnableICache();
}
void sleep(uint16_t ms) {
for(uint16_t i=0; i<ms; i++)
asm("wfi");
}
sample results are like such (use usb (CDC) serial with a serial monitor.
putty is quite good, responds to single key commands)
p - print/stop print
C - cpu full speed
c - cpu half speed
w - run whetstone
Vref int (1.21v):376 <<< type 'p' print the cpu temperature
temp sensor:205
mvolt:659
temp:49.50
Beginning Whetstone benchmark at 480 MHz ... <<< type 'w' run whetstone benchmark
Loops:10000, Iterations:1, Duration:1627.57 millisec
C Converted Single Precision Whetstones:614.41 Mflops
sysclock Mhz:240 <<< typed 'c' here to reduce system clock to 240 Mhz
Vref int (1.21v):375
temp sensor:205
mvolt:661
temp:50.50
Beginning Whetstone benchmark at 240 MHz ... <<< type 'w' run whetstone benchmark
Loops:10000, Iterations:1, Duration:3251.76 millisec
C Converted Single Precision Whetstones:307.53 Mflops
Vref int (1.21v):376
temp sensor:202
mvolt:650
temp:45.00
user btn pressed <<< --- press user button on board
user btn pressed
user btn pressed
Closing issues
Fixes #xxx