野火科技
直播中

RA_kjnsc

2年用户 22经验值
擅长:嵌入式技术 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[经验]

【野火启明6M5开发板体验】SCI UART 串口打印


SCI(Serial Communications Interface),意为串行通信接口,是相对与并行通信的概念,是串行通
信技术的一种总称。包括了 UART,SPI 等串行通信技术。RA6M5 的 SCI 模块是一个有 10 个通
道的异步/同步串行接口。包含如下功能:
• UART
• 8 位时钟同步接口
• 简易 IIC(只能用作主机)
• 简易 SPI
• 智能卡接口(符合 ISO/IEC 7816-3 国际标准)
• 曼彻斯特接口
• 增强的串行接口
另外,SCI0、SCI3~SCI9 有独立的 FIFO 缓冲区。
1672321733421.jpg

野火启明板载的串口模块


在配置界面底部点击 “Stack”,加入串口 UART:

1.jpg

配置串口属性

1672305866282.jpg
1672322131381.jpg

使用 printf 函数时,需要使用到堆,默认情况下堆的大小为 0,因此我们需要修改堆的大小。可
以在 FSP 配置界面中的“BSP”属性栏的“RA Common”中通过修改“Heap size”来设置堆区大
小。


1672305920299.jpg

在 e2 stdio 使用printf的时候,需要修改 C 语言项目设置,

1672305998045.jpg
1672306042044.jpg
到此串口配置完成。

要使用printf 函数,所以我们需要添加一段代码来将 printf 输出重定向到串口
(UART4)。

  1. /* 重定向 printf 输出 */
  2. #if defined __GNUC__ && !defined __clang__
  3. int _write(int fd, char *pBuffer, int size); //防止编译警告
  4. int _write(int fd, char *pBuffer, int size)
  5. {
  6.    (void)fd;
  7.    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
  8.    while(uart_send_complete_flag == false);
  9.    uart_send_complete_flag = false;

  10.    return size;
  11. }
  12. #else
  13. int fputc(int ch, FILE *f)
  14. {
  15.    (void)f;
  16.    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
  17.    while(uart_send_complete_flag == false);
  18.    uart_send_complete_flag = false;

  19.    return ch;
  20. }
  21. #endif

hal_entry 入口函数

C 语言程序的入口函数 main 函数调用了 hal_entry 函数。我们在 hal_entry 函数里面编写我们的应
用代码。

  1. #include "hal_data.h"
  2. #include

  3. FSP_CPP_HEADER
  4. void R_BSP_WARMStart(bsp_warm_start_event_t event);
  5. FSP_CPP_FOOTER


  6. fsp_err_t err = FSP_SUCCESS;
  7. //unsigned char send_buff[100];
  8. volatile bool uart_send_complete_flag = false;

  9. /* 重定向 printf 输出 */
  10. #if defined __GNUC__ && !defined __clang__
  11. int _write(int fd, char *pBuffer, int size); //防止编译警告
  12. int _write(int fd, char *pBuffer, int size)
  13. {
  14.    (void)fd;
  15.    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
  16.    while(uart_send_complete_flag == false);
  17.    uart_send_complete_flag = false;

  18.    return size;
  19. }
  20. #else
  21. int fputc(int ch, FILE *f)
  22. {
  23.    (void)f;
  24.    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
  25.    while(uart_send_complete_flag == false);
  26.    uart_send_complete_flag = false;

  27.    return ch;
  28. }
  29. #endif

  30. void uart0_callback (uart_callback_args_t * p_args)
  31. {
  32.     if(p_args->event == UART_EVENT_TX_COMPLETE)
  33.     {
  34.         uart_send_complete_flag = true;
  35.     }
  36. }

  37. void hal_entry(void)
  38. {
  39.     /* TODO: add your own code here */


  40.     /* Open the transfer instance with initial configuration. */
  41.     err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
  42.     assert(FSP_SUCCESS == err);

  43.        while(1)
  44.        {
  45.            printf("Hello World!.n");
  46.            R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
  47.        }
  48. #if BSP_TZ_SECURE_BUILD
  49.     /* Enter non-secure code */
  50.     R_BSP_NonSecureEnter();
  51. #endif
  52. }

  53. /*******************************************************************************************************************//**
  54. * This function is called at various points during the startup process.  This implementation uses the event that is
  55. * called right before main() to set up the pins.
  56. *
  57. * @param[in]  event    Where at in the start up process the code is currently at
  58. **********************************************************************************************************************/
  59. void R_BSP_WarmStart(bsp_warm_start_event_t event)
  60. {
  61.     if (BSP_WARM_START_RESET == event)
  62.     {
  63. #if BSP_FEATURE_FLASH_LP_VERSION != 0

  64.         /* Enable reading from data flash. */
  65.         R_FACI_LP->DFLCTL = 1U;

  66.         /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
  67.          * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
  68. #endif
  69.     }

  70.     if (BSP_WARM_START_POST_C == event)
  71.     {
  72.         /* C runtime environment and system clocks are setup. */

  73.         /* Configure pins. */
  74.         R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
  75.     }
  76. }

  77. #if BSP_TZ_SECURE_BUILD

  78. BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

  79. /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
  80. BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
  81. {

  82. }
  83. #endif
输出结果
1672322800863.jpg



  • 1672305774138.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分