forked from raspberrypi/pico-examples
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 4607874
Showing
245 changed files
with
21,157 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
.idea | ||
.vscode | ||
_deps | ||
cmake-* | ||
build | ||
.DS_Store | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
cmake_minimum_required(VERSION 3.12) | ||
|
||
# Pull in PICO SDK (must be before project) | ||
include(pico_sdk_import.cmake) | ||
|
||
project(pico_examples C CXX ASM) | ||
set(CMAKE_C_STANDARD 11) | ||
set(CMAKE_CXX_STANDARD 17) | ||
|
||
set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR}) | ||
|
||
# Initialize the SDK | ||
pico_sdk_init() | ||
|
||
include(example_auto_set_url.cmake) | ||
# Add blink example | ||
add_subdirectory(blink) | ||
|
||
# Add hello world example | ||
add_subdirectory(hello_world) | ||
|
||
# Hardware-specific examples in subdirectories: | ||
add_subdirectory(adc) | ||
add_subdirectory(clocks) | ||
add_subdirectory(cmake) | ||
add_subdirectory(divider) | ||
add_subdirectory(dma) | ||
add_subdirectory(flash) | ||
add_subdirectory(gpio) | ||
add_subdirectory(i2c) | ||
add_subdirectory(interp) | ||
add_subdirectory(multicore) | ||
add_subdirectory(picoboard) | ||
add_subdirectory(pio) | ||
add_subdirectory(pwm) | ||
add_subdirectory(reset) | ||
add_subdirectory(rtc) | ||
add_subdirectory(spi) | ||
add_subdirectory(system) | ||
add_subdirectory(timer) | ||
add_subdirectory(uart) | ||
add_subdirectory(usb) | ||
add_subdirectory(watchdog) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
Copyright 2020 (c) 2020 Raspberry Pi (Trading) Ltd. | ||
|
||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the | ||
following conditions are met: | ||
|
||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following | ||
disclaimer. | ||
|
||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following | ||
disclaimer in the documentation and/or other materials provided with the distribution. | ||
|
||
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products | ||
derived from this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, | ||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
# PICO SDK Examples | ||
|
||
## Getting started | ||
|
||
See [Getting Started with the Raspberry Pi Pico](https://rptl.io/pico-get-started) and the README in the [pico-sdk](https://github.com/raspberrypi/pico-sdk) for information | ||
on getting up and running. | ||
|
||
### First Examples | ||
|
||
App | Description | Link to prebuilt UF2 | ||
---|---|--- | ||
[hello_serial](hello_world/serial) | The obligatory Hello World program for Pico (Output over serial version) | https://rptl.io/pico-hello-serial | ||
[hello_usb](hello_world/usb) | The obligatory Hello World program for Pico (Output over USB version) | https://rptl.io/pico-hello-usb | ||
[blink](blink) | Blink an LED on and off. | https://rptl.io/pico-blink | ||
|
||
### ADC | ||
|
||
App|Description | ||
---|--- | ||
[hello_adc](adc/hello_adc)|Display the voltage from an ADC input. | ||
[joystick_display](adc/joystick_display)|Display a Joystick X/Y input based on two ADC inputs. | ||
[adc_console](adc/adc_console)|An interactive shell for playing with the ADC. Includes example of free-running capture mode. | ||
|
||
### Clocks | ||
|
||
App|Description | ||
---|--- | ||
[hello_48MHz](clocks/hello_48MHz)| Change the system clock frequency to 48 MHz while running. | ||
[hello_gpout](clocks/hello_gpout)| Use the general purpose clock outputs (GPOUT) to drive divisions of internal clocks onto GPIO outputs. | ||
[hello_resus](clocks/hello_resus)| Enable the clock resuscitate feature, "accidentally" stop the system clock, and show how we recover. | ||
|
||
### CMake | ||
|
||
App|Description | ||
---|--- | ||
[build_variants](cmake/build_variants)| Builds two version of the same app with different configurations | ||
|
||
### DMA | ||
|
||
App|Description | ||
---|--- | ||
[hello_dma](dma/hello_dma)| Use the DMA to copy data in memory. | ||
[control_blocks](dma/control_blocks)| Build a control block list, to program a longer sequence of DMA transfers to the UART. | ||
[channel_irq](dma/channel_irq)| Use an IRQ handler to reconfigure a DMA channel, in order to continuously drive data through a PIO state machine. | ||
|
||
|
||
### Flash | ||
|
||
App|Description | ||
---|--- | ||
[cache_perfctr](flash/cache_perfctr)| Read and clear the cache performance counters. Show how they are affected by different types of flash reads. | ||
[nuke](flash/nuke)| Obliterate the contents of flash. An example of a NO_FLASH binary (UF2 loaded directly into SRAM and runs in-place there). A useful utility to drag and drop onto your Pico if the need arises. | ||
[program](flash/program)| Erase a flash sector, program one flash page, and read back the data. | ||
[xip_stream](flash/xip_stream)| Stream data using the XIP stream hardware, which allows data to be DMA'd in the background whilst executing code from flash. | ||
[ssi_dma](flash/ssi_dma)| DMA directly from the flash interface (continuous SCK clocking) for maximum bulk read performance. | ||
|
||
### GPIO | ||
|
||
App|Description | ||
---|--- | ||
[hello_7segment](gpio/hello_7segment) | Use the GPIOs to drive a seven segment LED display. | ||
[hello_gpio_irq](gpio/hello_gpio_irq) | Register an interrupt handler to run when a GPIO is toggled. | ||
[dht_sensor](gpio/dht_sensor) | Use GPIO to bitbang the serial protocol for a DHT temperature/humidity sensor. | ||
|
||
See also: [blink](blink), blinking an LED attached to a GPIO. | ||
|
||
### HW divider | ||
|
||
App|Description | ||
---|--- | ||
[hello_divider](divider) | Show how to directly access the hardware integer dividers, in case AEABI injection is disabled. | ||
|
||
|
||
### I2C | ||
|
||
App|Description | ||
---|--- | ||
[bus_scan](i2c/bus_scan) | Scan the I2C bus for devices and display results. | ||
[lcd_1602_i2c](i2c/lcd_1602_i2c) | Display some text on a generic 16x2 character LCD display, via I2C. | ||
[mpu6050_i2c](i2c/mpu6050_i2c) | Read acceleration and angular rate values from a MPU6050 accelerometer/gyro, attached to an I2C bus. | ||
|
||
### Interpolator | ||
|
||
App|Description | ||
---|--- | ||
[hello_interp](interp/hello_interp) | A bundle of small examples, showing how to access the core-local interpolator hardware, and use most of its features. | ||
|
||
### Multicore | ||
|
||
App|Description | ||
---|--- | ||
[hello_multicore](multicore/hello_multicore) | Launch a function on the second core, printf some messages on each core, and pass data back and forth through the mailbox FIFOs. | ||
[multicore_fifo_irqs](multicore/multicore_fifo_irqs) | On each core, register and interrupt handler for the mailbox FIFOs. Show how the interrupt fires when that core receives a message. | ||
[multicore_runner](multicore/multicore_runner) | Set up the second core to accept, and run, any function pointer pushed into its mailbox FIFO. Push in a few pieces of code and get answers back. | ||
|
||
### Pico Board | ||
|
||
App|Description | ||
---|--- | ||
[blinky](picoboard/blinky)| Blink "hello, world" in Morse code on Pico's LED | ||
[button](picoboard/button)| Use Pico's BOOTSEL button as a regular button input, by temporarily suspending flash access. | ||
|
||
### PIO | ||
|
||
App|Description | ||
---|--- | ||
[hello_pio](pio/hello_pio)| Absolutely minimal example showing how to control an LED by pushing values into a PIO FIFO. | ||
[apa102](pio/apa102)| Rainbow pattern on on a string of APA102 addressable RGB LEDs. | ||
[differential_manchester](pio/differential_manchester)| Send and receive differential Manchester-encoded serial (BMC). | ||
[hub75](pio/hub75)| Display an image on a 128x64 HUB75 RGB LED matrix. | ||
[i2c](pio/i2c)| Scan an I2C bus. | ||
[logic_analyser](pio/logic_analyser)| Use PIO and DMA to capture a logic trace of some GPIOs, whilst a PWM unit is driving them. | ||
[manchester_encoding](pio/manchester_encoding)| Send and receive Manchester-encoded serial. | ||
[pio_blink](pio/pio_blink)| Set up some PIO state machines to blink LEDs at different frequencies, according to delay counts pushed into their FIFOs. | ||
[pwm](pio/pwm)| Pulse width modulation on PIO. Use it to gradually fade the brightness of an LED. | ||
[spi](pio/spi)| Use PIO to erase, program and read an external SPI flash chip. A second example runs a loopback test with all four CPHA/CPOL combinations. | ||
[squarewave](pio/squarewave)| Drive a fast square wave onto a GPIO. This example accesses low-level PIO registers directly, instead of using the SDK functions. | ||
[st7789_lcd](pio/st7789_lcd)| Set up PIO for 62.5 Mbps serial output, and use this to display a spinning image on a ST7789 serial LCD. | ||
[uart_rx](pio/uart_rx)| Implement the receive component of a UART serial port. Attach it to the spare Arm UART to see it receive characters. | ||
[uart_tx](pio/uart_tx)| Implement the transmit component of a UART serial port, and print hello world. | ||
[ws2812](pio/ws2812)| Examples of driving WS2812 addressable RGB LEDs. | ||
[addition](pio/addition)| Add two integers together using PIO. Only around 8 billion times slower than Cortex-M0+. | ||
|
||
### PWM | ||
|
||
App|Description | ||
---|--- | ||
[hello_pwm](pwm/hello_pwm) | Minimal example of driving PWM output on GPIOs. | ||
[led_fade](pwm/led_fade) | Fade an LED between low and high brightness. An interrupt handler updates the PWM slice's output level each time the counter wraps. | ||
[measure_duty_cycle](pwm/measure_duty_cycle) | Drives a PWM output at a range of duty cycles, and uses another PWM slice in input mode to measure the duty cycle. | ||
|
||
### Reset | ||
|
||
App|Description | ||
---|--- | ||
[hello_reset](reset/hello_reset) | Perform a hard reset on some peripherals, then bring them back up. | ||
|
||
### RTC | ||
|
||
App|Description | ||
---|--- | ||
[hello_rtc](rtc/hello_rtc) | Set a date/time on the RTC, then repeatedly print the current time, 10 times per second, to show it updating. | ||
[rtc_alarm](rtc/rtc_alarm) | Set an alarm on the RTC to trigger an interrupt at a date/time 5 seconds into the future. | ||
[rtc_alarm_repeat](rtc/rtc_alarm_repeat) | Trigger an RTC interrupt once per minute. | ||
|
||
### SPI | ||
|
||
App|Description | ||
---|--- | ||
[bme280_spi](spi/bme280_spi) | Attach a BME280 temperature/humidity/pressure sensor via SPI. | ||
[mpu9250_spi](spi/mpu9250_spi) | Attach a MPU9250 accelerometer/gyoscope via SPI. | ||
[spi_dma](spi/spi_dma) | Use DMA to transfer data both to and from the SPI simultaneously. The SPI is configured for loopback. | ||
[spi_flash](spi/spi_flash) | Erase, program and read a serial flash device attached to one of the SPI controllers. | ||
|
||
### System | ||
|
||
App|Description | ||
---|--- | ||
[hello_double_tap](system/hello_double_tap) | On dev boards with a reset button (but no BOOTSEL), a magic number in RAM can be used to enter the USB bootloader, when the reset button is pressed twice quickly. | ||
[narrow_io_write](system/narrow_io_write) | Demonstrate the effects of 8-bit and 16-bit writes on a 32-bit IO register. | ||
|
||
### Timer | ||
|
||
App|Description | ||
---|--- | ||
[hello_timer](timer/hello_timer) | Set callbacks on the system timer, which repeat at regular intervals. Cancel the timer when we're done. | ||
[periodic_sampler](timer/periodic_sampler) | Sample GPIOs in a timer callback, and push the samples into a concurrency-safe queue. Pop data from the queue in code running in the foreground. | ||
[timer_lowlevel](timer/timer_lowlevel) | Example of direct access to the timer hardware. Not generally recommended, as the SDK may use the timer for IO timeouts. | ||
|
||
### UART | ||
|
||
App|Description | ||
---|--- | ||
[hello_uart](uart/hello_uart) | Print some text from one of the UART serial ports, without going through `stdio`. | ||
[uart_advanced](uart/uart_advanced) | Use some other UART features like RX interrupts, hardware control flow, and data formats other than 8n1. | ||
|
||
### USB Device | ||
|
||
App|Description | ||
---|--- | ||
[dev_audio_headset](usb/device/dev_audio_headset) | Audio headset example from TinyUSB | ||
[dev_hid_composite](usb/device/dev_hid_composite) | Composite HID (mouse + keyboard) example from TinyUSB | ||
[dev_hid_generic_inout](usb/device/dev_hid_generic_inout) | Generic HID device example from TinyUSB | ||
[dev_lowlevel](usb/device/dev_lowlevel) | A USB Bulk loopback implemented with direct access to the USB hardware (no TinyUSB) | ||
|
||
### USB Host | ||
|
||
App|Description | ||
---|--- | ||
[host_hid](usb/host/host_hid) | Use USB in host mode to poll an attached HID keyboard (TinyUSB example) | ||
|
||
### Watchdog | ||
|
||
App|Description | ||
---|--- | ||
[hello_watchdog](watchdog/hello_watchdog) | Set the watchdog timer, and let it expire. Detect the reboot, and halt. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
if (NOT PICO_NO_HARDWARE) | ||
add_subdirectory(adc_console) | ||
add_subdirectory(hello_adc) | ||
add_subdirectory(joystick_display) | ||
endif () |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
add_executable(adc_console | ||
adc_console.c | ||
) | ||
|
||
target_link_libraries(adc_console pico_stdlib hardware_adc) | ||
|
||
# create map/bin/hex file etc. | ||
pico_add_extra_outputs(adc_console) | ||
|
||
# add url via pico_set_program_url | ||
example_auto_set_url(adc_console) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
#include <stdio.h> | ||
#include "pico/stdlib.h" | ||
#include "hardware/gpio.h" | ||
#include "hardware/adc.h" | ||
|
||
#define N_SAMPLES 1000 | ||
uint16_t sample_buf[N_SAMPLES]; | ||
|
||
void printhelp() { | ||
puts("\nCommands:"); | ||
puts("c0, ...\t: Select ADC channel n"); | ||
puts("s\t: Sample once"); | ||
puts("S\t: Sample many"); | ||
puts("w\t: Wiggle pins"); | ||
} | ||
|
||
void __not_in_flash_func(adc_capture)(uint16_t *buf, size_t count) { | ||
adc_fifo_setup(true, false, 0, false, false); | ||
adc_run(true); | ||
for (int i = 0; i < count; i = i + 1) | ||
buf[i] = adc_fifo_get_blocking(); | ||
adc_run(false); | ||
adc_fifo_drain(); | ||
} | ||
|
||
int main(void) { | ||
stdio_init_all(); | ||
adc_init(); | ||
adc_set_temp_sensor_enabled(true); | ||
|
||
// Set all pins to input (as far as SIO is concerned) | ||
gpio_set_dir_all_bits(0); | ||
for (int i = 2; i < 30; ++i) { | ||
gpio_set_function(i, GPIO_FUNC_SIO); | ||
if (i >= 26) { | ||
gpio_disable_pulls(i); | ||
gpio_set_input_enabled(i, false); | ||
} | ||
} | ||
|
||
printf("\n===========================\n"); | ||
printf("RP2040 ADC and Test Console\n"); | ||
printf("===========================\n"); | ||
printhelp(); | ||
|
||
while (1) { | ||
char c = getchar(); | ||
printf("%c", c); | ||
switch (c) { | ||
case 'c': | ||
c = getchar(); | ||
printf("%c\n", c); | ||
if (c < '0' || c > '7') { | ||
printf("Unknown input channel\n"); | ||
printhelp(); | ||
} else { | ||
adc_select_input(c - '0'); | ||
printf("Switched to channel %c\n", c); | ||
} | ||
break; | ||
case 's': { | ||
uint32_t result = adc_read(); | ||
const float conversion_factor = 3.3f / (1 << 12); | ||
printf("\n0x%03x -> %f V\n", result, result * conversion_factor); | ||
break; | ||
} | ||
case 'S': { | ||
printf("\nStarting capture\n"); | ||
adc_capture(sample_buf, N_SAMPLES); | ||
printf("Done\n"); | ||
for (int i = 0; i < N_SAMPLES; i = i + 1) | ||
printf("%03x\n", sample_buf[i]); | ||
break; | ||
} | ||
case 'w': | ||
printf("\nPress any key to stop wiggling\n"); | ||
int i = 1; | ||
gpio_set_dir_all_bits(-1); | ||
while (getchar_timeout_us(0) == PICO_ERROR_TIMEOUT) { | ||
// Pattern: Flash all pins for a cycle, | ||
// Then scan along pins for one cycle each | ||
i = i ? i << 1 : 1; | ||
gpio_put_all(i ? i : ~0); | ||
} | ||
gpio_set_dir_all_bits(0); | ||
printf("Wiggling halted.\n"); | ||
break; | ||
case '\n': | ||
case '\r': | ||
break; | ||
case 'h': | ||
printhelp(); | ||
break; | ||
default: | ||
printf("\nUnrecognised command: %c\n", c); | ||
printhelp(); | ||
break; | ||
} | ||
} | ||
} |
Oops, something went wrong.