66#include <wolfHAL/platform/st/stm32wb55xx.h>
77#include "peripheral.h"
88
9+
910/* SysTick timing */
1011volatile uint32_t g_tick = 0 ;
1112volatile uint8_t g_waiting = 0 ;
@@ -30,6 +31,11 @@ whal_Timeout g_whalTimeout = {
3031 .GetTick = Board_GetTick ,
3132};
3233
34+ /* IRQ */
35+ whal_Irq g_whalIrq = {
36+ WHAL_CORTEX_M4_NVIC_DEVICE ,
37+ };
38+
3339/* Clock */
3440whal_Clock g_whalClock = {
3541 WHAL_STM32WB55_RCC_PLL_DEVICE ,
@@ -155,7 +161,43 @@ whal_Timer g_whalTimer = {
155161 },
156162};
157163
164+ /* DMA */
165+ #ifdef BOARD_DMA
166+ /* DMA types already available via stm32wb_uart.h included through platform header */
167+
168+ whal_Dma g_whalDma1 = {
169+ WHAL_STM32WB55_DMA1_DEVICE ,
170+ .cfg = & (whal_Stm32wbDma_Cfg ){WHAL_STM32WB55_DMA1_CFG },
171+ };
172+
173+ static const whal_Stm32wbRcc_Clk g_dmaClock = {WHAL_STM32WB55_DMA1_CLOCK };
174+ static const whal_Stm32wbRcc_Clk g_dmamuxClock = {WHAL_STM32WB55_DMAMUX1_CLOCK };
175+
176+ void DMA1_Channel4_IRQHandler (void )
177+ {
178+ whal_Stm32wbDma_IRQHandler (& g_whalDma1 , 3 );
179+ }
180+
181+ void DMA1_Channel5_IRQHandler (void )
182+ {
183+ whal_Stm32wbDma_IRQHandler (& g_whalDma1 , 4 );
184+ }
185+ #endif
186+
158187/* UART */
188+ #ifdef BOARD_DMA
189+ whal_Uart g_whalUart = {
190+ WHAL_STM32WB55_UART1_DEVICE ,
191+ .driver = & whal_Stm32wbUartDma_Driver ,
192+ .cfg = & (whal_Stm32wbUartDma_Cfg ) {
193+ .brr = WHAL_STM32WB_UART_BRR (64000000 , 115200 ),
194+ .timeout = & g_whalTimeout ,
195+ .dma = & g_whalDma1 ,
196+ .txCh = 3 ,
197+ .rxCh = 4 ,
198+ },
199+ };
200+ #else
159201whal_Uart g_whalUart = {
160202 WHAL_STM32WB55_UART1_DEVICE ,
161203
@@ -165,6 +207,7 @@ whal_Uart g_whalUart = {
165207 .brr = WHAL_STM32WB_UART_BRR (64000000 , 115200 ),
166208 },
167209};
210+ #endif
168211
169212/* Flash */
170213whal_Flash g_whalFlash = {
@@ -174,7 +217,7 @@ whal_Flash g_whalFlash = {
174217 .timeout = & g_whalTimeout ,
175218
176219 .startAddr = 0x08000000 ,
177- .size = 0x100000 ,
220+ .size = 0x80000 , /* 512 KB (upper half reserved for BLE stack) */
178221 },
179222};
180223
@@ -260,6 +303,26 @@ whal_Error Board_Init(void)
260303 return err ;
261304 }
262305
306+ err = whal_Irq_Init (& g_whalIrq );
307+ if (err )
308+ return err ;
309+
310+ #ifdef BOARD_DMA
311+ err = whal_Clock_Enable (& g_whalClock , & g_dmaClock );
312+ if (err )
313+ return err ;
314+ err = whal_Clock_Enable (& g_whalClock , & g_dmamuxClock );
315+ if (err )
316+ return err ;
317+ err = whal_Dma_Init (& g_whalDma1 );
318+ if (err )
319+ return err ;
320+
321+ /* Enable NVIC interrupts for DMA1 channel 4 (IRQ 14) and channel 5 (IRQ 15) */
322+ whal_Irq_Enable (& g_whalIrq , 14 , NULL );
323+ whal_Irq_Enable (& g_whalIrq , 15 , NULL );
324+ #endif
325+
263326 err = whal_Gpio_Init (& g_whalGpio );
264327 if (err ) {
265328 return err ;
@@ -357,6 +420,25 @@ whal_Error Board_Deinit(void)
357420 return err ;
358421 }
359422
423+ #ifdef BOARD_DMA
424+ whal_Irq_Disable (& g_whalIrq , 14 );
425+ whal_Irq_Disable (& g_whalIrq , 15 );
426+
427+ err = whal_Dma_Deinit (& g_whalDma1 );
428+ if (err )
429+ return err ;
430+ err = whal_Clock_Disable (& g_whalClock , & g_dmamuxClock );
431+ if (err )
432+ return err ;
433+ err = whal_Clock_Disable (& g_whalClock , & g_dmaClock );
434+ if (err )
435+ return err ;
436+ #endif
437+
438+ err = whal_Irq_Deinit (& g_whalIrq );
439+ if (err )
440+ return err ;
441+
360442 /* Disable clocks */
361443 for (size_t i = 0 ; i < CLOCK_COUNT ; i ++ ) {
362444 err = whal_Clock_Disable (& g_whalClock , & g_clocks [i ]);
0 commit comments