野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 893|回复: 0

【瑞萨RA MCU创意氛围赛】2. KEIL下串口重定向printf和scanf

[复制链接]
发表于 2023-5-26 14:09:23 | 显示全部楼层 |阅读模式
【瑞萨RA MCU创意氛围赛】1. PWM驱动LED以及STLINK下载配置

前言
学习C语言,最开始学习的就是printf和scanf,用于接收信息和打印信息,但是在电脑上,printf和scanf都是通过命令行窗口来执行的,单片机上如何做呢?
其实对于不同的IDE,具体做法是不一样的,本文以KEIL为例,讲述如何将串口打印和接收功能重定向到printf和scanf。
1. 串口硬件连接
如下图,可以看到USB-UART连接线路图,其中:
  • P511 --> RXD
  • P512 --> TXD
我们选择这两个引脚来作为串口引脚,就可以直接使用Type-C USB进行串口连接了。
2. 配置
打开RASC,配置SCI4,复用为异步串口或者同步串口,我选择使用异步串口,需要配合中断一起使用。
配置stack:
详细配置信息:
3 代码实现
在KEIL下,如果需要实现printf打印和scanf接收,需要实现fputc和fgetc。
app_uart.c实现如下:
  1. /*
  2. @hehung
  3. 2023-5-22
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */

  8. #include "hal_data.h"
  9. #include "app_uart.h"


  10. static volatile bool uart4_send_complete_flag = false;
  11. static volatile bool uart4_recv_complete_flag = false;
  12. static volatile uint32_t uart4_recv_char = '\0';


  13. // Uart initialize
  14. void Uart_Init(void)
  15. {
  16.         fsp_err_t err = FSP_SUCCESS;

  17.         /* Open the transfer instance with initial configuration. */
  18.     err = R_SCI_UART_Open(&g_uart4_ctrl, &g_uart4_cfg);
  19.     assert(FSP_SUCCESS == err);
  20. }

  21. // callback function for uart9
  22. void uart4_notification(uart_callback_args_t * p_args)
  23. {
  24.         if (p_args->event == UART_EVENT_TX_COMPLETE)
  25.         {
  26.                 uart4_send_complete_flag = true;
  27.         }
  28.         else if (p_args->event == UART_EVENT_RX_CHAR)
  29.         {
  30.                 uart4_recv_char = p_args->data;
  31.                 uart4_recv_complete_flag = true;
  32.         }
  33. }

  34. // fputs for printf or other print function in standard
  35. int fputc(int ch, FILE *f)
  36. {
  37.         fsp_err_t err = FSP_SUCCESS;

  38.         (void)f;
  39.         err = R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);
  40.         if(FSP_SUCCESS != err)
  41.                 __BKPT();
  42.         /* Waiting until transmit finished */
  43.         while(uart4_send_complete_flag == false)
  44.         {}
  45.         uart4_send_complete_flag = false;

  46.     return ch;
  47. }

  48. // fgets for scanf or other input function in standard
  49. int fgetc(FILE *f)
  50. {
  51.         (void)f;

  52.         while (uart4_recv_complete_flag == false)
  53.         {}
  54.         uart4_recv_complete_flag = false;

  55.         return (int)uart4_recv_char;
  56. }
复制代码

app_uart.h
  1. /*
  2. @hehung
  3. 2023-5-22
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */


  8. #ifndef __APP_UART_H
  9. #define __APP_UART_H

  10. #include "stdio.h"

  11. extern void Uart_Init(void);

  12. #endif
复制代码

main.c中实现如下逻辑:
先使用printf打印一些信息
然后使用scanf读取一个整数,在打印出来。
  1.        printf ("Initialize finished!\r\n");
  2.         printf ("This is a test\r\n");
  3.         printf ("1+2=%d\r\n", 1+2);

  4.         printf ("---------------------\r\n");
  5.         int a;
  6.         printf ("Please input a number with int type: \r\n");
  7.         scanf ("%d", &a);
  8.         printf ("The number you input is :%d", a);
复制代码

4. 实现效果
打开串口调试工具,选择CMO口,波特率设置为115200。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-20 14:39 , Processed in 0.030298 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表