Schnellstart mit ARM Mbed: Entwicklung moderner Mikrocontroller fĂŒr AnfĂ€nger

Hallo Habr.

Der traditionelle einzigartige Vorteil der Arduino-Plattform wurde genannt (und jetzt wird er manchmal genannt, obwohl dies bereits falsch ist - und wir werden darĂŒber sprechen, warum), indem der Schwellenwert fĂŒr den Einstieg in die Entwicklung von Mikrocontrollern auf das Niveau der Grundkenntnisse von C / C ++ und Elektronik in der Skala „Verbinden Sie die LED mit der richtigen PolaritĂ€t“ gesenkt wurde.

Fragen Sie nach jedem aktiven Arduino-UnterstĂŒtzer, und er wird Ihnen schnell erklĂ€ren, was Sie natĂŒrlich unter STM32 oder nRF52 schreiben können, aber es gibt keinen wirklichen Vorteil, aber schlaflose NĂ€chte erwarten Sie ĂŒber Hunderte von Seiten mit DatenblĂ€ttern und endlosen FunktionsblĂ€ttern mit langen, obskuren Namen.

Es ist wirklich schwer, die VorzĂŒge von Arduino bei der Senkung der Eintrittsschwelle zu ĂŒberschĂ€tzen - diese Plattform wurde Mitte der Null-Jahre geboren und gewann nach 2010 bei Amateuren ernsthafte PopularitĂ€t. Zu dieser Zeit gab es keine speziellen Alternativen - Prozessoren, die auf Cortex-M-Kernen basierten, erschienen gerade, im Vergleich zu AVR waren sie selbst fĂŒr professionelle Entwickler ziemlich kompliziert, und Debugging-Boards fĂŒr die meisten Anbieter kosteten Hunderte von Dollar oder mehr (und im Allgemeinen den Preis in der Branche FĂŒr das Debuggen auf einem 5-Dollar-Controller bei 500 Dollar war ich von niemandem sehr ĂŒberrascht.

Das große Problem bei Arduino ist jedoch, dass seine Entwicklung in den letzten mehr als 10 Jahren einigen AvtoVAZ-Modellen am Ă€hnlichsten ist:


Da ich jetzt eine lange EinfĂŒhrung vorhabe, damit Sie sich vorstellen können, was der praktische Teil sein wird, werde ich den vollstĂ€ndigen Text des Programms geben, einschließlich der Initialisierung des STM32-Prozessors und des Blinkens der LED. Das Programm ist fĂŒr das ARM Mbed-Betriebssystem geschrieben:

#include "mbed.h"
DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(0.2); // 200 ms
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
    }
}

? ? ? ? , .

, 2010 
 . AVR, 8- , — 2017 12 % ( Aspencore), : AVR, PIC STM8. , — , ..

ATMega 12 % — 32- Cortex-M / (STM32F030 16-64 4-8 30-50 ). , - .


64- — , , Cortex-A

. , , Cortex-M ? ( , — ), . AVR , STM32F1 STM32L1 , - Infineon NXP


, — , STMicro : SPL, HAL LL. , , , .

.

, . , — , , , . , (, , , loop(), , - — , - , - ).


— , « », :

  • HAL — . . , -, (, , - STM32L072, STM32L151 STM32L451 — , ), -, ( , , , STM32, , ). — , RIOT API SAUL, ; , - .
  • — , , - . , , .
  • — , . , . , , , . , .
  • IPC — . , , , , , , , , , - - (, , : , , , , ).
  • — API , , . , , , , , , , API .
  • — « » .

, — API POSIX.

, . , :

  • FreeRTOS — , , . — . ( , )
  • Contiki OS — , , , 6LoWPAN. , (, ). Contiki NG — , .
  • RIOT OS — , Contiki. ( ATMega) . . C. , , . , , .
  • ARM Mbed — ( , Apache 2.0) ARM Holdings. 2.0, 5.x. C++ API. , . , Mbed.
  • TI-RTOS — Texas Instruments, , TI - , , . , API .

- , arm-none-eabi-gcc. , RIOT Makefile', Visual Studio, . ARM Mbed (mbed-cli), PlatformIO, mbed-cli Keil uVision Makefiles.

— , Arduino. , gdb JTAG/SWD-.


, ? , ?

. . , .

, RIOT OS « » :

  1. MinGW, arm-none-eabi-gcc GNU make ( Windows 10 , Ubuntu)
  2. RIOT
  3. cd RIOT/examples/hello-world
  4. make BOARD=nucleo-l152re
  5. HEX- Nucleo ( ST-Link )

, main.c, :

#include <stdio.h>

int main(void)
{
    puts("Hello World!");

    printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD);
    printf("This board features a(n) %s MCU.\n", RIOT_MCU);

    return 0;
}

? , ? SPL? , ?

.

, . — ARM Mbed .


( , , b2b-, Nucleo-L152RE BME280 OPT3001)



1) mbed.com.

2) «Compiler» - . , . , «Add board» Nucleo, ( L152RE, , Nucleo, ). , Nucleo .



3) New → New Program. Mbed - , Nucleo-L152 . , , 5.9.5, — «Empty program».

— -, mbed, -, - main.cpp. #include, mbed-os.

:

  • «Import», «Click here to import from URL», ( , Mbed, )
  • «Library»
  • «Import»



→ «New file» → main.cpp. :

#include "mbed.h"

DigitalOut led(LED1);

int main()
{
    printf("Hello World !\n");

    while(1) {
        wait(1); // 1 second
        led = !led; // Toggle LED
    }
}

(LED1 — Nucleo )

