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 « » :
- MinGW, arm-none-eabi-gcc GNU make ( Windows 10 , Ubuntu)
- RIOT
- cd RIOT/examples/hello-world
- make BOARD=nucleo-l152re
- 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 ! ?