树莓派庆祝 Raspberry Pi Pico 发布一周年

树莓派 PICO 和 RP2040 相关应用讨论
回复

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 树莓派庆祝 Raspberry Pi Pico 发布一周年

#2

帖子 shaoziyang »

Raspberry Pi Pico 已经支持下面开发软件:
  • C
  • micropython
  • CircuitPython
  • Javascript
  • Arduino
  • Rust
  • Go
  • FreeRTOS

C


Raspberry Pi Pico C/C++ SDK 是 Pico 和其他基于 RP2040 硬件的基础。

代码: 全选

#include "pico/stdlib.h"

const uint LED_PIN = 25;

int main() {
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (1) {
        gpio_put(LED_PIN, 0);
        sleep_ms(250);
        gpio_put(LED_PIN, 1);
        sleep_ms(1000);
    }
}

MicroPython


在去年 1 月,MicroPython 的官方移植是与 Raspberry Pi Pico 、C SDK 同时发布的。

代码: 全选

from machine import Pin, Timer
led = Pin(25, Pin.OUT)
timer = Timer()

def blink(timer):
    led.toggle()

timer.init(freq=2.5, mode=Timer.PERIODIC, callback=blink)
CircuitPython


另一种在 Raspberry Pi Pico 和其他基于RP2040板上运行的 Python 是CircuitPython。CircuitPython 在去年与 Pico 一起发布,虽然它与MicroPython 有些相似,但也有一些区别。


如果需要使用中断和线程等高级功能,或者需要在 Python 中完全访问RP2040的可编程 I/O(PIO),一般需要使用 MicroPython。而对于传感器和 USB,会推荐 CircuitPython。它得到 Adafruit 的大力支持。

代码: 全选

import time
import board
import digitalio

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

Javascript


Kaluma 是一个微型 JavaScript 运行时,适用于由 JerryScript 提供支持的微控制器,最近刚发布。如果您是熟悉 Node.js 的 JavaScript 开发人员,现在无需学习新语言即可使用 Raspberry Pi Pico。


有一些关于如何开始使用 Kaluma 及其 Web 开发环境的优秀文档,或者如果您更喜欢在本地开发而不是在浏览器中开发,可以使用命令行界面。

代码: 全选

var led = 25;
pinMode(led, OUTPUT);

setInterval(() => {
  digitalToggle(led);
}, 1000);

Arduino


有趣的是,Arduino 内核实际上有两个完全独立的版本,分别针对 RP2040 芯片和 Raspberry Pi Pico。

首先出现的是基于纯 C SDK 的社区移植版,以及一个基于 GCC 10.3 和 Newlib 4.0 的自定义工具链。有相关大量文档介绍如何开始使用社区版本以及如何将其与正在进行的 PlatformIO 集成 。

Arduino 官方版本是在社区版本移植几周后发布的,与许多最近的 Arduino 平台移植一样,核心基于 Arm Mbed 而不是直接 C SDK。如果已经安装了 Arduino 环境,则可以直接通过 Boards Manager 菜单安装官方 RP2040 版本。

无论哪种方式,使板载 LED 闪烁的代码完全相同。

代码: 全选

#define LED 25

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(1000);
  digitalWrite(LED, LOW);
  delay(1000);
}

Rust


作为 Raspberry Pi Pico 发布后最早出现的产品之一,Rust 现在对 RP2040 的支持相当成熟,带有用于 RP2040 芯片的硬件抽象层 (HAL),以及用于许多基于 RP2040 开发板的板级支持包,当然也包括了 Raspberry Pi Pico 。除此之外,还有一个项目模板,可以作为基于 RP2040 HAL 开发的起点。

对于那些还不熟悉 Rust 的人来说,没有大量的入门文档,但有一些很好的教程。

代码: 全选

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use defmt::*;
use defmt_rtt as _;
use embedded_hal::digital::v2::OutputPin;
use embedded_time::fixed_point::FixedPoint;
use panic_probe as _;
use rp2040_hal as hal;

use hal::{
    clocks::{init_clocks_and_plls, Clock},
    pac,
    io::Sio,
    watchdog::Watchdog,
};

#[link_section = ".boot2"]
#[used]
pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;

#[entry]
fn main() -> ! {
    let mut pac = pac::Peripherals::take().unwrap();
    let core = pac::CorePeripherals::take().unwrap();
    let mut watchdog = Watchdog::new(pac.WATCHDOG);
    let sio = Sio::new(pac.SIO);

    let external_xtal_freq_hz = 12_000_000u32;
    let clocks = init_clocks_and_plls(
        external_xtal_freq_hz,
        pac.XOSC,
        pac.CLOCKS,
        pac.PLL_SYS,
        pac.PLL_USB,
        &mut pac.RESETS,
        &mut watchdog,
    )
    .ok()
    .unwrap();

    let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().integer()
);

    let pins = hal::gpio::Pins::new(
        pac.IO_BANK0,
        pac.PADS_BANK0,
        sio.gpio_bank0,
        &mut pac.RESETS,
    );

    let mut led_pin = pins.gpio25.into_push_pull_output();

    loop {
        led_pin.set_high().unwrap();
        delay.delay_ms(500);
        led_pin.set_low().unwrap();
        delay.delay_ms(500);
    }
}

Lua


作为 Espressif ESP8266 芯片的一些早期社区构建的固件,嵌入式硬件上的 Lua 越来越受欢迎。随着 NodeMCU 的到来,ESP8266 不仅仅是为其他微控制器提供廉价 WiFi 连接的一种方式;它本身就成为了一个微控制器。

目前 Lua 环境仍处于概念验证阶段,但可以从 Github 项目存储库的源代码进行构建和查看文档。除了 Lua 运行时,该项目还包括一个基本的shell,可以接受类似 Linux 的命令、一个全屏编辑器和基本的文件管理工具。它支持数字 I/O、模拟输入、I2C 读写和硬件 PWM 的通用、轮询、GPIO 操作。它在一个核心上运行,让另一个核心空闲。目前不支持 DMA、中断、线程或多核操作。

只需几行代码即可闪烁 LED

代码: 全选

gpio_pin = 25
pico.gpio_set_function (gpio_pin, GPIO_FUNC_SIO)
pico.gpio_set_dir (gpio_pin, GPIO_OUT)
while true do
  pico.gpio_put (gpio_pin, HIGH)
  pico.sleep_ms (300)
  pico.gpio_put (gpio_pin, LOW)
  pico.sleep_ms (300)
end

Go


TinyGo 通过创建基于 LLVM 的新编译器将 Go 编程语言引入嵌入式系统。有据入门文档,YouTube 上还有一个很棒的演示,可帮助您开始闪烁 LED。

代码: 全选

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 500)

        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}

FreeRTOS[/code]


FreeRTOS 不是一种语言,它是一个完整的微控制器实时操作系统 (RTOS), 支持RP2040的两个内核的SMP。


代码: 全选

#include <FreeRTOS.h>
#include <task.h>
#include <stdio.h>
#include "pico/stdlib.h"


void led_task() {
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (true) {
        gpio_put(LED_PIN, 1);
        vTaskDelay(100);
        gpio_put(LED_PIN, 0);
        vTaskDelay(100);
    }
}

int main() {
    stdio_init_all();

    xTaskCreate(led_task, "LED_Task", 256, NULL, 1, NULL);
    vTaskStartScheduler();

    while(1){};
}

此外,.NET 、Forth、Ada 等语言也在进行移植了。

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 树莓派庆祝 Raspberry Pi Pico 发布一周年

#3

帖子 shaoziyang »

爱好者们补充的开发语言:

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章