bootloader中,使用串口打印

UART配置示例:

   #include "bf0_hal.h"
   #include "stdio.h"

   /* UART handler declaration */
   UART_HandleTypeDef UartHandle;

   /* menuconfig configuration */
   #ifdef CONSOLE_UART1
       #define UART_INSTANCE hwp_usart1
   #elif defined(CONSOLE_UART3)
       #define UART_INSTANCE hwp_usart3
   #elif defined(CONSOLE_UART4)
       #define UART_INSTANCE hwp_usart4   
   #else
       #error RT_CONSOL_DEVICE_NAME is not supported yet in this app.
   #endif

   #ifdef __CC_ARM                                              /*ARMCC*/
   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
   #elif defined(__ARMCC_VERSION)&&(__ARMCC_VERSION >= 6010050) /*ARMCLANG*/
   #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
   #elif __ICCARM__                                             /*IAR**/
   #error Not support yet
   #else                                                        /*GCC*/
   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
   int write(int fd, char *ptr, int len)
   {
       if (fd > 2)
           return -1;
       HAL_UART_Transmit(&UartHandle, ptr, len, 0xFFFF);
       return len;
   }
   #endif

   /**
   * @brief  Retargets the C library printf function to the USART.
   * @param  None
   * @retval None
   */
   PUTCHAR_PROTOTYPE
   {
       /* Place your implementation of fputc here */
       /* e.g, write a character to the USARTl and loop until the end of transmission */
       HAL_UART_Transmit(&UartHandle,(uint8_t *)&ch, 1, 0xFFFF);
       return ch;
   }

   /**
   * @brief Configure the UART peripheral.
   */
   void uart_config(void)
   {
       /* Step 1. select clock : 52x默认为RC48,bootloader里没有校准,需要配置为XT48M */
       HAL_HPAON_EnableXT48();
       #ifndef SOC_SF32LB52X
       HAL_RCC_HCPU_ClockSelect(RCC_CLK_MOD_HP_PERI, RCC_CLK_PERI_HXT48);
       #endif
       #ifdef SOC_SF32LB56X
       #ifdef CONSOLE_UART4
       HAL_RCC_LCPU_ClockSelect(RCC_CLK_MOD_LP_PERI, RCC_CLK_PERI_HXT48);
       #endif
       #endif

       /* Step 2. pinmux configuration. */
       #ifdef SOC_SF32LB52X
       HAL_PIN_Set(PAD_PA19, USART1_TXD, PIN_PULLUP, 1);
       HAL_PIN_Set(PAD_PA18, USART1_RXD, PIN_PULLUP, 1);
       #elif defined(SOC_SF32LB56X)
       HAL_PIN_Set(PAD_PA34, USART1_TXD, PIN_PULLUP, 1);
       HAL_PIN_Set(PAD_PA30, USART1_RXD, PIN_PULLUP, 1);
       #else
       #error PINMUX for USARTx is not set.
       #endif

       /* Step 3. UART initialization. */
       /* UART configured as follows:
           - Word Length = 8 Bits (8 data bit + o parity bit) :
               BECAREFUL : Program 7 data bits + l parity bit in pc HyperTerminal
           - Stop Bit   = One stop bit
           - Parity     = No parity
           - BaudRate   = 1000000 baud
           - Hardware flow control disabled (RTS and CTS signals) */
       UartHandle.Instance        = UART_INSTANCE;
       UartHandle.Init.BaudRate   = 1000000;
       UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
       UartHandle.Init.StopBits   = UART_STOPBITS_1;
       UartHandle.Init.Parity     = UART_PARITY_NONE;
       UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
       UartHandle.Init.Mode       = UART_MODE_TX_RX;
       UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
       if (HAL_UART_Init(&UartHandle) != HAL_OK)
           HAL_ASSERT(0);  /* Initialization Error */

   }

   /**************************main**************************************/

   #if defined(__CC_ARM) || defined(__CLANG_ARM)
       int main(void)
   #elif defined(__ICCARM__)
       int __low_level_init(void)
   #elif defined(__GNUC__)
       int entry(void)
   #endif
   {
       HAL_Delay_us(0);

       /* UART configuration */
       uart_config();
       /* 使用printf打印 */
       printf("This is test log.

");
       ... ...

说明:

  • 调用uart_config初始化UART配置后,可使用printf打印。

  • 如果打印无效,可确认以下信息:

    • 配置的是哪个串口:CONSOLE_UART1/CONSOLE_UART2/CONSOLE_UART3等。

    • 确认uart_config中的UART PIN脚配置是否正确。