led1! ( n -- ) sets LED1 (blue) led2! ( n -- ) sets LED2 (green) led3! ( n -- ) sets LED3 (red) led1@ ( -- n ) gets LED1 (blue) led2@ ( -- n ) gets LED2 (green) led3@ ( -- n ) gets LED3 (red) switch1? ( -- n ) gets switch1, closed=TRUE switch2? ( -- n ) gets switch2, closed=TRUE switch3? ( -- n ) gets switch3, closed=TRUE dport! ( n -- ) sets the digital output port (D0=bit0 .. D15=bit15). dport@ ( -- n ) gets the digital input/output port (D0=bit0 .. D15=bit15). dpin! ( n a -- ) sets the digital output port pin (D0=0 .. D15=15) dpin@ ( a -- n ) gets the digital input/output port pin dmod ( u a -- ) sets 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 -- ) Sets 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 -- ) sets the digital output port pin a (D3=3, D6=6, D9=9) to a PWM value u (0..1000). Default frequency is 1 kHz, TIMER1 pwmprescale ( u -- ) Sets the PWM prescale for TIMER1. 32 kHz / prescale, default 32 -> PWM frequency 1 kHz ICOCprescale ( u -- ) Sets the input capture / output compare prescale for TIMER2. default 32 -> 32 MHz / 32 = 1 MHz, timer resolution 1 us ICOCperiod! ( u -- ) Sets 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 ) Sets the input capture / output compare counter for TIMER2 ICOCcount@ ( u -- ) Gets the input capture / output compare counter for TIMER2 ICOCstart ( -- ) Starts the ICOC period ICOCstop ( -- ) Stops the ICOC period OCmod ( u a -- ) Sets 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 -- ) Starts the output compare mode for pin a with pulse u OCstop ( a -- ) Stops output compare for pin a ICstart ( u -- ) Starts input capture u: 0 rising edge, 1 falling edge, 2 both edges ICstop ( -- ) Stops 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 ) gets the analog input port pin (A0 .. A5). Returns a 12 bit value (0..4095) I2Cdev ( u -- ) Sets the 7-bit I2C address I2Cput ( c-addr u -- ) put a message with length u from buffer at c-addr to the I2C slave device I2Cget ( c-addr u -- ) get a message with length u from I2C slave device to buffer at c-addr I2Cputget ( a1 u1 a2 u2 -- ) put a message with length u1 from buffer at a1 to the I2C slave device and get a message with length u2 from device to buffer at a2 SPIputget ( a1 a2 u -- ) put a message with length u from buffer at a1 to the SPI slave device and get a message with length u from device to buffer at a2 SPIputc ( char ) put a single char to the SPI slave device
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 3 dmod \ set D3 to Output 3 5 dmod \ set D5 to Output 3 6 dmod \ set D6 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 pinpwmprescale
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 0 OCmod 1000000 0 OCstart \ toggle D0 after 1 s 3 1 OCmod 2000000 1 OCstart \ toggle D1 after 2 s 3 5 OCmod 3000000 5 OCstart \ toggle D5 after 3 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 ;
JTAG Pin | JTAG STM 14pin | JP3 Firefly | JP7 Firefly | Description |
---|---|---|---|---|
1 | NC | |||
2 | NC | |||
1 | 3 | 3 | 3V3 VDD | |
2 | 4 | 5 | SWDIO | |
3 | 5 | 2 | GND | |
4 | 6 | 6 | SWCLK | |
5 | 7 | 2 | GND | |
6 | 8 | SWO | ||
7 | 9 | NC | ||
8 | 10 | NC | ||
9 | 11 | 2 | GND_DETECT | |
10 | 12 | 4 | NRST | |
13 | 5 (PA10) | D0 UART_TX | ||
14 | 4 (PA9) | D1 UART_RX |
Signal name | STM32WB55 pin | Comment |
---|---|---|
SWITCH1 | PC12 | WKUP3 |
Signal name | STM32WB55 pin | Comment |
---|---|---|
LD1 | PB5 | |
Neopixel | PC12 | D8 |
Signal name | Firefly pin | Comment |
---|---|---|
UART_TX | PB6 | USART1_TX |
UART_RX | PB7 | USART1_RX |
Signal name | Firefly pin | Comment |
---|---|---|
FLASH_NCS | PD3 | QUADSPI_BK1_NCS |
FLASH_IO0 | PB9 | QUADSPI_BK1_IO0 |
FLASH_IO1 | PD5 | QUADSPI_BK1_IO1 |
FLASH_IO2 | PD6 | QUADSPI_BK1_IO2 |
FLASH_IO3 | PD7 | QUADSPI_BK1_IO3 |
FLASH_SCLK | PA3 | QUADSPI_BK1_SCLK |
I | Attachment | History | Action | Size | Date | Who | Comment |
---|---|---|---|---|---|---|---|
![]() |
TEK0012.png | r1 | manage | 3.6 K | 2020-04-16 - 14:22 | PeterSchmid |