/** * \file * * * \brief STM32 debug support (implementation). * * \author Andrea Righi */ #include "kdebug_stm32.h" #include #include #include /* RCC */ #include #if CONFIG_KDEBUG_PORT == 0 #define UART_BASE ((struct stm32_usart *)USART1_BASE) #elif CONFIG_KDEBUG_PORT == 1 #define UART_BASE ((struct stm32_usart *)USART2_BASE) #elif CONFIG_KDEBUG_PORT == 2 #define UART_BASE ((struct stm32_usart *)USART3_BASE) #else #error "UART port not supported in this board" #endif #define KDBG_WAIT_READY() while (!(UART_BASE->SR & USART_FLAG_TXE)) #define KDBG_WAIT_TXDONE() while (!(UART_BASE->SR & USART_FLAG_TC)) #define KDBG_WRITE_CHAR(c) do { UART_BASE->DR = (c) & 0x1ff; } while(0) /* Debug unit is used only for debug purposes so does not generate interrupts. */ #define KDBG_MASK_IRQ(old) do { (void)old; } while(0) /* Debug unit is used only for debug purposes so does not generate interrupts. */ #define KDBG_RESTORE_IRQ(old) do { (void)old; } while(0) typedef uint32_t kdbg_irqsave_t; /* Initialize UART debug port */ INLINE void kdbg_hw_init(void) { /* Enable clocking on AFIO */ RCC->APB2ENR |= RCC_APB2_AFIO; /* Configure USART pins */ #if CONFIG_KDEBUG_PORT == 0 RCC->APB2ENR |= RCC_APB2_GPIOA; RCC->APB2ENR |= RCC_APB2_USART1; stm32_gpioPinConfig((struct stm32_gpio *)GPIOA_BASE, GPIO_USART1_TX_PIN, GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); #elif CONFIG_KDEBUG_PORT == 1 RCC->APB2ENR |= RCC_APB2_GPIOA; RCC->APB1ENR |= RCC_APB1_USART2; stm32_gpioPinConfig((struct stm32_gpio *)GPIOA_BASE, GPIO_USART2_TX_PIN, GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); #elif CONFIG_KDEBUG_PORT == 2 RCC->APB2ENR |= RCC_APB2_GPIOB; RCC->APB1ENR |= RCC_APB1_USART3; stm32_gpioPinConfig((struct stm32_gpio *)GPIOB_BASE, GPIO_USART3_TX_PIN, GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); #else #error "UART port not supported in this board" #endif /* Enable the USART by writing the UE bit */ UART_BASE->CR1 |= CR1_RUN_SET; /* Configure the desired baud rate */ UART_BASE->BRR = (uint16_t)evaluate_brr(UART_BASE, CPU_FREQ, CONFIG_KDEBUG_BAUDRATE); /* Set the Transmitter Enable bit in CR1 */ UART_BASE->CR1 |= USART_MODE_TX; }