Initial Release
This commit is contained in:
35
pio/squarewave/CMakeLists.txt
Normal file
35
pio/squarewave/CMakeLists.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
add_executable(pio_squarewave)
|
||||
|
||||
pico_generate_pio_header(pio_squarewave ${CMAKE_CURRENT_LIST_DIR}/squarewave.pio)
|
||||
pico_generate_pio_header(pio_squarewave ${CMAKE_CURRENT_LIST_DIR}/squarewave_wrap.pio)
|
||||
pico_generate_pio_header(pio_squarewave ${CMAKE_CURRENT_LIST_DIR}/squarewave_fast.pio)
|
||||
|
||||
target_sources(pio_squarewave PRIVATE squarewave.c)
|
||||
|
||||
target_link_libraries(pio_squarewave PRIVATE pico_stdlib hardware_pio)
|
||||
pico_add_extra_outputs(pio_squarewave)
|
||||
|
||||
# add url via pico_set_program_url
|
||||
example_auto_set_url(pio_squarewave)
|
||||
|
||||
# generate .hex file and .pio.h file for the RP2040 datasheet (to make sure
|
||||
# the datasheet always shows the output of the latest pioasm version)
|
||||
add_custom_target(pio_squarewave_datasheet DEPENDS
|
||||
Pioasm
|
||||
${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.hex
|
||||
${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.pio.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/generated/squarewave_wrap.pio.h
|
||||
)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.hex
|
||||
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/squarewave.pio
|
||||
COMMAND Pioasm -o hex ${CMAKE_CURRENT_LIST_DIR}/squarewave.pio ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.hex
|
||||
)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.pio.h
|
||||
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/squarewave.pio
|
||||
COMMAND Pioasm ${CMAKE_CURRENT_LIST_DIR}/squarewave.pio ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave.pio.h
|
||||
)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave_wrap.pio.h
|
||||
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/squarewave_wrap.pio
|
||||
COMMAND Pioasm ${CMAKE_CURRENT_LIST_DIR}/squarewave_wrap.pio ${CMAKE_CURRENT_LIST_DIR}/generated/squarewave_wrap.pio.h
|
||||
)
|
||||
add_dependencies(pio_squarewave pio_squarewave_datasheet)
|
||||
4
pio/squarewave/generated/squarewave.hex
Normal file
4
pio/squarewave/generated/squarewave.hex
Normal file
@@ -0,0 +1,4 @@
|
||||
e081
|
||||
e101
|
||||
e000
|
||||
0001
|
||||
38
pio/squarewave/generated/squarewave.pio.h
Normal file
38
pio/squarewave/generated/squarewave.pio.h
Normal file
@@ -0,0 +1,38 @@
|
||||
// -------------------------------------------------- //
|
||||
// This file is autogenerated by pioasm; do not edit! //
|
||||
// -------------------------------------------------- //
|
||||
|
||||
#if !PICO_NO_HARDWARE
|
||||
#include "hardware/pio.h"
|
||||
#endif
|
||||
|
||||
// ---------- //
|
||||
// squarewave //
|
||||
// ---------- //
|
||||
|
||||
#define squarewave_wrap_target 0
|
||||
#define squarewave_wrap 3
|
||||
|
||||
static const uint16_t squarewave_program_instructions[] = {
|
||||
// .wrap_target
|
||||
0xe081, // 0: set pindirs, 1
|
||||
0xe101, // 1: set pins, 1 [1]
|
||||
0xe000, // 2: set pins, 0
|
||||
0x0001, // 3: jmp 1
|
||||
// .wrap
|
||||
};
|
||||
|
||||
#if !PICO_NO_HARDWARE
|
||||
static const struct pio_program squarewave_program = {
|
||||
.instructions = squarewave_program_instructions,
|
||||
.length = 4,
|
||||
.origin = -1,
|
||||
};
|
||||
|
||||
static inline pio_sm_config squarewave_program_get_default_config(uint offset) {
|
||||
pio_sm_config c = pio_get_default_sm_config();
|
||||
sm_config_set_wrap(&c, offset + squarewave_wrap_target, offset + squarewave_wrap);
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
|
||||
37
pio/squarewave/generated/squarewave_wrap.pio.h
Normal file
37
pio/squarewave/generated/squarewave_wrap.pio.h
Normal file
@@ -0,0 +1,37 @@
|
||||
// -------------------------------------------------- //
|
||||
// This file is autogenerated by pioasm; do not edit! //
|
||||
// -------------------------------------------------- //
|
||||
|
||||
#if !PICO_NO_HARDWARE
|
||||
#include "hardware/pio.h"
|
||||
#endif
|
||||
|
||||
// --------------- //
|
||||
// squarewave_wrap //
|
||||
// --------------- //
|
||||
|
||||
#define squarewave_wrap_wrap_target 1
|
||||
#define squarewave_wrap_wrap 2
|
||||
|
||||
static const uint16_t squarewave_wrap_program_instructions[] = {
|
||||
0xe081, // 0: set pindirs, 1
|
||||
// .wrap_target
|
||||
0xe101, // 1: set pins, 1 [1]
|
||||
0xe100, // 2: set pins, 0 [1]
|
||||
// .wrap
|
||||
};
|
||||
|
||||
#if !PICO_NO_HARDWARE
|
||||
static const struct pio_program squarewave_wrap_program = {
|
||||
.instructions = squarewave_wrap_program_instructions,
|
||||
.length = 3,
|
||||
.origin = -1,
|
||||
};
|
||||
|
||||
static inline pio_sm_config squarewave_wrap_program_get_default_config(uint offset) {
|
||||
pio_sm_config c = pio_get_default_sm_config();
|
||||
sm_config_set_wrap(&c, offset + squarewave_wrap_wrap_target, offset + squarewave_wrap_wrap);
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
|
||||
72
pio/squarewave/squarewave.c
Normal file
72
pio/squarewave/squarewave.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
// Output a 12.5 MHz square wave (if system clock frequency is 125 MHz).
|
||||
//
|
||||
// Note this program is accessing the PIO registers directly, for illustrative
|
||||
// purposes. We pull this program into the datasheet so we can talk a little
|
||||
// about PIO's hardware register interface. The `hardware_pio` SDK library
|
||||
// provides simpler or better interfaces for all of these operations.
|
||||
//
|
||||
// _*This is not best practice! I don't want to see you copy/pasting this*_
|
||||
//
|
||||
// For a minimal example of loading and running a program using the SDK
|
||||
// functions (which is what you generally want to do) have a look at
|
||||
// `hello_pio` instead. That example is also the subject of a tutorial in the
|
||||
// SDK book, which walks you through building your first PIO program.
|
||||
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
|
||||
// Our assembled program:
|
||||
#include "squarewave.pio.h"
|
||||
|
||||
int main() {
|
||||
// Pick one PIO instance arbitrarily. We're also arbitrarily picking state
|
||||
// machine 0 on this PIO instance (the state machines are numbered 0 to 3
|
||||
// inclusive).
|
||||
PIO pio = pio0;
|
||||
|
||||
/// \tag::load_program[]
|
||||
// Load the assembled program directly into the PIO's instruction memory.
|
||||
// Each PIO instance has a 32-slot instruction memory, which all 4 state
|
||||
// machines can see. The system has write-only access.
|
||||
for (int i = 0; i < count_of(squarewave_program_instructions); ++i)
|
||||
pio->instr_mem[i] = squarewave_program_instructions[i];
|
||||
/// \end::load_program[]
|
||||
|
||||
/// \tag::clock_divider[]
|
||||
// Configure state machine 0 to run at sysclk/2.5. The state machines can
|
||||
// run as fast as one instruction per clock cycle, but we can scale their
|
||||
// speed down uniformly to meet some precise frequency target, e.g. for a
|
||||
// UART baud rate. This register has 16 integer divisor bits and 8
|
||||
// fractional divisor bits.
|
||||
pio->sm[0].clkdiv = (uint32_t) (2.5f * (1 << 16));
|
||||
/// \end::clock_divider[]
|
||||
|
||||
/// \tag::setup_pins[]
|
||||
// There are five pin mapping groups (out, in, set, side-set, jmp pin)
|
||||
// which are used by different instructions or in different circumstances.
|
||||
// Here we're just using SET instructions. Configure state machine 0 SETs
|
||||
// to affect GPIO 0 only; then configure GPIO0 to be controlled by PIO0,
|
||||
// as opposed to e.g. the processors.
|
||||
pio->sm[0].pinctrl =
|
||||
(1 << PIO_SM0_PINCTRL_SET_COUNT_LSB) |
|
||||
(0 << PIO_SM0_PINCTRL_SET_BASE_LSB);
|
||||
gpio_set_function(0, GPIO_FUNC_PIO0);
|
||||
/// \end::setup_pins[]
|
||||
|
||||
/// \tag::start_sm[]
|
||||
// Set the state machine running. The PIO CTRL register is global within a
|
||||
// PIO instance, so you can start/stop multiple state machines
|
||||
// simultaneously. We're using the register's hardware atomic set alias to
|
||||
// make one bit high without doing a read-modify-write on the register.
|
||||
hw_set_bits(&pio->ctrl, 1 << (PIO_CTRL_SM_ENABLE_LSB + 0));
|
||||
/// \end::start_sm[]
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
13
pio/squarewave/squarewave.pio
Normal file
13
pio/squarewave/squarewave.pio
Normal file
@@ -0,0 +1,13 @@
|
||||
;
|
||||
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
.program squarewave
|
||||
set pindirs, 1 ; Set pin to output
|
||||
again:
|
||||
set pins, 1 [1] ; Drive pin high and then delay for one cycle
|
||||
set pins, 0 ; Drive pin low
|
||||
jmp again ; Set PC to label `again`
|
||||
|
||||
19
pio/squarewave/squarewave_fast.pio
Normal file
19
pio/squarewave/squarewave_fast.pio
Normal file
@@ -0,0 +1,19 @@
|
||||
;
|
||||
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
; Note that if you modify squarewave.c to include this program, you'll also
|
||||
; need to set the wrap registers yourself. This would be handled for you by
|
||||
; squarewave_program_get_default_config().
|
||||
|
||||
|
||||
.program squarewave_fast
|
||||
; Like squarewave_wrap, but remove the delay cycles so we can run twice as fast.
|
||||
set pindirs, 1 ; Set pin to output
|
||||
.wrap_target
|
||||
set pins, 1 ; Drive pin high
|
||||
set pins, 0 ; Drive pin low
|
||||
.wrap
|
||||
|
||||
19
pio/squarewave/squarewave_wrap.pio
Normal file
19
pio/squarewave/squarewave_wrap.pio
Normal file
@@ -0,0 +1,19 @@
|
||||
;
|
||||
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
; Note that if you modify squarewave.c to include this program, you'll also
|
||||
; need to set the wrap registers yourself. This would be handled for you by
|
||||
; squarewave_program_get_default_config().
|
||||
|
||||
.program squarewave_wrap
|
||||
; Like squarewave, but use the state machine's .wrap hardware instead of an
|
||||
; explicit jmp. This is a free (0-cycle) unconditional jump.
|
||||
|
||||
set pindirs, 1 ; Set pin to output
|
||||
.wrap_target
|
||||
set pins, 1 [1] ; Drive pin high and then delay for one cycle
|
||||
set pins, 0 [1] ; Drive pin low and then delay for one cycle
|
||||
.wrap
|
||||
Reference in New Issue
Block a user