rgbled! ( rgb -- ) sets the RGB led ($ff0000 red, $00ff00 green, $0000ff blue)
switch1? ( -- ? ) get switch1 (BACK), closed=TRUE
switch2? ( -- ? ) get switch2 (OK), closed=TRUE
switch3? ( -- ? ) get switch3 (RIGHT), closed=TRUE
switch4? ( -- ? ) get switch4 (LEFT), closed=TRUE
switch5? ( -- ? ) get switch5 (UP), closed=TRUE
switch6? ( -- ? ) get switch6 (DOWN), closed=TRUE
dport! ( n -- ) set the digital output port (D0=bit0 .. D15=bit15).
dport@ ( -- n ) get the digital input/output port (D0=bit0 .. D15=bit15).
dpin! ( n a -- ) set the digital output port pin (D0=0 .. D15=15)
dpin@ ( a -- n ) get the digital input/output port pin
dmod ( u a -- ) set the pin mode: 0 in, 1 in pull-up, 2 in pull-down, 3 out push pull, 4 out open drain,
5 out push pull PWM, 6 input capture, 7 output compare, 8 I2C
EXTImod ( u a -- ) set for pin a (D2, D4, D7, D10) the EXTI mode u: 0 rising, 1 falling, 2 both edges, 3 none
EXTIwait ( u a -- ) wait for EXTI interrupt on pin a (D2, D4, D7, D10), timeout u in [ms]
pwmpin! ( u a -- ) set the digital output port pin a (D4=4, D11=11) to a PWM value u (0..1000). Default frequency is 1 kHz, TIMER1
pwmprescale ( u -- ) Set the PWM prescale for TIMER1. 32 kHz / prescale, default 32 -> PWM frequency 1 kHz
ICOCprescale ( u -- ) set the input capture / output compare prescale for TIMER2. default 32 -> 32 MHz / 32 = 1 MHz, timer resolution 1 us
ICOCperiod! ( u -- ) set the input capture / output compare (TIMER2) period. default $FFFFFFFF (4'294'967'295).
When the up counter reaches the period, the counter is set to 0.
For prescale 32 the maximum time is about 1 h 11 m
ICOCcount! ( -- u ) set the input capture / output compare counter for TIMER2
ICOCcount@ ( u -- ) get the input capture / output compare counter for TIMER2
ICOCstart ( -- ) start the ICOC period
ICOCstop ( -- ) stop the ICOC period
OCmod ( u a -- ) set for pin a (D0, D1, D5) the Output Compare mode u: 0 frozen, 1 active level on match, 2 inactive level on match,
3 toggle on match, 4 forced active, 5 forced inactive
OCstart ( u a -- ) start the output compare mode for pin a with pulse u
OCstop ( a -- ) stop output compare for pin a
ICstart ( u -- ) start input capture u: 0 rising edge, 1 falling edge, 2 both edges
ICstop ( -- ) stop input capture
waitperiod ( -- ) wait for the end of the TIMER2 period
OCwait ( a -- ) wait for the end of output capture on pin a
ICwait ( u -- u ) wait for the end of input capture with timeout u, returns counter u
apin@ ( a -- u ) get the analog input port pin (A0 .. A2). Returns a 12 bit value (0..4095)
vref@ ( -- u ) get the Vref voltage in mV (rather the VDDA)
vbat@ ( -- u ) get the Vbat voltage in mV
CPUtemp@ ( -- u ) get CPU temperature in degree Celsius
I2Cput ( a # u -- ) put a message with length u (count in bytes) from buffer at a to the I2C slave device u
I2Cget ( a # u -- ) get a message with length u from I2C slave device to buffer at a
I2Cputget ( a #1 #2 u -- ) put a message with length #1 from buffer at a to the I2C slave device u
and get a message with length #2 from device to buffer at a
SPIget ( a # -- ) get a message with length # from SPI slave device to buffer at a
SPIput ( a # -- ) put a message with length # from buffer at a to the SPI slave device
SPIputget ( a #1 #2 -- ) put a message with length #1 from buffer at a to the SPI slave device
and get a message with length #2 from device to buffer at a
SPImutex ( -- a ) get the SPI mutex address
dport! and dport@ set and get all 16 digital pins (D0 to D15) at once. You have to press the SW1 push button til D0 is set to cancel the operation.
3 0 dmod \ set D0 to Output 3 1 dmod \ set D1 to Output 3 2 dmod \ set D2 to Output 3 3 dmod \ set D3 to Output 3 4 dmod \ set D4 to Output 3 5 dmod \ set D5 to Output 3 6 dmod \ set D6 to Output 3 7 dmod \ set D7 to Output
: left ( -- )
7 0 do
dport@ shl dport!
100 osDelay drop
loop
;
|
: right ( -- )
7 0 do
dport@ shr dport!
100 osDelay drop
loop
;
|
: knightrider ( -- )
1 dport!
begin
left right
switch1? \ or key?
until
0 dport!
;
|
: left ( -- )
7 0 do
1 i dpin!
100 osDelay drop
0 i dpin!
loop
;
|
: right ( -- )
8 1 do
1 8 i - dpin!
100 osDelay drop
0 8 i - dpin!
loop
;
|
: knigthrider ( -- )
begin
left right
switch1?
until
0 0 dpin!
;
|
apin@ ( a -- u ) returns the ADC value (12 bit, 0 .. 4095) from one of the analog pins A0 to A5 (0 .. 5). Here I use the A0 to control the delay.
: left ( -- )
7 0 do
1 i dpin!
0 apin@ 10 / osDelay drop \ delay depends on A0
0 i dpin!
loop
;
|
: right ( -- )
8 1 do
1 8 i - dpin!
0 apin@ 10 / osDelay drop \ delay depends on A0
0 8 i - dpin!
loop
;
|
left or right word takes about 125 us, the knightrider loop about 50 us (no osDelay). Pretty fast for my opinion.
CH1 yellow: D0 pin
pwmprescale from 32 kHz (value 1) down to 0.5 Hz (64000).
5 3 dmod \ set D3 to PWM
: pwm ( -- )
begin
0 apin@ 4 / 3 pwmpin!
10 osDelay drop
switch1?
until
;
: period ( -- )
5000000 ICOCperiod! \ 5 s period
ICOCstart
begin
waitperiod
cr .time
key? until
key drop
;
: oc-toggle ( -- )
5000000 ICOCperiod! \ 5 s period
ICOCstart
3 9 OCmod 1000000 0 OCstart \ toggle D9 after 1 s
begin
waitperiod
cr .time
key? until
key drop
;
When you abort (hit any key) the program, the timer still runs and controls the port pins. To stop the port pins:
0 OCstop 1 OCstop 5 OCstopOr change the prescale to make it faster or slower:
1 ICOCprescale
: ic-test ( -- )
6 2 dmod \ input capture on A2
ICOCstart
2 ICstart \ both edges
ICOCcount@ ( -- count )
begin
2000 \ 2 s timeout
ICwait ( -- old-capture capture )
cr
dup 0= if
." timeout" drop
else
dup rot ( -- capture capture old-capture )
- 1000 / . ." ms"
then
key? until
key drop
drop
ICstop
;
| Signal name | STM32WB55 pin | Comment |
|---|---|---|
| PERIPH_POWER | PA3 | LM3281 Enable, Low for shutdown |
| Pin | Label | STM32WB55 pin | Arduino | Alternate Functions |
|---|---|---|---|---|
| 1 | +5V | |||
| 2 | A7 | PA7 | D11 | SPI1_MOSI, TIM1_CH1 (PWM) |
| 3 | A6 | PA6 | D12 | SPI1_MISO |
| 4 | A4 | PA4 | D10 | SPI1_CS |
| 5 | B3 | PB3 | D13 | SPI1_CLK, SWO |
| 6 | B2 | PB2 | D9 | TIM2_CH2 (output capture) |
| 7 | C3 | PC3 | A2(D18) | |
| 8 | GND | |||
| 9 | 3V3 | |||
| 10 | SWC | PA14 | D3 | SWCLK |
| 11 | GND | |||
| 12 | SIO | PA13 | D2 | SWDIO |
| 13 | TX | PB6 | D1 | |
| 14 | RX | PB7 | D0 | |
| 15 | C1 | PC1 | A1 (D17) | I2C3_SDA |
| 16 | C0 | PC0 | A0 (D16) | I2C3_SCL |
| 17 | 1W | PB14 | D4 | TIM1_CH2 (PWM) |
| 18 | GND |
| JTAG Pin | JTAG STM 14pin | Flipper Pin | STLINK-V3MINI | Description |
|---|---|---|---|---|
| 1 | NC | |||
| 2 | NC | |||
| 1 | 3 | 9 | 30 (right) | VDD |
| 2 | 4 | 12 | 4 (left) | SWDIO |
| 3 | 5 | 8 | 8 (left) | GND |
| 4 | 6 | 10 | 13 (left) | SWCLK |
| 5 | 7 | GND | ||
| 6 | 8 | 5 | 6 (left) | SWO |
| 7 | 9 | NC | ||
| 8 | 10 | NC | ||
| 9 | 11 | 11 | 5 (left) | GND_DETECT |
| 10 | 12 | - | 31 (right) | NRST |
| 13 | 14 | 15 (left) | VCP_RX Target | |
| 14 | 13 | 12 (left) | VCP_TX Target |
| Signal name | STM32WB55 pin | Comment | Numbering |
|---|---|---|---|
| BUTTON_BACK | PC13 | RESET, WKUP2 | 1 |
| BUTTON_OK | PH3 | BOOTP | 2 |
| BUTTON_RIGHT | PB12 | 3 | |
| BUTTON_LEFT | PB11 | RESET | 4 |
| BUTTON_UP | PB10 | 5 | |
| BUTTON_DOWN | PC6 | 6 |
| Signal name | STM32WB55 pin | Comment |
|---|---|---|
| IC2_SCL | PA9 | |
| IC2_SDA | PA10 |
furi_hal_light.h
#define LED_CURRENT_RED 50 #define LED_CURRENT_GREEN 50 #define LED_CURRENT_BLUE 50 #define LED_CURRENT_WHITE 150
| Signal name | STM32WB55 pin | Comment |
|---|---|---|
| UART_TX | PB6 | USART1_TX |
| UART_RX | PB7 | USART1_RX |
| Signal name | STM32W555 pin | Comment |
|---|---|---|
| DISPLAY_RST | PB0 | |
| DISPLAY_DI | PB1 | |
| DISPLAY_CS | PC11 | CS |
| SPI_D_MOSI | PB15 | SPI2_MOSI |
| SPI_D_SCK | PD1 | SPI2_SCK |
| LCD_LED | PC9 |
| Signal name | STM32W555 pin | Comment |
|---|---|---|
| SD_CS | PC12 | Chip Select |
| SD_CD | PC10 | Card Detect |
| SPI_D_MOSI | PB15 | SPI2_MOSI |
| SPI_D_MISO | PC2 | SPI2_MISO |
| SPI_D_SCK | PD1 | SPI2_SCK |
| Signal name | STM32WB55 pin | Comment |
|---|---|---|
| IC2_SCL | PA9 | |
| IC2_SDA | PA10 | |
| PWR_INT | - |

| I | Attachment | History | Action | Size | Date | Who | Comment |
|---|---|---|---|---|---|---|---|
| |
flipper-gpio.jpg | r1 | manage | 745.7 K | 2023-10-28 - 20:21 | PeterSchmid | |
| |
flipper-header.jpg | r1 | manage | 50.9 K | 2023-11-11 - 19:49 | PeterSchmid | |
| |
flipper-stlink-2.jpg | r1 | manage | 752.0 K | 2023-11-11 - 19:34 | PeterSchmid | |
| |
flipper-stlink.jpg | r1 | manage | 357.3 K | 2023-11-11 - 19:34 | PeterSchmid |