pcb-bringup #1

Merged
clyne merged 6 commits from pcb-bringup into main 5 months ago

2
.gitignore vendored

@ -3,4 +3,6 @@
*.pretty *.pretty
*.step *.step
build build
hardware/fp-info-cache
hardware/noisecard-backups
hardware/production hardware/production

@ -40,6 +40,21 @@ void __early_init(void) {
* @note Add your board-specific code, if any. * @note Add your board-specific code, if any.
*/ */
void boardInit(void) { void boardInit(void) {
//palSetLineMode(LINE_LED_GREEN, PAL_MODE_OUTPUT_PUSHPULL); palSetLineMode(LINE_LED0, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED0);
palSetLineMode(LINE_LED1, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED1);
palSetLineMode(LINE_LED2, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED2);
palSetLineMode(LINE_LED3, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED3);
palSetLineMode(LINE_LED4, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED4);
palSetLineMode(LINE_LED5, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED5);
palSetLineMode(LINE_LED6, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED6);
palSetLineMode(LINE_LED7, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED7);
palSetLineMode(LINE_LED8, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED8);
palSetLineMode(LINE_LED9, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED9);
palSetLineMode(LINE_TP1, PAL_MODE_OUTPUT_PUSHPULL); palClearLine(LINE_TP1);
palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0));
palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0));
palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0));
} }

