ARM Mbed快速入门:面向初学者的现代微控制器开发

哈Ha

Arduino平台的传统独特优势被称为(现在有时被称为,尽管这已经是错误的了-我们将讨论原因)将进入微控制器开发的门槛降低到了C / C ++和电子学的基本知识水平,规模为“以正确的极性连接LED”。

询问任何活跃的Arduino支持者,他们会迅速向您解释您可以在STM32或nRF52下编写的内容,但是并没有真正的好处,但是不眠之夜在数百页的数据表和无休止的名称长的函数表中等待着您。

确实很难高估Arduino在降低入门门槛方面的优点-这个平台诞生于零年中,并且在2010年之后在业余爱好者中受到了广泛欢迎。 当时没有特别的选择-基于Cortex-M内核的处理器刚刚出现,与AVR相比,即使对于专业开发人员来说,它们也相当复杂,而且大多数供应商的调试板成本都在数百美元或以上(通常,该行业的价格很昂贵)在$ 500的$ 5控制器上进行调试,我对任何人都不感到惊讶。

但是,Arduino的最大问题在于,它在过去10多年的发展与某些AvtoVAZ模型极为相似:


由于我现在打算作进一步的介绍,所以您可以想象实际的部分,所以我将给出程序的全文,包括STM32处理器的初始化和LED的闪烁。 该程序是为ARM Mbed OS编写的:

#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/zh-CN420435/


All Articles