SAM4S 使用AtmelStudio库函数时 printf 的重定向

进行工程文件重新编写时,发现printf函数不能正常输出了,各种查找,最后问题定位在初始化函数的顺序上。如下方式初始化是,printf可以正常输出:

uart0_init(DEBUG_UART_BAUDRATE);
uart1_init(OOK_UART_PARITY);

但是,一旦颠倒顺序:

uart1_init(OOK_UART_PARITY);

uart0_init(DEBUG_UART_BAUDRATE);
printf就不能正常输出了。

初始化函数为:

  1. /*
  2.  * @brief   Initialize uart0
  3.  * @param   None
  4.  * @retval  None
  5. */
  6. void uart0_init(uint32_t Baudrate)
  7. {
  8.     gpio_configure_group(PINS_UART0_PIO, PINS_UART0, PINS_UART0_FLAGS);
  9.     const usart_serial_options_t uart_serial_options =
  10.     {
  11.         .baudrate   = Baudrate,
  12.         .charlength = UART_SERIAL_CHAR_LENGTH,
  13.         .paritytype = DEBUG_UART_PARITY,
  14.         .stopbits   = UART_SERIAL_STOP_BIT
  15.     };
  16.     /* Configure console UART */
  17.     sysclk_enable_peripheral_clock(DEBUG_UART_ID);
  18.     stdio_serial_init(DEBUG_UART, &uart_serial_options);// set as printf output
  19.     uart_enable_interrupt(DEBUG_UART, US_IER_RXRDY);
  20.     uart_enable(DEBUG_UART);
  21.     NVIC_DisableIRQ(DEBUG_UART_IRQn);
  22.     NVIC_ClearPendingIRQ(DEBUG_UART_IRQn);
  23.     NVIC_SetPriority(DEBUG_UART_IRQn, 0);
  24.     NVIC_EnableIRQ(DEBUG_UART_IRQn);
  25. }

两个函数一样,只是引脚定义进行了修改。后面找相关技术人员咨询,发现问题出在

stdio_serial_init(DEBUG_UART, &uart_serial_options);

这个是标准输出初始化函数,就是重定向printf的位置,两个初始化函数中都有这句话,谁在后面就会把之前的覆盖掉,当然时谁在后面printf以谁为输出标准了。

注意:这句话是串口初始化函数,不能注释掉,只能把printf输出端口的初始化语句放最后!

打赏
原文链接:,转发请注明来源!
STM

发表评论

  • 2 Responses to “SAM4S 使用AtmelStudio库函数时 printf 的重定向”
    • dyhfaily

      你好这个库函数哪里找到的 用的asf吗? 可否留个联系方式

      回复
      • 是ASF里面的,我的邮箱 maydolly@163.com 有问题可以交流一下。

        美多多 回复私信