@ -53,13 +53,22 @@
/* /*
* IO lines assignments. * IO lines assignments.
*/ */
//#define LINE_LED_GREEN PAL_LINE(GPIOA, 12U) #define LINE_I2S_SD PAL_LINE(GPIOA, 7U)
#define LINE_I2S_WS PAL_LINE(GPIOA, 4U)
#define LINE_I2S_SD PAL_LINE(GPIOA, 12U) // or PB5 #define LINE_I2S_CK PAL_LINE(GPIOA, 5U)
#define LINE_I2S_WS PAL_LINE(GPIOB, 0U)
#define LINE_I2S_CK PAL_LINE(GPIOA, 1U) #define LINE_TP1 PAL_LINE(GPIOA, 12U)
#define LINE_USART2_TX PAL_LINE(GPIOA, 14U) #define LINE_LED0 PAL_LINE(GPIOB, 7U)
#define LINE_LED1 PAL_LINE(GPIOC, 14U)
#define LINE_LED2 PAL_LINE(GPIOC, 15U)
#define LINE_LED3 PAL_LINE(GPIOA, 0U)
#define LINE_LED4 PAL_LINE(GPIOA, 1U)
#define LINE_LED5 PAL_LINE(GPIOA, 2U)
#define LINE_LED6 PAL_LINE(GPIOA, 3U)
#define LINE_LED7 PAL_LINE(GPIOA, 6U)
#define LINE_LED8 PAL_LINE(GPIOB, 0U)
#define LINE_LED9 PAL_LINE(GPIOB, 3U)
/* /*
* I/O ports initial setup, this configuration is established soon after reset * I/O ports initial setup, this configuration is established soon after reset

@ -142,7 +142,7 @@
* @brief Enables the SERIAL subsystem. * @brief Enables the SERIAL subsystem.
*/ */
#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) #if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
#define HAL_USE_SERIAL TRUE #define HAL_USE_SERIAL FALSE
#endif #endif
/** /**

@ -172,7 +172,7 @@
* SERIAL driver system settings. * SERIAL driver system settings.
*/ */
#define STM32_SERIAL_USE_USART1 FALSE #define STM32_SERIAL_USE_USART1 FALSE
#define STM32_SERIAL_USE_USART2 TRUE #define STM32_SERIAL_USE_USART2 FALSE
#define STM32_SERIAL_USE_LPUART1 FALSE #define STM32_SERIAL_USE_LPUART1 FALSE
/* /*

@ -7416,7 +7416,7 @@
(gr_text "FABRICATION DRAWING" (at 150 25) (layer "Dwgs.User") (tstamp d68f8496-1f7a-4583-b409-3c765734f735) (gr_text "FABRICATION DRAWING" (at 150 25) (layer "Dwgs.User") (tstamp d68f8496-1f7a-4583-b409-3c765734f735)
(effects (font (size 2 2) (thickness 0.25) bold)) (effects (font (size 2 2) (thickness 0.25) bold))
) )
(gr_text "NOTES\n\n 1. PRINTED CIRCUIT BOARD MADE FROM NEMA GRADE FR-4 EPOXY LAMINATE.\n 2. ALL DIMENSIONS ARE GIVEN IN MILLIMETERS.\n 3. CIRCUIT PATHS ARE FOR REFERENCE ONLY.\n 4. HOLE SIZES SHOWN ARE FINISHED DIAMETERS AFTER PLATING.\n 5. APPLY GREEN SOLDER MASK ON PLATED SURFACES.\n 6. SILKSCREEN TOP SIDE USING WHITE INK.\n 7. ALL VIAS ARE TENTED ON BOTH SIDES.\n 8. 2 COPPER LAYERS.\n 9. 1.6MM BOARD THICKNESS.\n10. COPPER THICKNESS 1 OZ." (at 38.75 139) (layer "Dwgs.User") (tstamp d939a69e-194e-46a0-9c0c-335c0a91742c) (gr_text "NOTES\n\n 1. PRINTED CIRCUIT BOARD MADE FROM NEMA GRADE FR-4 EPOXY LAMINATE.\n 2. ALL DIMENSIONS ARE GIVEN IN MILLIMETERS.\n 3. CIRCUIT PATHS ARE FOR REFERENCE ONLY.\n 4. HOLE SIZES SHOWN ARE FINISHED DIAMETERS AFTER PLATING.\n 5. APPLY GREEN SOLDER MASK ON PLATED SURFACES.\n 6. SILKSCREEN TOP SIDE USING WHITE INK.\n 7. ALL VIAS ARE TENTED ON BOTH SIDES.\n 8. 2 COPPER LAYERS.\n 9. 0.8MM BOARD THICKNESS.\n10. COPPER THICKNESS 1 OZ." (at 38.75 139) (layer "Dwgs.User") (tstamp d939a69e-194e-46a0-9c0c-335c0a91742c)
(effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top)) (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top))
) )
(gr_text "{\\H2.0000;www.hammondmfg.com}" (at 602.59387 247.297935) (layer "User.3") (tstamp 05fdb0fe-aa41-4d1c-9218-ed7330023c5e) (gr_text "{\\H2.0000;www.hammondmfg.com}" (at 602.59387 247.297935) (layer "User.3") (tstamp 05fdb0fe-aa41-4d1c-9218-ed7330023c5e)

@ -1876,7 +1876,7 @@
(property "Reference" "C3" (at 73.66 32.766 0) (property "Reference" "C3" (at 73.66 32.766 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Value" "330u" (at 73.66 35.306 0) (property "Value" "330uF" (at 73.66 35.306 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "Capacitor_Tantalum_SMD:CP_EIA-7343-15_Kemet-W" (at 71.4502 38.735 0) (property "Footprint" "Capacitor_Tantalum_SMD:CP_EIA-7343-15_Kemet-W" (at 71.4502 38.735 0)
@ -1971,8 +1971,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 102.87 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 102.87 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f5))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89e))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2000,8 +2000,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 115.57 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 115.57 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f6))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89f))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2029,8 +2029,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 96.52 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 96.52 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f7))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a0))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2104,7 +2104,7 @@
(property "Reference" "C8" (at 50.165 114.9413 0) (property "Reference" "C8" (at 50.165 114.9413 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "2U2" (at 50.165 117.4813 0) (property "Value" "2.2uF" (at 50.165 117.4813 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 53.34 115.57 0) (property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 53.34 115.57 0)
@ -2183,7 +2183,7 @@
(property "Reference" "C9" (at 61.595 114.9413 0) (property "Reference" "C9" (at 61.595 114.9413 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "0.1U" (at 61.595 117.4813 0) (property "Value" "0.1uF" (at 61.595 117.4813 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 58.42 115.57 0) (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 58.42 115.57 0)
@ -2212,7 +2212,7 @@
(property "Reference" "C1" (at 102.87 33.655 0) (property "Reference" "C1" (at 102.87 33.655 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Value" "4u7" (at 102.87 36.195 0) (property "Value" "4.7uF" (at 102.87 36.195 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 100.0252 38.735 0) (property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 100.0252 38.735 0)
@ -2253,8 +2253,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 121.92 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 121.92 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f8))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a1))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2346,7 +2346,7 @@
(property "Reference" "C2" (at 148.59 33.655 0) (property "Reference" "C2" (at 148.59 33.655 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Value" "10u" (at 148.59 36.195 0) (property "Value" "10uF" (at 148.59 36.195 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 146.3802 38.735 0) (property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 146.3802 38.735 0)
@ -2387,8 +2387,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 128.27 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 128.27 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f9))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a2))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2442,10 +2442,10 @@
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "1" (uuid bd037501-f2bd-4716-a242-b9d25cf98220)) (pin "1" (uuid bd037501-f2bd-4716-a242-b9d25cf98220))
(pin "6" (uuid 3278223c-3fa9-40df-bb18-ef628deff05e)) (pin "6" (uuid 3278223c-3fa9-40df-bb18-ef628deff05f))
(pin "3" (uuid 11f70334-c848-47e5-a24d-625d53901c27)) (pin "3" (uuid 11f70334-c848-47e5-a24d-625d53901c27))
(pin "4" (uuid d24118b6-8fda-400d-b722-8d6333a5a013)) (pin "4" (uuid d24118b6-8fda-400d-b722-8d6333a5a014))
(pin "5" (uuid 175b6856-006f-44d2-9833-9acdf94689ee)) (pin "5" (uuid 175b6856-006f-44d2-9833-9acdf94689ef))
(pin "2" (uuid ce0b9538-62de-4592-920a-f74542d66135)) (pin "2" (uuid ce0b9538-62de-4592-920a-f74542d66135))
(instances (instances
(project "noisecard" (project "noisecard"
@ -2819,8 +2819,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 147.32 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 147.32 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15fa))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a3))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2836,7 +2836,7 @@
(property "Reference" "C4" (at 88.9 32.766 0) (property "Reference" "C4" (at 88.9 32.766 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Value" "330u" (at 88.9 35.306 0) (property "Value" "330uF" (at 88.9 35.306 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "Capacitor_Tantalum_SMD:CP_EIA-7343-15_Kemet-W" (at 86.0552 38.735 0) (property "Footprint" "Capacitor_Tantalum_SMD:CP_EIA-7343-15_Kemet-W" (at 86.0552 38.735 0)
@ -2915,7 +2915,7 @@
(property "Reference" "L1" (at 135.255 24.765 90) (property "Reference" "L1" (at 135.255 24.765 90)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Value" "10u" (at 135.255 27.305 90) (property "Value" "10uH" (at 135.255 27.305 90)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Footprint" "Inductor_SMD:L_0805_2012Metric" (at 135.255 29.845 0) (property "Footprint" "Inductor_SMD:L_0805_2012Metric" (at 135.255 29.845 0)
@ -2956,8 +2956,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 153.67 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 153.67 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15fb))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a4))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -2973,7 +2973,7 @@
(property "Reference" "C6" (at 245.11 38.7413 0) (property "Reference" "C6" (at 245.11 38.7413 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "0.1U" (at 245.11 41.2813 0) (property "Value" "0.1uF" (at 245.11 41.2813 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 241.935 39.37 0) (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 241.935 39.37 0)
@ -3027,7 +3027,7 @@
(property "Reference" "C5" (at 66.675 90.1763 0) (property "Reference" "C5" (at 66.675 90.1763 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "0.1U" (at 66.675 92.7163 0) (property "Value" "0.1uF" (at 66.675 92.7163 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 63.5 90.805 0) (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 63.5 90.805 0)
@ -3209,8 +3209,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 140.97 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 140.97 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15fc))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a5))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"
@ -3226,7 +3226,7 @@
(property "Reference" "C7" (at 254 38.7413 0) (property "Reference" "C7" (at 254 38.7413 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "200P" (at 254 41.2813 0) (property "Value" "200pF" (at 254 41.2813 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 250.825 39.37 0) (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" (at 250.825 39.37 0)
@ -3341,8 +3341,8 @@
(property "Part Number" "APTD1608LSURCK" (at 214.63 109.22 0) (property "Part Number" "APTD1608LSURCK" (at 214.63 109.22 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15f4)) (pin "2" (uuid 455ac6a2-863b-43b8-9272-a864429f15fd))
(pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f89d)) (pin "1" (uuid d1a0fde7-e9af-40b6-a11b-543a47a2f8a6))
(instances (instances
(project "noisecard" (project "noisecard"
(path "/2019f223-1307-408a-bf87-dad398f72c59" (path "/2019f223-1307-408a-bf87-dad398f72c59"

@ -34,7 +34,7 @@ static constexpr auto MIC_BITS = 18u;
static constexpr auto SAMPLE_RATE = 48000u; static constexpr auto SAMPLE_RATE = 48000u;
static constexpr unsigned I2S_BUFSIZ = 1024; static constexpr unsigned I2S_BUFSIZ = 1024;
static constexpr unsigned I2S_STRIDE = 16; static constexpr unsigned I2S_USESIZ = 16;
// Calculate reference amplitude value at compile time // Calculate reference amplitude value at compile time
static const auto MIC_REF_AMPL = sos_t((1 << (MIC_BITS - 1)) - 1) * static const auto MIC_REF_AMPL = sos_t((1 << (MIC_BITS - 1)) - 1) *
@ -45,6 +45,7 @@ static std::array<uint32_t, I2S_BUFSIZ> i2sBuffer;
static sos_t Leq_sum_sqr (0.f); static sos_t Leq_sum_sqr (0.f);
static unsigned Leq_samples = 0; static unsigned Leq_samples = 0;
static void blinkDb(int db);
static void i2sCallback(I2SDriver *i2s); static void i2sCallback(I2SDriver *i2s);
static constexpr unsigned I2SPRval = 16'000'000 / SAMPLE_RATE / 32 / 2; static constexpr unsigned I2SPRval = 16'000'000 / SAMPLE_RATE / 32 / 2;
@ -64,45 +65,66 @@ int main(void)
{ {
halInit(); halInit();
osalSysEnable(); osalSysEnable();
osalThreadSleepMilliseconds(2000);
palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOF, 2, PAL_MODE_UNCONNECTED);
palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0));
palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0));
palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0));
palSetLineMode(LINE_USART2_TX, PAL_MODE_ALTERNATE(1));
sdStart(&SD2, NULL);
sdWrite(&SD2, (uint8_t *)"Noisemeter\n", 11);
osalThreadSleepMilliseconds(2);
i2sReady.store(true);
i2sStart(&I2SD1, &i2sConfig); i2sStart(&I2SD1, &i2sConfig);
i2sStartExchange(&I2SD1); i2sStartExchange(&I2SD1);
// Microphone warmup time
osalThreadSleepMilliseconds(140);
// Reach filter delay steady state
i2sReady.store(false);
osalThreadSleepMilliseconds(120);
// Discard initial readings
Leq_sum_sqr = 0.f;
Leq_samples = 0;
uint8_t strbuf[7] = { 0, 0, 0, 'd', 'B', '\n', '\0' };
for (;;) { for (;;) {
i2sReady.store(false); i2sReady.store(false);
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
//palClearLine(LINE_TP1);
__WFI(); __WFI();
//palSetLine(LINE_TP1);
palSetPad(GPIOB, 7); const auto sum_sqr = std::exchange(Leq_sum_sqr, sos_t(0.f));
const sos_t Leq_RMS = qfp_fsqrt(Leq_sum_sqr / qfp_uint2float(Leq_samples)); const auto count = std::exchange(Leq_samples, 0);
const sos_t Leq_RMS = qfp_fsqrt(sum_sqr / qfp_uint2float(count));
const sos_t Leq_dB = MIC_OFFSET_DB + MIC_REF_DB + sos_t(20.f) * const sos_t Leq_dB = MIC_OFFSET_DB + MIC_REF_DB + sos_t(20.f) *
qfp_flog10(Leq_RMS / MIC_REF_AMPL); qfp_flog10(Leq_RMS / MIC_REF_AMPL);
Leq_sum_sqr = sos_t(0.f); const auto n = std::clamp(qfp_float2int(Leq_dB), 0, 999);
Leq_samples = 0; blinkDb(n);
auto n = std::clamp(qfp_float2int(Leq_dB), 0, 999);
strbuf[2] = n % 10 + '0'; n /= 10;
strbuf[1] = n % 10 + '0'; n /= 10;
strbuf[0] = n ? n + '0' : ' ';
sdWrite(&SD2, strbuf, sizeof(strbuf));
osalThreadSleepMilliseconds(2);
palClearPad(GPIOB, 7);
} }
} }
void blinkDb(int db)
{
auto line = LINE_LED0;
if (db < 45)
line = LINE_LED0;
else if (db < 55)
line = LINE_LED1;
else if (db < 65)
line = LINE_LED2;
else if (db < 75)
line = LINE_LED3;
else if (db < 82)
line = LINE_LED4;
else if (db < 87)
line = LINE_LED5;
else if (db < 92)
line = LINE_LED6;
else if (db < 97)
line = LINE_LED7;
else if (db < 102)
line = LINE_LED8;
else
line = LINE_LED9;
palClearLine(line);
osalThreadSleepMilliseconds(100);
palSetLine(line);
}
__attribute__((section(".data"))) __attribute__((section(".data")))
int32_t fixsample(uint32_t s) { int32_t fixsample(uint32_t s) {
return (int32_t)(((s & 0xFFFF) << 16) | (s >> 16)) >> (32 - MIC_BITS); return (int32_t)(((s & 0xFFFF) << 16) | (s >> 16)) >> (32 - MIC_BITS);
@ -114,27 +136,29 @@ void i2sCallback(I2SDriver *i2s)
if (i2sReady.load()) if (i2sReady.load())
return; return;
palSetPad(GPIOB, 7); //palSetLine(LINE_TP1);
const auto halfsize = i2sBuffer.size() / 2; const auto halfsize = i2sBuffer.size() / 2;
const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0); const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0);
auto samples = reinterpret_cast<sos_t *>(source); auto samples = reinterpret_cast<sos_t *>(source);
std::ranges::copy( std::ranges::copy(
std::views::counted(source, halfsize / I2S_STRIDE) std::views::counted(source, I2S_USESIZ * 2)
| std::ranges::views::stride(2) | std::ranges::views::stride(2)
| std::views::transform([](uint32_t s) { return sos_t(qfp_int2float_asm(fixsample(s))); }), | std::views::transform([](uint32_t s) { return sos_t(qfp_int2float_asm(fixsample(s))); }),
samples); samples);
auto samps = std::views::counted(samples, halfsize / (2 * I2S_STRIDE)); auto samps = std::views::counted(samples, I2S_USESIZ);
// Accumulate Leq sum // Accumulate Leq sum
MIC_EQUALIZER.filter(samps); MIC_EQUALIZER.filter(samps);
Leq_sum_sqr += WEIGHTING.filter_sum_sqr(samps); Leq_sum_sqr += WEIGHTING.filter_sum_sqr(samps);
Leq_samples += samps.size(); Leq_samples += halfsize / 2;
// Wakeup main thread for dB calculation every second // Wakeup main thread for dB calculation every half second
if (Leq_samples >= SAMPLE_RATE / I2S_STRIDE) { if (Leq_samples >= SAMPLE_RATE / 2) {
i2sReady.store(true); i2sReady.store(true);
SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
} }
palClearPad(GPIOB, 7);
//palClearLine(LINE_TP1);
} }

Loading…
Cancel
Save