4) Ctrl-D ( «Compile»), -, . Nucleo USB- ( : Nucleo mini-USB, ), 540 «Node_L152RE». MBED.HTM, , .

, , BIN- HEX- , Mbed , .

. Nucleo , — LED1.

5) BME280, ? , «Import Library» (, , , — ). , Library, («Target path»).



, , .

6) , :

#include "mbed.h"
#include "BME280.h"

DigitalOut led(LED1);
BME280 sensor_bme(D14, D15);

int main()
{
    while(1) {
        wait(1); // 1 second
        led = !led; // Toggle LED
        printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity());
    }
}

, , , Nucleo I2C-. , .. SDA SCL ( STM32L1 I2C, ), , , I2C_SDA I2C_SCL . .

7) . — +3,3 , , SDA, SCL. STM32, 3,3-, .



8) «Compile», BIN- Nucleo.

8) ??????

( — Termite, , Nucleo; COM-. 9600 /)

9) PROFIT!!!



. , , « , », , .

— , . -, , while(1) 1- — , 1 , 1 , .

-, 9600 / — - , 2018 , 115200.

: Serial, , .

Serial pc(SERIAL_TX, SERIAL_RX);
pc.baud(115200);

while(1) , , . Mbed , (EventQueue), ( call) ( call_every), .

:

#include "mbed.h"
#include "BME280.h"

DigitalOut led(LED1);
BME280 sensor_bme(D14, D15);
EventQueue eventQueue(/* event count */ 50 * EVENTS_EVENT_SIZE);

void printTemperature(void)
{
    printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity());
    led = !led; // Toggle LED
}

int main()
{
    eventQueue.call_every(1000, printTemperature); // run every 1000 ms
    eventQueue.dispatch_forever();
    
    return 0;
}

, . , ( ), — , - . eventQueue ( — , 50 ), , , , .

?

, while(1) , .

, OPT3001. , 


OPT3001 — ( , ), TSL2561 , Mbed . , ( ), — https://github.com/ashok-rao/mbed-OPT3001.

Import, «Click here to import from URL», URL , «Library» — «Import».

. .

, . , « OPT3001.cpp, », ( , OPT3001).

: Import → Click here to import from URL → github.com/olegart/mbed_opt3001 → Library → Target Path = → Import.

:

#include "mbed.h"
#include "BME280.h"
#include "OPT3001.h"

DigitalOut led(LED1);
BME280 sensor_bme(D14, D15);
OPT3001 sensor_opt(D14, D15);
EventQueue eventQueue(/* event count */ 50 * EVENTS_EVENT_SIZE);
Serial pc(SERIAL_TX, SERIAL_RX);

void printTemperature(void)
{
    pc.printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity());
    
    pc.printf("%ld lux\r\n", sensor_opt.readSensor());
    
    led = !led; // Toggle LED
}

int main()
{
    pc.baud(115200);
    
    eventQueue.call_every(1000, printTemperature); // run every 1000 ms
    eventQueue.dispatch_forever();
    
    return 0;
}

Compile, , Nucleo, 115200




PROFIT!!!

:


, , , — , .

, , , . , , .

Nucleo «IDD», , , ( , — , ).



L152 10 , - LED1, ( 2-3 ). - , , ?..

, . , , , — , , eventQueue.call_every , . STM32L151 , — , RTC ( L151CB-A , RTC_SSR), — .

, dispatch_forever(), — , , , , .

, ? , , — ?

LowPowerTicker, RTC, — . LowPowerTicker, sleep() — ( , , , — , , - , , ).

: , - — , ( OPT3001, , 100 ). printf — , . , , .

, while(1), — . , while(1) ?

, EventQueue, .

#include "mbed.h"
#include "BME280.h"
#include "OPT3001.h"

DigitalOut led(LED1);
BME280 sensor_bme(D14, D15);
OPT3001 sensor_opt(D14, D15);
EventQueue eventQueue(/* event count */ 50 * EVENTS_EVENT_SIZE);
Serial pc(SERIAL_TX, SERIAL_RX);
LowPowerTicker lpTicker;

void printTemperature(void)
{
    pc.printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity());
    pc.printf("%ld lux\r\n", sensor_opt.readSensor());        
    led = !led; // Toggle LED
}

void tickerIRQ (void)
{
    eventQueue.call(printTemperature);
}

int main()
{
    pc.baud(115200);
    
    lpTicker.attach(tickerIRQ, 1); // every second
    
    while(1)
    {
        eventQueue.dispatch(0);
        sleep();
    }
}

? : Low Power Ticker, . , eventQueue.call, ( , .. , — call ). .call , while(1), — dispatch , , sleep(), .

.

→ → → call → → dispatch → → sleep() .

PROFIT???



PROFIT!!!

( , 0,57 — , . Mbed, , STM32L1: Digital In , Analog In , - - . , Nucleo JTAG -)

- . , « RTOS» , , .

— 55,1 9,2 ( , «Build details» ), — , 2- STM32F103CB 128 20 . , , STM32F030F4P6 16 4 — RIOT OS .

, , float printf . — , . malloc , malloc .

P.S. —  Mbed.

P.P.S. : Nucleo-L152RE ( Nucleo / Discovery , , — , , ), BME280 (: , , , BMP280, ). OPT3001 — , TI .


, RTOS , — Mbed , , - , RIOT 2018.07 ( ), .

, Arduino « », — , , , - ( , , ).

, , . , , , — , . , « », — , , , , 2018 , , , , - .

, — , . , , . .

, , . - , AVR.






?!

, 2018 ! ?

Source: https://habr.com/ru/post/de420435/


All Articles