STM32G071とWS2812B(3個)でランダムに光らせる。
x ws2812bがなぜ3個なのかと言うと2,3個で電流が超えるらしい
目的
GPIOのテスト
構成
windows 10 21H2
Arduino
1.8.19
STM32 MCU based boards 2.2.0
説明
WS2812Bの接続ピンは、PA8(D7ピン)です。
いろいろ
STM32G031とSTM320G71の違い
まずROMが32KB+(かくれ32KB)から128KBになっている。
割り算つかい放題
printf使い放題?
浮動小数点つかい放題
速度同じ64Mhz 倍速回路あり(PLL)
RAMも32KBらしい
そんなところ
参考
STM32G031のプログラムを完全にそのまま
int l[90]; //max30 led
void bit_on1();
void bit_off1();
// 12345678 12345678 12345678 12345678
int b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
0b00001000,0b00000100,0b00000010,0b00000001, };
int ws_led(int num1)
{
int on_off;
for(int ii=0;ii<num1;ii++){
//8ビット分送る
for(int jj=0;jj<8;jj++){
on_off = l[ii] & b8[jj];
if( on_off == 0 ){
bit_off1(); //ビットが0
} else {
bit_on1(); //ビットが1
}//endif
}//for 8bit
}//for max30byt
return(0);
}//ws_led
void setup() {
randomSeed( micros() ); //乱数の初期化
pinMode(PA8, OUTPUT);
while(1){
//l[3*0+0] = 31;
//l[3*0+1] = 32;
//l[3*0+2] = 33;
//
//l[3*1+0] = 30;
//l[3*1+1] = 10;
//l[3*1+2] = 32;
//
//l[3*2+0] = 10;
//l[3*2+1] = 10;
//l[3*2+2] = 32;
for(int ii=0;ii<9;ii++){
l[ii] = random(32);
}//for
//ws2812bへデータを送る
ws_led(9);
//0.1秒待つ
delay(100);
} //while
}//setup
void loop() {
}//loop
// 5432109876543210
int on1 = GPIOA->ODR | 0b0000000100000000;
int off1 = GPIOA->ODR & 0b1111111011111111;
// 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
void bit_off1(){
//0.3us 800khz
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
}//0.3us
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
void bit_on1(){
//1us 800khz
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = on1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
GPIOA->ODR = off1;
}//1us