STM32L010とWS2812B(3個)でランダムに光らせる。 (Keil)


x Mbed2
x ws2812bがなぜ3個なのかと言うと2,3個で電流が超えるらしい
x 軽量高速化

目的
GPIOのテスト

STM32L010F4P6

説明
WS2812Bの接続ピンは、PA4(10ピン)です。

x 動作確認は、しましたが画像は、イメージです。




//WS2812_LED3_RAND_010_1
#include "mbed.h"

char l[90]; //max30 led

DigitalOut myled(PA_4);

//              5432109876543210
#define on1   0b0000000000010000
#define off1  0b0000000000000000

#define M_ON1   GPIOA->ODR=on1;GPIOA->ODR=on1;GPIOA->ODR=on1;GPIOA->ODR=on1;
#define M_OFF1  GPIOA->ODR=off1;GPIOA->ODR=off1;GPIOA->ODR=off1;GPIOA->ODR=off1;

// 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
    M_ON1;
    M_ON1;
    GPIOA->ODR = on1;

    M_OFF1;
    M_OFF1;
    M_OFF1;
    M_OFF1;
    M_OFF1;
    M_OFF1;
    M_OFF1;
    GPIOA->ODR = off1;
}//bit_off1

// 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
    M_ON1;
    M_ON1;
    M_ON1;
    M_ON1;
    M_ON1;
    M_ON1;
    M_ON1;
    GPIOA->ODR = on1;
    GPIOA->ODR = on1;
    GPIOA->ODR = on1;

    M_OFF1;
    GPIOA->ODR = off1;
    GPIOA->ODR = off1;
    GPIOA->ODR = off1;
}//bit_on1

//ws2812bにデータを送る
int ws_led(int num1)
{
    char al;

    __disable_irq(); // disable interrupt

    for(int ii=0; ii<num1; ii++) {

      al=l[ii];

      if( al & 0b10000000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b01000000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00100000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00010000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00001000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000100 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000010 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000001 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}

    }//for

    __enable_irq(); // enable interrupt

    return(0);//リターン
}

//メイン
int main() {


    //無限ループ
    while(1){

        for(int ii=0;ii<9;ii++){
            l[ii] = rand()%52;
        }//for

        //ws2812bへデータを送る
        ws_led(9);

        //1秒待つ
        wait_ms(100);

    } //while

} //main