Compare commits

...
4 Commits
Author SHA1 Message Date
Earle F. Philhower, III 35c974d4c0 Fix file creation on SD and SDFS (#216)
The O_CREAT/etc. flags on the Pico are a full 32-bits in size, but the
core was generating a flag for SdFat using an 8-bit type, so all the
O_CREAT, O_TRUNC, O_APPEND, etc. flags got cut off.

Fix the flag size.

Fixes #214
2021-06-19 12:15:11 -07:00
Earle F. Philhower, III 27476815ab Fix SerialUART flush (#215)
Serial1.flush/Serial2.flush was not waiting for the proper FIFO to clear.
Use the proper call from the Pico SDK.

Thanks to Peter Remias for noting it.
2021-06-16 08:25:24 -07:00
Earle F. Philhower, III b02b9c4be8 Add PDM library for Arduino Nano RP2040 Connect (#213)
* Add PDM library for Arduino Nano RP2040 Connect

* No PDM test in CI, only works on Arduino Nano RP2040
2021-06-16 08:17:09 -07:00
Earle F. Philhower, III 6afcf5881d Initial Arduino Nano RP2040 Connect support (#212)
Thanks to @Claupio for the bringup!
Reference #208
2021-06-14 08:59:52 -07:00
21 changed files with 1712 additions and 3 deletions
+1
View File
@@ -17,6 +17,7 @@ See https://arduino-pico.readthedocs.io/en/latest/ along with the examples for m
* Adafruit QTPy RP2040
* Adafruit STEMMA Friend RP2040
* Adafruit Trinkey RP2040 QT
* Arduino Nano RP2040 Connect (preliminary)
* SparkFun ProMicro RP2040
* Generic (configurable flash, I/O pins)
+388
View File
@@ -1978,6 +1978,394 @@ adafruit_macropad2040picoprobe.menu.usbstack.picosdk.build.usbstack_flags=
adafruit_macropad2040picoprobe.menu.usbstack.tinyusb=Adafruit TinyUSB
adafruit_macropad2040picoprobe.menu.usbstack.tinyusb.build.usbstack_flags=-DUSE_TINYUSB "-I{build.core.path}/TinyUSB" "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"
# -----------------------------------
# Arduino Nano RP2040 Connect
# -----------------------------------
arduino_nano_connect.name=Arduino Nano RP2040 Connect
arduino_nano_connect.vid.0=0x2341
arduino_nano_connect.pid.0=0x0058
arduino_nano_connect.build.usbpid=-DSERIALUSB_PID=0x0058
arduino_nano_connect.build.board=ARDUINO_NANO_RP2040_CONNECT
arduino_nano_connect.build.mcu=cortex-m0plus
arduino_nano_connect.build.variant=arduino_nano_connect
arduino_nano_connect.upload.tool=uf2conv
arduino_nano_connect.upload.maximum_size=16777216
arduino_nano_connect.upload.maximum_data_size=262144
arduino_nano_connect.upload.wait_for_upload_port=true
arduino_nano_connect.upload.erase_cmd=
arduino_nano_connect.serial.disableDTR=false
arduino_nano_connect.serial.disableRTS=false
arduino_nano_connect.build.f_cpu=125000000
arduino_nano_connect.build.led=
arduino_nano_connect.build.core=rp2040
arduino_nano_connect.build.mcu=rp2040
arduino_nano_connect.build.ldscript=memmap_default.ld
arduino_nano_connect.build.boot2=boot2_w25q080_2_padded_checksum
arduino_nano_connect.build.vid=0x2341
arduino_nano_connect.build.pid=0x0058
arduino_nano_connect.build.usb_manufacturer="Arduino"
arduino_nano_connect.build.usb_product="Nano RP2040 Connect"
arduino_nano_connect.menu.flash.16777216_0=16MB (no FS)
arduino_nano_connect.menu.flash.16777216_0.upload.maximum_size=16773120
arduino_nano_connect.menu.flash.16777216_0.build.flash_length=16773120
arduino_nano_connect.menu.flash.16777216_0.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_0.build.fs_start=285208576
arduino_nano_connect.menu.flash.16777216_0.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_65536=16MB (Sketch: 16320KB, FS: 64KB)
arduino_nano_connect.menu.flash.16777216_65536.upload.maximum_size=16707584
arduino_nano_connect.menu.flash.16777216_65536.build.flash_length=16707584
arduino_nano_connect.menu.flash.16777216_65536.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_65536.build.fs_start=285143040
arduino_nano_connect.menu.flash.16777216_65536.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_131072=16MB (Sketch: 16256KB, FS: 128KB)
arduino_nano_connect.menu.flash.16777216_131072.upload.maximum_size=16642048
arduino_nano_connect.menu.flash.16777216_131072.build.flash_length=16642048
arduino_nano_connect.menu.flash.16777216_131072.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_131072.build.fs_start=285077504
arduino_nano_connect.menu.flash.16777216_131072.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_262144=16MB (Sketch: 16128KB, FS: 256KB)
arduino_nano_connect.menu.flash.16777216_262144.upload.maximum_size=16510976
arduino_nano_connect.menu.flash.16777216_262144.build.flash_length=16510976
arduino_nano_connect.menu.flash.16777216_262144.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_262144.build.fs_start=284946432
arduino_nano_connect.menu.flash.16777216_262144.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_524288=16MB (Sketch: 15872KB, FS: 512KB)
arduino_nano_connect.menu.flash.16777216_524288.upload.maximum_size=16248832
arduino_nano_connect.menu.flash.16777216_524288.build.flash_length=16248832
arduino_nano_connect.menu.flash.16777216_524288.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_524288.build.fs_start=284684288
arduino_nano_connect.menu.flash.16777216_524288.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_1048576=16MB (Sketch: 15MB, FS: 1MB)
arduino_nano_connect.menu.flash.16777216_1048576.upload.maximum_size=15724544
arduino_nano_connect.menu.flash.16777216_1048576.build.flash_length=15724544
arduino_nano_connect.menu.flash.16777216_1048576.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_1048576.build.fs_start=284160000
arduino_nano_connect.menu.flash.16777216_1048576.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_2097152=16MB (Sketch: 14MB, FS: 2MB)
arduino_nano_connect.menu.flash.16777216_2097152.upload.maximum_size=14675968
arduino_nano_connect.menu.flash.16777216_2097152.build.flash_length=14675968
arduino_nano_connect.menu.flash.16777216_2097152.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_2097152.build.fs_start=283111424
arduino_nano_connect.menu.flash.16777216_2097152.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_3145728=16MB (Sketch: 13MB, FS: 3MB)
arduino_nano_connect.menu.flash.16777216_3145728.upload.maximum_size=13627392
arduino_nano_connect.menu.flash.16777216_3145728.build.flash_length=13627392
arduino_nano_connect.menu.flash.16777216_3145728.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_3145728.build.fs_start=282062848
arduino_nano_connect.menu.flash.16777216_3145728.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_4194304=16MB (Sketch: 12MB, FS: 4MB)
arduino_nano_connect.menu.flash.16777216_4194304.upload.maximum_size=12578816
arduino_nano_connect.menu.flash.16777216_4194304.build.flash_length=12578816
arduino_nano_connect.menu.flash.16777216_4194304.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_4194304.build.fs_start=281014272
arduino_nano_connect.menu.flash.16777216_4194304.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_5242880=16MB (Sketch: 11MB, FS: 5MB)
arduino_nano_connect.menu.flash.16777216_5242880.upload.maximum_size=11530240
arduino_nano_connect.menu.flash.16777216_5242880.build.flash_length=11530240
arduino_nano_connect.menu.flash.16777216_5242880.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_5242880.build.fs_start=279965696
arduino_nano_connect.menu.flash.16777216_5242880.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_6291456=16MB (Sketch: 10MB, FS: 6MB)
arduino_nano_connect.menu.flash.16777216_6291456.upload.maximum_size=10481664
arduino_nano_connect.menu.flash.16777216_6291456.build.flash_length=10481664
arduino_nano_connect.menu.flash.16777216_6291456.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_6291456.build.fs_start=278917120
arduino_nano_connect.menu.flash.16777216_6291456.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_7340032=16MB (Sketch: 9MB, FS: 7MB)
arduino_nano_connect.menu.flash.16777216_7340032.upload.maximum_size=9433088
arduino_nano_connect.menu.flash.16777216_7340032.build.flash_length=9433088
arduino_nano_connect.menu.flash.16777216_7340032.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_7340032.build.fs_start=277868544
arduino_nano_connect.menu.flash.16777216_7340032.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_8388608=16MB (Sketch: 8MB, FS: 8MB)
arduino_nano_connect.menu.flash.16777216_8388608.upload.maximum_size=8384512
arduino_nano_connect.menu.flash.16777216_8388608.build.flash_length=8384512
arduino_nano_connect.menu.flash.16777216_8388608.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_8388608.build.fs_start=276819968
arduino_nano_connect.menu.flash.16777216_8388608.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_9437184=16MB (Sketch: 7MB, FS: 9MB)
arduino_nano_connect.menu.flash.16777216_9437184.upload.maximum_size=7335936
arduino_nano_connect.menu.flash.16777216_9437184.build.flash_length=7335936
arduino_nano_connect.menu.flash.16777216_9437184.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_9437184.build.fs_start=275771392
arduino_nano_connect.menu.flash.16777216_9437184.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_10485760=16MB (Sketch: 6MB, FS: 10MB)
arduino_nano_connect.menu.flash.16777216_10485760.upload.maximum_size=6287360
arduino_nano_connect.menu.flash.16777216_10485760.build.flash_length=6287360
arduino_nano_connect.menu.flash.16777216_10485760.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_10485760.build.fs_start=274722816
arduino_nano_connect.menu.flash.16777216_10485760.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_11534336=16MB (Sketch: 5MB, FS: 11MB)
arduino_nano_connect.menu.flash.16777216_11534336.upload.maximum_size=5238784
arduino_nano_connect.menu.flash.16777216_11534336.build.flash_length=5238784
arduino_nano_connect.menu.flash.16777216_11534336.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_11534336.build.fs_start=273674240
arduino_nano_connect.menu.flash.16777216_11534336.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_12582912=16MB (Sketch: 4MB, FS: 12MB)
arduino_nano_connect.menu.flash.16777216_12582912.upload.maximum_size=4190208
arduino_nano_connect.menu.flash.16777216_12582912.build.flash_length=4190208
arduino_nano_connect.menu.flash.16777216_12582912.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_12582912.build.fs_start=272625664
arduino_nano_connect.menu.flash.16777216_12582912.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_13631488=16MB (Sketch: 3MB, FS: 13MB)
arduino_nano_connect.menu.flash.16777216_13631488.upload.maximum_size=3141632
arduino_nano_connect.menu.flash.16777216_13631488.build.flash_length=3141632
arduino_nano_connect.menu.flash.16777216_13631488.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_13631488.build.fs_start=271577088
arduino_nano_connect.menu.flash.16777216_13631488.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_14680064=16MB (Sketch: 2MB, FS: 14MB)
arduino_nano_connect.menu.flash.16777216_14680064.upload.maximum_size=2093056
arduino_nano_connect.menu.flash.16777216_14680064.build.flash_length=2093056
arduino_nano_connect.menu.flash.16777216_14680064.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_14680064.build.fs_start=270528512
arduino_nano_connect.menu.flash.16777216_14680064.build.fs_end=285208576
arduino_nano_connect.menu.flash.16777216_15728640=16MB (Sketch: 1MB, FS: 15MB)
arduino_nano_connect.menu.flash.16777216_15728640.upload.maximum_size=1044480
arduino_nano_connect.menu.flash.16777216_15728640.build.flash_length=1044480
arduino_nano_connect.menu.flash.16777216_15728640.build.eeprom_start=285208576
arduino_nano_connect.menu.flash.16777216_15728640.build.fs_start=269479936
arduino_nano_connect.menu.flash.16777216_15728640.build.fs_end=285208576
arduino_nano_connect.menu.freq.125=125 MHz
arduino_nano_connect.menu.freq.125.build.f_cpu=125000000L
arduino_nano_connect.menu.freq.50=50 MHz
arduino_nano_connect.menu.freq.50.build.f_cpu=50000000L
arduino_nano_connect.menu.freq.100=100 MHz
arduino_nano_connect.menu.freq.100.build.f_cpu=100000000L
arduino_nano_connect.menu.freq.133=133 MHz
arduino_nano_connect.menu.freq.133.build.f_cpu=133000000L
arduino_nano_connect.menu.freq.150=150 MHz (Overclock)
arduino_nano_connect.menu.freq.150.build.f_cpu=150000000L
arduino_nano_connect.menu.freq.175=175 MHz (Overclock)
arduino_nano_connect.menu.freq.175.build.f_cpu=175000000L
arduino_nano_connect.menu.freq.200=200 MHz (Overclock)
arduino_nano_connect.menu.freq.200.build.f_cpu=200000000L
arduino_nano_connect.menu.freq.225=225 MHz (Overclock)
arduino_nano_connect.menu.freq.225.build.f_cpu=225000000L
arduino_nano_connect.menu.freq.250=250 MHz (Overclock)
arduino_nano_connect.menu.freq.250.build.f_cpu=250000000L
arduino_nano_connect.menu.freq.275=275 MHz (Overclock)
arduino_nano_connect.menu.freq.275.build.f_cpu=275000000L
arduino_nano_connect.menu.freq.300=300 MHz (Overclock)
arduino_nano_connect.menu.freq.300.build.f_cpu=300000000L
arduino_nano_connect.menu.dbgport.Disabled=Disabled
arduino_nano_connect.menu.dbgport.Disabled.build.debug_port=
arduino_nano_connect.menu.dbgport.Serial=Serial
arduino_nano_connect.menu.dbgport.Serial.build.debug_port=-DDEBUG_RP2040_PORT=Serial
arduino_nano_connect.menu.dbgport.Serial1=Serial1
arduino_nano_connect.menu.dbgport.Serial1.build.debug_port=-DDEBUG_RP2040_PORT=Serial1
arduino_nano_connect.menu.dbgport.Serial2=Serial2
arduino_nano_connect.menu.dbgport.Serial2.build.debug_port=-DDEBUG_RP2040_PORT=Serial2
arduino_nano_connect.menu.dbglvl.None=None
arduino_nano_connect.menu.dbglvl.None.build.debug_level=
arduino_nano_connect.menu.dbglvl.Core=Core
arduino_nano_connect.menu.dbglvl.Core.build.debug_level=-DDEBUG_RP2040_CORE
arduino_nano_connect.menu.dbglvl.SPI=SPI
arduino_nano_connect.menu.dbglvl.SPI.build.debug_level=-DDEBUG_RP2040_SPI
arduino_nano_connect.menu.dbglvl.Wire=Wire
arduino_nano_connect.menu.dbglvl.Wire.build.debug_level=-DDEBUG_RP2040_WIRE
arduino_nano_connect.menu.dbglvl.All=All
arduino_nano_connect.menu.dbglvl.All.build.debug_level=-DDEBUG_RP2040_WIRE -DDEBUG_RP2040_SPI -DDEBUG_RP2040_CORE
arduino_nano_connect.menu.dbglvl.NDEBUG=NDEBUG
arduino_nano_connect.menu.dbglvl.NDEBUG.build.debug_level=-DNDEBUG
arduino_nano_connect.menu.usbstack.picosdk=Pico SDK
arduino_nano_connect.menu.usbstack.picosdk.build.usbstack_flags=
arduino_nano_connect.menu.usbstack.tinyusb=Adafruit TinyUSB
arduino_nano_connect.menu.usbstack.tinyusb.build.usbstack_flags=-DUSE_TINYUSB "-I{build.core.path}/TinyUSB" "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"
# -----------------------------------
# Arduino Nano RP2040 Connect (Picoprobe)
# -----------------------------------
arduino_nano_connectpicoprobe.name=Arduino Nano RP2040 Connect (Picoprobe)
arduino_nano_connectpicoprobe.vid.0=0x2341
arduino_nano_connectpicoprobe.pid.0=0x0004
arduino_nano_connectpicoprobe.build.usbpid=-DSERIALUSB_PID=0x0058
arduino_nano_connectpicoprobe.build.board=ARDUINO_NANO_RP2040_CONNECT
arduino_nano_connectpicoprobe.build.mcu=cortex-m0plus
arduino_nano_connectpicoprobe.build.variant=arduino_nano_connect
arduino_nano_connectpicoprobe.upload.tool=picoprobe
arduino_nano_connectpicoprobe.upload.maximum_size=16777216
arduino_nano_connectpicoprobe.upload.maximum_data_size=262144
arduino_nano_connectpicoprobe.upload.wait_for_upload_port=true
arduino_nano_connectpicoprobe.upload.erase_cmd=
arduino_nano_connectpicoprobe.serial.disableDTR=false
arduino_nano_connectpicoprobe.serial.disableRTS=false
arduino_nano_connectpicoprobe.build.f_cpu=125000000
arduino_nano_connectpicoprobe.build.led=
arduino_nano_connectpicoprobe.build.core=rp2040
arduino_nano_connectpicoprobe.build.mcu=rp2040
arduino_nano_connectpicoprobe.build.ldscript=memmap_default.ld
arduino_nano_connectpicoprobe.build.boot2=boot2_w25q080_2_padded_checksum
arduino_nano_connectpicoprobe.build.vid=0x2341
arduino_nano_connectpicoprobe.build.pid=0x0058
arduino_nano_connectpicoprobe.build.usb_manufacturer="Arduino"
arduino_nano_connectpicoprobe.build.usb_product="Nano RP2040 Connect (Picoprobe)"
arduino_nano_connectpicoprobe.menu.flash.16777216_0=16MB (no FS)
arduino_nano_connectpicoprobe.menu.flash.16777216_0.upload.maximum_size=16773120
arduino_nano_connectpicoprobe.menu.flash.16777216_0.build.flash_length=16773120
arduino_nano_connectpicoprobe.menu.flash.16777216_0.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_0.build.fs_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_0.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_65536=16MB (Sketch: 16320KB, FS: 64KB)
arduino_nano_connectpicoprobe.menu.flash.16777216_65536.upload.maximum_size=16707584
arduino_nano_connectpicoprobe.menu.flash.16777216_65536.build.flash_length=16707584
arduino_nano_connectpicoprobe.menu.flash.16777216_65536.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_65536.build.fs_start=285143040
arduino_nano_connectpicoprobe.menu.flash.16777216_65536.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_131072=16MB (Sketch: 16256KB, FS: 128KB)
arduino_nano_connectpicoprobe.menu.flash.16777216_131072.upload.maximum_size=16642048
arduino_nano_connectpicoprobe.menu.flash.16777216_131072.build.flash_length=16642048
arduino_nano_connectpicoprobe.menu.flash.16777216_131072.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_131072.build.fs_start=285077504
arduino_nano_connectpicoprobe.menu.flash.16777216_131072.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_262144=16MB (Sketch: 16128KB, FS: 256KB)
arduino_nano_connectpicoprobe.menu.flash.16777216_262144.upload.maximum_size=16510976
arduino_nano_connectpicoprobe.menu.flash.16777216_262144.build.flash_length=16510976
arduino_nano_connectpicoprobe.menu.flash.16777216_262144.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_262144.build.fs_start=284946432
arduino_nano_connectpicoprobe.menu.flash.16777216_262144.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_524288=16MB (Sketch: 15872KB, FS: 512KB)
arduino_nano_connectpicoprobe.menu.flash.16777216_524288.upload.maximum_size=16248832
arduino_nano_connectpicoprobe.menu.flash.16777216_524288.build.flash_length=16248832
arduino_nano_connectpicoprobe.menu.flash.16777216_524288.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_524288.build.fs_start=284684288
arduino_nano_connectpicoprobe.menu.flash.16777216_524288.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576=16MB (Sketch: 15MB, FS: 1MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576.upload.maximum_size=15724544
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576.build.flash_length=15724544
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576.build.fs_start=284160000
arduino_nano_connectpicoprobe.menu.flash.16777216_1048576.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152=16MB (Sketch: 14MB, FS: 2MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152.upload.maximum_size=14675968
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152.build.flash_length=14675968
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152.build.fs_start=283111424
arduino_nano_connectpicoprobe.menu.flash.16777216_2097152.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728=16MB (Sketch: 13MB, FS: 3MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728.upload.maximum_size=13627392
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728.build.flash_length=13627392
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728.build.fs_start=282062848
arduino_nano_connectpicoprobe.menu.flash.16777216_3145728.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304=16MB (Sketch: 12MB, FS: 4MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304.upload.maximum_size=12578816
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304.build.flash_length=12578816
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304.build.fs_start=281014272
arduino_nano_connectpicoprobe.menu.flash.16777216_4194304.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880=16MB (Sketch: 11MB, FS: 5MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880.upload.maximum_size=11530240
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880.build.flash_length=11530240
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880.build.fs_start=279965696
arduino_nano_connectpicoprobe.menu.flash.16777216_5242880.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456=16MB (Sketch: 10MB, FS: 6MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456.upload.maximum_size=10481664
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456.build.flash_length=10481664
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456.build.fs_start=278917120
arduino_nano_connectpicoprobe.menu.flash.16777216_6291456.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032=16MB (Sketch: 9MB, FS: 7MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032.upload.maximum_size=9433088
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032.build.flash_length=9433088
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032.build.fs_start=277868544
arduino_nano_connectpicoprobe.menu.flash.16777216_7340032.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608=16MB (Sketch: 8MB, FS: 8MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608.upload.maximum_size=8384512
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608.build.flash_length=8384512
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608.build.fs_start=276819968
arduino_nano_connectpicoprobe.menu.flash.16777216_8388608.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184=16MB (Sketch: 7MB, FS: 9MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184.upload.maximum_size=7335936
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184.build.flash_length=7335936
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184.build.fs_start=275771392
arduino_nano_connectpicoprobe.menu.flash.16777216_9437184.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760=16MB (Sketch: 6MB, FS: 10MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760.upload.maximum_size=6287360
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760.build.flash_length=6287360
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760.build.fs_start=274722816
arduino_nano_connectpicoprobe.menu.flash.16777216_10485760.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336=16MB (Sketch: 5MB, FS: 11MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336.upload.maximum_size=5238784
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336.build.flash_length=5238784
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336.build.fs_start=273674240
arduino_nano_connectpicoprobe.menu.flash.16777216_11534336.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912=16MB (Sketch: 4MB, FS: 12MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912.upload.maximum_size=4190208
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912.build.flash_length=4190208
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912.build.fs_start=272625664
arduino_nano_connectpicoprobe.menu.flash.16777216_12582912.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488=16MB (Sketch: 3MB, FS: 13MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488.upload.maximum_size=3141632
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488.build.flash_length=3141632
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488.build.fs_start=271577088
arduino_nano_connectpicoprobe.menu.flash.16777216_13631488.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064=16MB (Sketch: 2MB, FS: 14MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064.upload.maximum_size=2093056
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064.build.flash_length=2093056
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064.build.fs_start=270528512
arduino_nano_connectpicoprobe.menu.flash.16777216_14680064.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640=16MB (Sketch: 1MB, FS: 15MB)
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640.upload.maximum_size=1044480
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640.build.flash_length=1044480
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640.build.eeprom_start=285208576
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640.build.fs_start=269479936
arduino_nano_connectpicoprobe.menu.flash.16777216_15728640.build.fs_end=285208576
arduino_nano_connectpicoprobe.menu.freq.125=125 MHz
arduino_nano_connectpicoprobe.menu.freq.125.build.f_cpu=125000000L
arduino_nano_connectpicoprobe.menu.freq.50=50 MHz
arduino_nano_connectpicoprobe.menu.freq.50.build.f_cpu=50000000L
arduino_nano_connectpicoprobe.menu.freq.100=100 MHz
arduino_nano_connectpicoprobe.menu.freq.100.build.f_cpu=100000000L
arduino_nano_connectpicoprobe.menu.freq.133=133 MHz
arduino_nano_connectpicoprobe.menu.freq.133.build.f_cpu=133000000L
arduino_nano_connectpicoprobe.menu.freq.150=150 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.150.build.f_cpu=150000000L
arduino_nano_connectpicoprobe.menu.freq.175=175 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.175.build.f_cpu=175000000L
arduino_nano_connectpicoprobe.menu.freq.200=200 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.200.build.f_cpu=200000000L
arduino_nano_connectpicoprobe.menu.freq.225=225 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.225.build.f_cpu=225000000L
arduino_nano_connectpicoprobe.menu.freq.250=250 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.250.build.f_cpu=250000000L
arduino_nano_connectpicoprobe.menu.freq.275=275 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.275.build.f_cpu=275000000L
arduino_nano_connectpicoprobe.menu.freq.300=300 MHz (Overclock)
arduino_nano_connectpicoprobe.menu.freq.300.build.f_cpu=300000000L
arduino_nano_connectpicoprobe.menu.dbgport.Disabled=Disabled
arduino_nano_connectpicoprobe.menu.dbgport.Disabled.build.debug_port=
arduino_nano_connectpicoprobe.menu.dbgport.Serial=Serial
arduino_nano_connectpicoprobe.menu.dbgport.Serial.build.debug_port=-DDEBUG_RP2040_PORT=Serial
arduino_nano_connectpicoprobe.menu.dbgport.Serial1=Serial1
arduino_nano_connectpicoprobe.menu.dbgport.Serial1.build.debug_port=-DDEBUG_RP2040_PORT=Serial1
arduino_nano_connectpicoprobe.menu.dbgport.Serial2=Serial2
arduino_nano_connectpicoprobe.menu.dbgport.Serial2.build.debug_port=-DDEBUG_RP2040_PORT=Serial2
arduino_nano_connectpicoprobe.menu.dbglvl.None=None
arduino_nano_connectpicoprobe.menu.dbglvl.None.build.debug_level=
arduino_nano_connectpicoprobe.menu.dbglvl.Core=Core
arduino_nano_connectpicoprobe.menu.dbglvl.Core.build.debug_level=-DDEBUG_RP2040_CORE
arduino_nano_connectpicoprobe.menu.dbglvl.SPI=SPI
arduino_nano_connectpicoprobe.menu.dbglvl.SPI.build.debug_level=-DDEBUG_RP2040_SPI
arduino_nano_connectpicoprobe.menu.dbglvl.Wire=Wire
arduino_nano_connectpicoprobe.menu.dbglvl.Wire.build.debug_level=-DDEBUG_RP2040_WIRE
arduino_nano_connectpicoprobe.menu.dbglvl.All=All
arduino_nano_connectpicoprobe.menu.dbglvl.All.build.debug_level=-DDEBUG_RP2040_WIRE -DDEBUG_RP2040_SPI -DDEBUG_RP2040_CORE
arduino_nano_connectpicoprobe.menu.dbglvl.NDEBUG=NDEBUG
arduino_nano_connectpicoprobe.menu.dbglvl.NDEBUG.build.debug_level=-DNDEBUG
arduino_nano_connectpicoprobe.menu.usbstack.picosdk=Pico SDK
arduino_nano_connectpicoprobe.menu.usbstack.picosdk.build.usbstack_flags=
arduino_nano_connectpicoprobe.menu.usbstack.tinyusb=Adafruit TinyUSB
arduino_nano_connectpicoprobe.menu.usbstack.tinyusb.build.usbstack_flags=-DUSE_TINYUSB "-I{build.core.path}/TinyUSB" "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"
# -----------------------------------
# SparkFun ProMicro RP2040
# -----------------------------------
+1 -1
View File
@@ -161,7 +161,7 @@ void SerialUART::flush() {
if (!_running || !m) {
return;
}
uart_default_tx_wait_blocking();
uart_tx_wait_blocking(_uart);
}
size_t SerialUART::write(uint8_t c) {
@@ -0,0 +1,83 @@
/*
This example reads audio data from the on-board PDM microphones, and prints
out the samples to the Serial console. The Serial Plotter built into the
Arduino IDE can be used to plot the audio data (Tools -> Serial Plotter)
Circuit:
- Arduino Nano 33 BLE board, or
- Arduino Nano RP2040 Connect, or
- Arduino Portenta H7 board plus Portenta Vision Shield
This example code is in the public domain.
*/
#include <PDM.h>
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 16000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void setup() {
Serial.begin(9600);
while (!Serial);
// Configure the data receive callback
PDM.onReceive(onPDMdata);
// Optionally set the gain
// Defaults to 20 on the BLE Sense and -10 on the Portenta Vision Shield
// PDM.setGain(30);
// Initialize PDM with:
// - one channel (mono mode)
// - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
// - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shield
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop() {
// Wait for samples to be read
if (samplesRead) {
// Print samples to the serial monitor or plotter
for (int i = 0; i < samplesRead; i++) {
if(channels == 2) {
Serial.print("L:");
Serial.print(sampleBuffer[i]);
Serial.print(" R:");
i++;
}
Serial.println(sampleBuffer[i]);
}
// Clear the read count
samplesRead = 0;
}
}
/**
* Callback function to process the data from the PDM microphone.
* NOTE: This callback is executed as part of an ISR.
* Therefore using `Serial` to print messages inside this function isn't supported.
* */
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
+27
View File
@@ -0,0 +1,27 @@
#######################################
# Syntax Coloring Map PDM
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
PDM KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
begin KEYWORD2
end KEYWORD2
available KEYWORD2
read KEYWORD2
onReceive KEYWORD2
setGain KEYWORD2
setBufferSize KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
+9
View File
@@ -0,0 +1,9 @@
name=PDM
version=1.0
author=Arduino
maintainer=Arduino <info@arduino.cc>
sentence=Enables the communication with devices that use the PDM Bus. Specific implementation for nRF52.
paragraph=
category=Communication
url=
architectures=rp2040
+68
View File
@@ -0,0 +1,68 @@
/*
Copyright (c) 2019 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _PDM_H_INCLUDED
#define _PDM_H_INCLUDED
#include <Arduino.h>
//#include <pinDefinitions.h>
#include "utility/PDMDoubleBuffer.h"
class PDMClass
{
public:
PDMClass(int dinPin, int clkPin, int pwrPin);
virtual ~PDMClass();
int begin(int channels, int sampleRate);
void end();
virtual int available();
virtual int read(void* buffer, size_t size);
void onReceive(void(*)(void));
//PORTENTA_H7 min -12 max 51
//NANO 33 BLE SENSe min 0 max 80
void setGain(int gain);
void setBufferSize(int bufferSize);
size_t getBufferSize();
// private:
void IrqHandler(bool halftranfer);
private:
int _dinPin;
int _clkPin;
int _pwrPin;
int _channels;
int _samplerate;
int _gain;
int _init;
PDMDoubleBuffer _doubleBuffer;
void (*_onReceive)(void);
};
#ifdef PIN_PDM_DIN
extern PDMClass PDM;
#endif
#endif
+313
View File
@@ -0,0 +1,313 @@
/**
*******************************************************************************
* @file OpenPDMFilter.c
* @author CL
* @version V1.0.0
* @date 9-September-2015
* @brief Open PDM audio software decoding Library.
* This Library is used to decode and reconstruct the audio signal
* produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx).
*******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "OpenPDMFilter.h"
/* Variables -----------------------------------------------------------------*/
uint32_t div_const = 0;
int64_t sub_const = 0;
uint32_t sinc[DECIMATION_MAX * SINCN];
uint32_t sinc1[DECIMATION_MAX];
uint32_t sinc2[DECIMATION_MAX * 2];
uint32_t coef[SINCN][DECIMATION_MAX];
#ifdef USE_LUT
int32_t lut[256][DECIMATION_MAX / 8][SINCN];
#endif
/* Functions -----------------------------------------------------------------*/
#ifdef USE_LUT
int32_t filter_table_mono_64(uint8_t *data, uint8_t sincn)
{
return (int32_t)
lut[data[0]][0][sincn] +
lut[data[1]][1][sincn] +
lut[data[2]][2][sincn] +
lut[data[3]][3][sincn] +
lut[data[4]][4][sincn] +
lut[data[5]][5][sincn] +
lut[data[6]][6][sincn] +
lut[data[7]][7][sincn];
}
int32_t filter_table_stereo_64(uint8_t *data, uint8_t sincn)
{
return (int32_t)
lut[data[0]][0][sincn] +
lut[data[2]][1][sincn] +
lut[data[4]][2][sincn] +
lut[data[6]][3][sincn] +
lut[data[8]][4][sincn] +
lut[data[10]][5][sincn] +
lut[data[12]][6][sincn] +
lut[data[14]][7][sincn];
}
int32_t filter_table_mono_128(uint8_t *data, uint8_t sincn)
{
return (int32_t)
lut[data[0]][0][sincn] +
lut[data[1]][1][sincn] +
lut[data[2]][2][sincn] +
lut[data[3]][3][sincn] +
lut[data[4]][4][sincn] +
lut[data[5]][5][sincn] +
lut[data[6]][6][sincn] +
lut[data[7]][7][sincn] +
lut[data[8]][8][sincn] +
lut[data[9]][9][sincn] +
lut[data[10]][10][sincn] +
lut[data[11]][11][sincn] +
lut[data[12]][12][sincn] +
lut[data[13]][13][sincn] +
lut[data[14]][14][sincn] +
lut[data[15]][15][sincn];
}
int32_t filter_table_stereo_128(uint8_t *data, uint8_t sincn)
{
return (int32_t)
lut[data[0]][0][sincn] +
lut[data[2]][1][sincn] +
lut[data[4]][2][sincn] +
lut[data[6]][3][sincn] +
lut[data[8]][4][sincn] +
lut[data[10]][5][sincn] +
lut[data[12]][6][sincn] +
lut[data[14]][7][sincn] +
lut[data[16]][8][sincn] +
lut[data[18]][9][sincn] +
lut[data[20]][10][sincn] +
lut[data[22]][11][sincn] +
lut[data[24]][12][sincn] +
lut[data[26]][13][sincn] +
lut[data[28]][14][sincn] +
lut[data[30]][15][sincn];
}
int32_t (* filter_tables_64[2]) (uint8_t *data, uint8_t sincn) = {filter_table_mono_64, filter_table_stereo_64};
int32_t (* filter_tables_128[2]) (uint8_t *data, uint8_t sincn) = {filter_table_mono_128, filter_table_stereo_128};
#else
int32_t filter_table(uint8_t *data, uint8_t sincn, TPDMFilter_InitStruct *param)
{
uint8_t c, i;
uint16_t data_index = 0;
uint32_t *coef_p = &coef[sincn][0];
int32_t F = 0;
uint8_t decimation = param->Decimation;
uint8_t channels = param->In_MicChannels;
for (i = 0; i < decimation; i += 8) {
c = data[data_index];
F += ((c >> 7) ) * coef_p[i ] +
((c >> 6) & 0x01) * coef_p[i + 1] +
((c >> 5) & 0x01) * coef_p[i + 2] +
((c >> 4) & 0x01) * coef_p[i + 3] +
((c >> 3) & 0x01) * coef_p[i + 4] +
((c >> 2) & 0x01) * coef_p[i + 5] +
((c >> 1) & 0x01) * coef_p[i + 6] +
((c ) & 0x01) * coef_p[i + 7];
data_index += channels;
}
return F;
}
#endif
void convolve(uint32_t Signal[/* SignalLen */], unsigned short SignalLen,
uint32_t Kernel[/* KernelLen */], unsigned short KernelLen,
uint32_t Result[/* SignalLen + KernelLen - 1 */])
{
uint16_t n;
for (n = 0; n < SignalLen + KernelLen - 1; n++)
{
unsigned short kmin, kmax, k;
Result[n] = 0;
kmin = (n >= KernelLen - 1) ? n - (KernelLen - 1) : 0;
kmax = (n < SignalLen - 1) ? n : SignalLen - 1;
for (k = kmin; k <= kmax; k++) {
Result[n] += Signal[k] * Kernel[n - k];
}
}
}
void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param)
{
uint16_t i, j;
int64_t sum = 0;
uint8_t decimation = Param->Decimation;
for (i = 0; i < SINCN; i++) {
Param->Coef[i] = 0;
Param->bit[i] = 0;
}
for (i = 0; i < decimation; i++) {
sinc1[i] = 1;
}
Param->OldOut = Param->OldIn = Param->OldZ = 0;
Param->LP_ALFA = (Param->LP_HZ != 0 ? (uint16_t) (Param->LP_HZ * 256 / (Param->LP_HZ + Param->Fs / (2 * 3.14159))) : 0);
Param->HP_ALFA = (Param->HP_HZ != 0 ? (uint16_t) (Param->Fs * 256 / (2 * 3.14159 * Param->HP_HZ + Param->Fs)) : 0);
Param->FilterLen = decimation * SINCN;
sinc[0] = 0;
sinc[decimation * SINCN - 1] = 0;
convolve(sinc1, decimation, sinc1, decimation, sinc2);
convolve(sinc2, decimation * 2 - 1, sinc1, decimation, &sinc[1]);
for(j = 0; j < SINCN; j++) {
for (i = 0; i < decimation; i++) {
coef[j][i] = sinc[j * decimation + i];
sum += sinc[j * decimation + i];
}
}
sub_const = sum >> 1;
div_const = sub_const * Param->MaxVolume / 32768 / Param->filterGain;
div_const = (div_const == 0 ? 1 : div_const);
#ifdef USE_LUT
/* Look-Up Table. */
uint16_t c, d, s;
for (s = 0; s < SINCN; s++)
{
uint32_t *coef_p = &coef[s][0];
for (c = 0; c < 256; c++)
for (d = 0; d < decimation / 8; d++)
lut[c][d][s] = ((c >> 7) ) * coef_p[d * 8 ] +
((c >> 6) & 0x01) * coef_p[d * 8 + 1] +
((c >> 5) & 0x01) * coef_p[d * 8 + 2] +
((c >> 4) & 0x01) * coef_p[d * 8 + 3] +
((c >> 3) & 0x01) * coef_p[d * 8 + 4] +
((c >> 2) & 0x01) * coef_p[d * 8 + 5] +
((c >> 1) & 0x01) * coef_p[d * 8 + 6] +
((c ) & 0x01) * coef_p[d * 8 + 7];
}
#endif
}
void Open_PDM_Filter_64(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param)
{
uint8_t i, data_out_index;
uint8_t channels = Param->In_MicChannels;
uint8_t data_inc = ((DECIMATION_MAX >> 4) * channels);
int64_t Z, Z0, Z1, Z2;
int64_t OldOut, OldIn, OldZ;
OldOut = Param->OldOut;
OldIn = Param->OldIn;
OldZ = Param->OldZ;
#ifdef USE_LUT
uint8_t j = channels - 1;
#endif
for (i = 0, data_out_index = 0; i < Param->nSamples; i++, data_out_index += channels) {
#ifdef USE_LUT
Z0 = filter_tables_64[j](data, 0);
Z1 = filter_tables_64[j](data, 1);
Z2 = filter_tables_64[j](data, 2);
#else
Z0 = filter_table(data, 0, Param);
Z1 = filter_table(data, 1, Param);
Z2 = filter_table(data, 2, Param);
#endif
Z = Param->Coef[1] + Z2 - sub_const;
Param->Coef[1] = Param->Coef[0] + Z1;
Param->Coef[0] = Z0;
OldOut = (Param->HP_ALFA * (OldOut + Z - OldIn)) >> 8;
OldIn = Z;
OldZ = ((256 - Param->LP_ALFA) * OldZ + Param->LP_ALFA * OldOut) >> 8;
Z = OldZ * volume;
Z = RoundDiv(Z, div_const);
Z = SaturaLH(Z, -32700, 32700);
dataOut[data_out_index] = Z;
data += data_inc;
}
Param->OldOut = OldOut;
Param->OldIn = OldIn;
Param->OldZ = OldZ;
}
void Open_PDM_Filter_128(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param)
{
uint8_t i, data_out_index;
uint8_t channels = Param->In_MicChannels;
uint8_t data_inc = ((DECIMATION_MAX >> 3) * channels);
int64_t Z, Z0, Z1, Z2;
int64_t OldOut, OldIn, OldZ;
OldOut = Param->OldOut;
OldIn = Param->OldIn;
OldZ = Param->OldZ;
#ifdef USE_LUT
uint8_t j = channels - 1;
#endif
for (i = 0, data_out_index = 0; i < Param->nSamples; i++, data_out_index += channels) {
#ifdef USE_LUT
Z0 = filter_tables_128[j](data, 0);
Z1 = filter_tables_128[j](data, 1);
Z2 = filter_tables_128[j](data, 2);
#else
Z0 = filter_table(data, 0, Param);
Z1 = filter_table(data, 1, Param);
Z2 = filter_table(data, 2, Param);
#endif
Z = Param->Coef[1] + Z2 - sub_const;
Param->Coef[1] = Param->Coef[0] + Z1;
Param->Coef[0] = Z0;
OldOut = (Param->HP_ALFA * (OldOut + Z - OldIn)) >> 8;
OldIn = Z;
OldZ = ((256 - Param->LP_ALFA) * OldZ + Param->LP_ALFA * OldOut) >> 8;
Z = OldZ * volume;
Z = RoundDiv(Z, div_const);
Z = SaturaLH(Z, -32700, 32700);
dataOut[data_out_index] = Z;
data += data_inc;
}
Param->OldOut = OldOut;
Param->OldIn = OldIn;
Param->OldZ = OldZ;
}
+99
View File
@@ -0,0 +1,99 @@
/**
*******************************************************************************
* @file OpenPDMFilter.h
* @author CL
* @version V1.0.0
* @date 9-September-2015
* @brief Header file for Open PDM audio software decoding Library.
* This Library is used to decode and reconstruct the audio signal
* produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx).
*******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __OPENPDMFILTER_H
#define __OPENPDMFILTER_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
/* Definitions ---------------------------------------------------------------*/
/*
* Enable to use a Look-Up Table to improve performances while using more FLASH
* and RAM memory.
* Note: Without Look-Up Table up to stereo@16KHz configuration is supported.
*/
#define USE_LUT
#define SINCN 3
#define DECIMATION_MAX 128
#define HTONS(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
#define RoundDiv(a, b) (((a)>0)?(((a)+(b)/2)/(b)):(((a)-(b)/2)/(b)))
#define SaturaLH(N, L, H) (((N)<(L))?(L):(((N)>(H))?(H):(N)))
/* Types ---------------------------------------------------------------------*/
typedef struct {
/* Public */
float LP_HZ;
float HP_HZ;
uint16_t Fs;
unsigned int nSamples;
uint8_t In_MicChannels;
uint8_t Out_MicChannels;
uint8_t Decimation;
uint8_t MaxVolume;
/* Private */
uint32_t Coef[SINCN];
uint16_t FilterLen;
int64_t OldOut, OldIn, OldZ;
uint16_t LP_ALFA;
uint16_t HP_ALFA;
uint16_t bit[5];
uint16_t byte;
uint16_t filterGain;
} TPDMFilter_InitStruct;
/* Exported functions ------------------------------------------------------- */
void Open_PDM_Filter_Init(TPDMFilter_InitStruct *init_struct);
void Open_PDM_Filter_64(uint8_t* data, int16_t* data_out, uint16_t mic_gain, TPDMFilter_InitStruct *init_struct);
void Open_PDM_Filter_128(uint8_t* data, int16_t* data_out, uint16_t mic_gain, TPDMFilter_InitStruct *init_struct);
#ifdef __cplusplus
}
#endif
#endif // __OPENPDMFILTER_H
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+205
View File
@@ -0,0 +1,205 @@
#include "Arduino.h"
#include "PDM.h"
#include "OpenPDMFilter.h"
extern "C" {
#include "hardware/pio.h"
#include "hardware/dma.h"
#include "hardware/clocks.h"
}
#include "hardware/sync.h"
#include "pdm.pio.h"
// Hardware peripherals used
uint dmaChannel = 0;
PIO pio = pio0;
uint sm = 0;
// raw buffers contain PDM data
#define RAW_BUFFER_SIZE 512 // should be a multiple of (decimation / 8)
uint8_t rawBuffer0[RAW_BUFFER_SIZE];
uint8_t rawBuffer1[RAW_BUFFER_SIZE];
uint8_t* rawBuffer[2] = {rawBuffer0, rawBuffer1};
volatile int rawBufferIndex = 0;
int decimation = 64;
// final buffer is the one to be filled with PCM data
int16_t* volatile finalBuffer;
// OpenPDM filter used to convert PDM into PCM
#define FILTER_GAIN 16
TPDMFilter_InitStruct filter;
extern "C" {
__attribute__((__used__)) void dmaHandler(void)
{
PDM.IrqHandler(true);
}
}
PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
_dinPin(dinPin),
_clkPin(clkPin),
_pwrPin(pwrPin),
_onReceive(NULL),
_gain(-1),
_channels(-1),
_samplerate(-1),
_init(-1)
{
}
PDMClass::~PDMClass()
{
}
int PDMClass::begin(int channels, int sampleRate)
{
//_channels = channels; // only one channel available
// clear the final buffers
_doubleBuffer.reset();
finalBuffer = (int16_t*)_doubleBuffer.data();
int finalBufferLength = _doubleBuffer.availableForWrite() / sizeof(int16_t);
_doubleBuffer.swap(0);
int rawBufferLength = RAW_BUFFER_SIZE / (decimation / 8);
// Saturate number of samples. Remaining bytes are dropped.
if (rawBufferLength > finalBufferLength) {
rawBufferLength = finalBufferLength;
}
/* Initialize Open PDM library */
filter.Fs = sampleRate;
filter.nSamples = rawBufferLength;
filter.LP_HZ = sampleRate/2;
filter.HP_HZ = 10;
filter.In_MicChannels = 1;
filter.Out_MicChannels = 1;
filter.Decimation = decimation;
if(_gain == -1) {
_gain = FILTER_GAIN;
}
filter.filterGain = _gain;
Open_PDM_Filter_Init(&filter);
// Configure PIO state machine
float clkDiv = (float)clock_get_hz(clk_sys) / sampleRate / decimation / 2;
uint offset = pio_add_program(pio, &pdm_pio_program);
pdm_pio_program_init(pio, sm, offset, _clkPin, _dinPin, clkDiv);
// Wait for microphone
delay(100);
// Configure DMA for transferring PIO rx buffer to raw buffers
dma_channel_config c = dma_channel_get_default_config(dmaChannel);
channel_config_set_read_increment(&c, false);
channel_config_set_write_increment(&c, true);
channel_config_set_dreq(&c, pio_get_dreq(pio, sm, false));
channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
// Clear DMA interrupts
dma_hw->ints0 = 1u << dmaChannel;
// Enable DMA interrupts
dma_channel_set_irq0_enabled(dmaChannel, true);
irq_set_exclusive_handler(DMA_IRQ_0, dmaHandler);
irq_set_enabled(DMA_IRQ_0, true);
dma_channel_configure(dmaChannel, &c,
rawBuffer[rawBufferIndex], // Destinatinon pointer
&pio->rxf[sm], // Source pointer
RAW_BUFFER_SIZE, // Number of transfers
true // Start immediately
);
_init = 1;
return 1;
}
void PDMClass::end()
{
dma_channel_abort(dmaChannel);
pinMode(_clkPin, INPUT);
}
int PDMClass::available()
{
//NVIC_DisableIRQ(DMA_IRQ_0n);
//uint32_t interrupts = save_and_disable_interrupts();
irq_set_enabled(DMA_IRQ_0, false);
size_t avail = _doubleBuffer.available();
irq_set_enabled(DMA_IRQ_0, true);
//restore_interrupts(interrupts);
//NVIC_EnableIRQ(DMA_IRQ_0n);
return avail;
}
int PDMClass::read(void* buffer, size_t size)
{
irq_set_enabled(DMA_IRQ_0, false);
int read = _doubleBuffer.read(buffer, size);
irq_set_enabled(DMA_IRQ_0, true);
return read;
}
void PDMClass::onReceive(void(*function)(void))
{
_onReceive = function;
}
void PDMClass::setGain(int gain)
{
_gain = gain;
if(_init == 1) {
filter.filterGain = _gain;
Open_PDM_Filter_Init(&filter);
}
}
void PDMClass::setBufferSize(int bufferSize)
{
_doubleBuffer.setSize(bufferSize);
}
void PDMClass::IrqHandler(bool halftranfer)
{
static int cutSamples = 100;
// Clear the interrupt request.
dma_hw->ints0 = 1u << dmaChannel;
// Restart dma pointing to the other buffer
int shadowIndex = rawBufferIndex ^ 1;
dma_channel_set_write_addr(dmaChannel, rawBuffer[shadowIndex], true);
if (_doubleBuffer.available()) {
// buffer overflow, stop
return end();
}
// fill final buffer with PCM samples
Open_PDM_Filter_64(rawBuffer[rawBufferIndex], finalBuffer, 1, &filter);
if (cutSamples) {
memset(finalBuffer, 0, cutSamples);
cutSamples = 0;
}
// swap final buffer and raw buffers' indexes
finalBuffer = (int16_t*)_doubleBuffer.data();
_doubleBuffer.swap(filter.nSamples * sizeof(int16_t));
rawBufferIndex = shadowIndex;
if (_onReceive) {
_onReceive();
}
}
#ifdef PIN_PDM_DIN
PDMClass PDM(PIN_PDM_DIN, PIN_PDM_CLK, -1);
#endif // PIN_PDM_DIN
+41
View File
@@ -0,0 +1,41 @@
.program pdm_pio
.side_set 1
.wrap_target
; prova a cambiare edge
;sample on falling edge
push iffull noblock side 1
;nop side 1
;nop side 0
in pins, 1 side 0
;nop side 0
.wrap
% c-sdk {
#include "hardware/gpio.h"
static inline void pdm_pio_program_init(PIO pio, uint sm, uint offset, uint clkPin, uint dataPin, float clkDiv) {
pio_sm_config c = pdm_pio_program_get_default_config(offset);
sm_config_set_sideset(&c, 1, false, false);
//sm_config_set_in_shift(&c, false, true, 8);
sm_config_set_in_shift(&c, false, false, 8);
sm_config_set_in_pins(&c, dataPin);
sm_config_set_sideset_pins(&c, clkPin);
sm_config_set_clkdiv(&c, clkDiv);
pio_sm_set_consecutive_pindirs(pio, sm, dataPin, 1, false);
pio_sm_set_consecutive_pindirs(pio, sm, clkPin, 1, true);
pio_sm_set_pins_with_mask(pio, sm, 0, (1u << clkPin) );
//pio_gpio_init(pio, dataPin);
pio_gpio_init(pio, clkPin);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
%}
+56
View File
@@ -0,0 +1,56 @@
// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //
#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif
// ------- //
// pdm_pio //
// ------- //
#define pdm_pio_wrap_target 0
#define pdm_pio_wrap 1
static const uint16_t pdm_pio_program_instructions[] = {
// .wrap_target
0x9040, // 0: push iffull noblock side 1
0x4001, // 1: in pins, 1 side 0
// .wrap
};
#if !PICO_NO_HARDWARE
static const struct pio_program pdm_pio_program = {
.instructions = pdm_pio_program_instructions,
.length = 2,
.origin = -1,
};
static inline pio_sm_config pdm_pio_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + pdm_pio_wrap_target, offset + pdm_pio_wrap);
sm_config_set_sideset(&c, 1, false, false);
return c;
}
#include "hardware/gpio.h"
static inline void pdm_pio_program_init(PIO pio, uint sm, uint offset, uint clkPin, uint dataPin, float clkDiv) {
pio_sm_config c = pdm_pio_program_get_default_config(offset);
sm_config_set_sideset(&c, 1, false, false);
//sm_config_set_in_shift(&c, false, true, 8);
sm_config_set_in_shift(&c, false, false, 8);
sm_config_set_in_pins(&c, dataPin);
sm_config_set_sideset_pins(&c, clkPin);
sm_config_set_clkdiv(&c, clkDiv);
pio_sm_set_consecutive_pindirs(pio, sm, dataPin, 1, false);
pio_sm_set_consecutive_pindirs(pio, sm, clkPin, 1, true);
pio_sm_set_pins_with_mask(pio, sm, 0, (1u << clkPin) );
//pio_gpio_init(pio, dataPin);
pio_gpio_init(pio, clkPin);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
#endif
@@ -0,0 +1,139 @@
/*
Copyright (c) 2016 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include <string.h>
#include "PDMDoubleBuffer.h"
PDMDoubleBuffer::PDMDoubleBuffer() :
_size(DEFAULT_PDM_BUFFER_SIZE)
{
reset();
}
PDMDoubleBuffer::~PDMDoubleBuffer()
{
}
void PDMDoubleBuffer::setSize(int size)
{
_size = size;
reset();
}
size_t PDMDoubleBuffer::getSize()
{
return _size;
}
void PDMDoubleBuffer::reset()
{
_buffer[0] = (uint8_t*)realloc(_buffer[0], _size);
_buffer[1] = (uint8_t*)realloc(_buffer[1], _size);
memset(_buffer[0], 0x00, _size);
memset(_buffer[1], 0x00, _size);
_index = 0;
_length[0] = 0;
_length[1] = 0;
_readOffset[0] = 0;
_readOffset[1] = 0;
}
size_t PDMDoubleBuffer::availableForWrite()
{
return (_size - (_length[_index] - _readOffset[_index]));
}
size_t PDMDoubleBuffer::write(const void *buffer, size_t size)
{
size_t space = availableForWrite();
if (size > space) {
size = space;
}
if (size == 0) {
return 0;
}
memcpy(&_buffer[_index][_length[_index]], buffer, size);
_length[_index] += size;
return size;
}
size_t PDMDoubleBuffer::read(void *buffer, size_t size)
{
size_t avail = available();
if (size > avail) {
size = avail;
}
if (size == 0) {
return 0;
}
memcpy(buffer, &_buffer[_index][_readOffset[_index]], size);
_readOffset[_index] += size;
return size;
}
size_t PDMDoubleBuffer::peek(void *buffer, size_t size)
{
size_t avail = available();
if (size > avail) {
size = avail;
}
if (size == 0) {
return 0;
}
memcpy(buffer, &_buffer[_index][_readOffset[_index]], size);
return size;
}
void* PDMDoubleBuffer::data()
{
return (void*)_buffer[_index];
}
size_t PDMDoubleBuffer::available()
{
return _length[_index] - _readOffset[_index];
}
void PDMDoubleBuffer::swap(int length)
{
if (_index == 0) {
_index = 1;
} else {
_index = 0;
}
_length[_index] = length;
_readOffset[_index] = 0;
}
@@ -0,0 +1,54 @@
/*
Copyright (c) 2016 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _PDM_DOUBLE_BUFFER_H_INCLUDED
#define _PDM_DOUBLE_BUFFER_H_INCLUDED
#include <stddef.h>
#include <stdint.h>
#define DEFAULT_PDM_BUFFER_SIZE 512
class PDMDoubleBuffer
{
public:
PDMDoubleBuffer();
virtual ~PDMDoubleBuffer();
void setSize(int size);
size_t getSize();
void reset();
size_t availableForWrite();
size_t write(const void *buffer, size_t size);
size_t read(void *buffer, size_t size);
size_t peek(void *buffer, size_t size);
void* data();
size_t available();
void swap(int length = 0);
private:
uint8_t* _buffer[2] __attribute__((aligned (16)));
int _size;
volatile int _length[2];
volatile int _readOffset[2];
volatile int _index;
};
#endif
+2 -2
View File
@@ -234,8 +234,8 @@ protected:
}
static uint8_t _getFlags(OpenMode openMode, AccessMode accessMode) {
uint8_t mode = 0;
static int _getFlags(OpenMode openMode, AccessMode accessMode) {
int mode = 0;
if (openMode & OM_CREATE) {
mode |= O_CREAT;
}
+3
View File
@@ -38,6 +38,9 @@
{
"name": "Adafruit Trinkey RP2040 QT"
},
{
"name": "Arduino Nano RP2040 Connect"
},
{
"name": "SparkFun ProMicro RP2040"
},
+1
View File
@@ -26,6 +26,7 @@ function skip_ino()
/p08_DigitalHourglass/
/p13_TouchSensorLamp/
/StringComparisonOperators/
/PDMSerialPlotter/
EOL
echo $ino | grep -q -F "$skiplist"
echo $(( 1 - $? ))
+1
View File
@@ -126,6 +126,7 @@ MakeBoard("adafruit_qtpy", "Adafruit", "QT Py RP2040", "0x239a", "0x80f7", "ADAF
MakeBoard("adafruit_stemmafriend", "Adafruit", "STEMMA Friend RP2040", "0x239a", "0x80e3", "ADAFRUIT_STEMMAFRIEND_RP2040", 8, "boot2_w25q080_2_padded_checksum")
MakeBoard("adafruit_trinkeyrp2040qt", "Adafruit", "Trinkey RP2040 QT", "0x239a", "0x8109", "ADAFRUIT_TRINKEYQT_RP2040", 8, "boot2_w25q080_2_padded_checksum")
MakeBoard("adafruit_macropad2040", "Adafruit", "MacroPad RP2040", "0x239a", "0x8107", "ADAFRUIT_MACROPAD_RP2040", 8, "boot2_w25q080_2_padded_checksum")
MakeBoard("arduino_nano_connect", "Arduino", "Nano RP2040 Connect", "0x2341", "0x0058", "ARDUINO_NANO_RP2040_CONNECT", 16, "boot2_w25q080_2_padded_checksum")
MakeBoard("sparkfun_promicrorp2040", "SparkFun", "ProMicro RP2040", "0x1b4f", "0x0026", "SPARKFUN_PROMICRO_RP2040", 16, "boot2_generic_03h_4_padded_checksum")
MakeBoard("generic", "Generic", "RP2040", "0x2e8a", "0xf00a", "GENERIC_RP2040", 16, "boot2_generic_03h_4_padded_checksum")
@@ -0,0 +1,53 @@
/* Taken from https://github.com/arduino/ArduinoCore-mbed/tree/master/variants/NANO_RP2040_CONNECT */
AnalogPinDescription g_AAnalogPinDescription[] = {
{ p26, NULL }, // A0
{ p27, NULL }, // A1
{ p28, NULL }, // A2
{ p29, NULL }, // A3
};
PinDescription g_APinDescription[] = {
// D0 - D7
{ p1, NULL, NULL, NULL }, // D0
{ p0, NULL, NULL, NULL }, // D1
{ p25, NULL, NULL, NULL }, // D2
{ p15, NULL, NULL, NULL }, // D3
{ p16, NULL, NULL, NULL }, // D4
{ p17, NULL, NULL, NULL }, // D5
{ p18, NULL, NULL, NULL }, // D6
{ p19, NULL, NULL, NULL }, // D7
// D8 - D13
{ p20, NULL, NULL, NULL }, // D8
{ p21, NULL, NULL, NULL }, // D9
{ p5, NULL, NULL, NULL }, // D10
{ p7, NULL, NULL, NULL }, // D11 / SPITX
{ p4, NULL, NULL, NULL }, // D12 / SPIRX
{ p6, NULL, NULL, NULL }, // D13 / SPICLK / LEDB
// Analog as digital
// A4 to A7 are controlled by Nina module and exposed via different APIs
{ p26, NULL, NULL, NULL }, // A0 -> D14
{ p27, NULL, NULL, NULL }, // A1 -> D15
{ p28, NULL, NULL, NULL }, // A2 -> D16
{ p29, NULL, NULL, NULL }, // A3 -> D17
// I2C
{ p12, NULL, NULL, NULL }, // A4 / SDA -> D18
{ p13, NULL, NULL, NULL }, // A5 / SCL -> D19
// Internal pins - D20 - D23
{ p2, NULL, NULL, NULL }, // GPIO0
{ p24, NULL, NULL, NULL }, // IMU IRQ
{ p22, NULL, NULL, NULL }, // PDM DATA IN
{ p23, NULL, NULL, NULL }, // PDM CLOCK
// Internal pins Nina - D24 - D29
{ p3, NULL, NULL, NULL }, // RESET_NINA
{ p8, NULL, NULL, NULL }, // SPI1_CIPO / UART1_TX
{ p9, NULL, NULL, NULL }, // SPI1_CS / UART1_RX
{ p10, NULL, NULL, NULL }, // SPI1_ACK / UART1_CTS
{ p11, NULL, NULL, NULL }, // SPI1_COPI / UART1_RTS
{ p14, NULL, NULL, NULL }, // SPI1_SCK
};
+48
View File
@@ -0,0 +1,48 @@
/* Taken from https://github.com/arduino/ArduinoCore-mbed/tree/master/variants/NANO_RP2040_CONNECT */
#ifndef _NINA_PINS_
#define _NINA_PINS_
/******************************************************************************
* INCLUDE
******************************************************************************/
#include "Arduino.h"
//#include "WiFiNINA.h"
/******************************************************************************
* PREPROCESSOR-MAGIC
******************************************************************************/
#if __has_include("WiFiNINA.h")
# define NINA_ATTRIBUTE
#else
# define NINA_ATTRIBUTE __attribute__ ((error("Please include WiFiNINA.h to use this pin")))
#endif
/******************************************************************************
* TYPEDEF
******************************************************************************/
enum NinaPin {
LEDR = 27,
LEDG = 25,
LEDB = 26//,
//A4 = 34,
//A5 = 39,
//A6 = 36,
//A7 = 35
};
/******************************************************************************
* FUNCTION DECLARATION
******************************************************************************/
void NINA_ATTRIBUTE pinMode (NinaPin pin, PinMode mode);
PinStatus NINA_ATTRIBUTE digitalRead (NinaPin pin);
void NINA_ATTRIBUTE digitalWrite(NinaPin pin, PinStatus value);
int NINA_ATTRIBUTE analogRead (NinaPin pin);
void NINA_ATTRIBUTE analogWrite (NinaPin pin, int value);
#undef NINA_ATTRIBUTE
#endif /* _NINA_PINS_ */
@@ -0,0 +1,120 @@
/* Taken from https://github.com/arduino/ArduinoCore-mbed/tree/master/variants/NANO_RP2040_CONNECT */
#pragma once
// Pin definitions taken from:
// https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf
static const uint8_t D0 = (1u);
static const uint8_t D1 = (0u);
static const uint8_t D2 = (25u);
static const uint8_t D3 = (15u);
static const uint8_t D4 = (16u);
static const uint8_t D5 = (17u);
static const uint8_t D6 = (18u);
static const uint8_t D7 = (19u);
static const uint8_t D8 = (20u);
static const uint8_t D9 = (21u);
static const uint8_t D10 = (5u);
static const uint8_t D11 = (7u);
static const uint8_t D12 = (4u);
static const uint8_t D13 = (6u);
static const uint8_t D14 = (26u);
static const uint8_t D15 = (27u);
static const uint8_t D16 = (28u);
static const uint8_t D17 = (29u);
static const uint8_t D18 = (12u);
static const uint8_t D19 = (13u);
static const uint8_t D20 = (2u);
static const uint8_t D21 = (24u);
static const uint8_t D22 = (22u);
static const uint8_t D23 = (23u);
static const uint8_t D24 = (3u);
static const uint8_t D25 = (8u);
static const uint8_t D26 = (9u);
static const uint8_t D27 = (10u);
static const uint8_t D28 = (11u);
static const uint8_t D29 = (14u);
static const uint8_t A0 = (26u);
static const uint8_t A1 = (27u);
static const uint8_t A2 = (28u);
static const uint8_t A3 = (29u);
static const uint8_t A4 = (12u);
static const uint8_t A5 = (13u);
// LEDs
#define PIN_LED (D13)
// Serial
#define PIN_SERIAL1_TX (D1)
#define PIN_SERIAL1_RX (D0)
#define PIN_SERIAL2_TX (D25)
#define PIN_SERIAL2_RX (D26)
// SPI
#define PIN_SPI0_MISO (D12)
#define PIN_SPI0_MOSI (D11)
#define PIN_SPI0_SCK (D13)
#define PIN_SPI0_SS (13u)//(D10)
#define PIN_SPI1_MISO (D25)
#define PIN_SPI1_MOSI (D28)
#define PIN_SPI1_SCK (D29)
#define PIN_SPI1_SS (13u)
// Wire
#define PIN_WIRE0_SDA (D18)
#define PIN_WIRE0_SCL (D19)
#define PIN_WIRE1_SDA (26u) //Non c'è
#define PIN_WIRE1_SCL (27u) //Non c'è
#define SERIAL_HOWMANY (3u)
#define SPI_HOWMANY (2u)
#define WIRE_HOWMANY (1u)
#define PINS_COUNT (30u)
#define NUM_DIGITAL_PINS (30u)
#define NUM_ANALOG_INPUTS (4u)
#define NUM_ANALOG_OUTPUTS (0u)
#define ADC_RESOLUTION (12u)
#define LED_BUILTIN PIN_LED
#define DigitalPinToPinName(p) (p)
static const uint8_t SS = PIN_SPI0_SS;
static const uint8_t MOSI = PIN_SPI0_MOSI;
static const uint8_t MISO = PIN_SPI0_MISO;
static const uint8_t SCK = PIN_SPI0_SCK;
//Nina support
#define NINA_RESETN (D24)
#define SerialNina Serial3
#define SerialHCI Serial2
//#define NINA_GPIOIRQ (21u) // LEDG pin (GPIO26 on NINA)
#define NINA_GPIO0 (20u) // real GPIO0 on NINA
#define SPIWIFI_SS (D26)
#define SPIWIFI_ACK (D27)
#define SPIWIFI_RESET (NINA_RESETN)
#define SPIWIFI (SPI1)
// PDM Interfaces
// ---------------
#define PIN_PDM_CLK (D23)
#define PIN_PDM_DIN (D22)
//Cose copiate a caso
#define SERIAL_PORT_USBVIRTUAL SerialUSB
#define SERIAL_PORT_MONITOR SerialUSB
#define SERIAL_PORT_HARDWARE Serial1
#define SERIAL_PORT_HARDWARE_OPEN Serial2
#define CRYPTO_WIRE Wire
#define USB_MAX_POWER (500)
#include "nina_pins.h"