LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-23

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

目的
GPIOのテスト

STM32L010F4P6

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

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

h_con69.jpg




//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



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0