野火科技
直播中

hehung

8年用户 659经验值
擅长:嵌入式技术
私信 关注

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

【瑞萨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进行串口连接了。
1685070750721.png

2. 配置

打开RASC,配置SCI4,复用为异步串口或者同步串口,我选择使用异步串口,需要配合中断一起使用。
1685072481567.png

配置stack:
1685077868204.png

详细配置信息:
1685077934012.png

3 代码实现

在KEIL下,如果需要实现printf打印和scanf接收,需要实现fputc和fgetc。

app_uart.c实现如下:

/*
@hehung
2023-5-22
email: 1398660197@qq.com
wechat: hehung95
reproduced and please indicate the source @hehung
*/
#include "hal_data.h"
#include "app_uart.h"


static volatile bool uart4_send_complete_flag = false;
static volatile bool uart4_recv_complete_flag = false;
static volatile uint32_t uart4_recv_char = '\0';


// Uart initialize
void Uart_Init(void)
{
	fsp_err_t err = FSP_SUCCESS;

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

// callback function for uart9
void uart4_notification(uart_callback_args_t * p_args)
{
	if (p_args->event == UART_EVENT_TX_COMPLETE)
	{
		uart4_send_complete_flag = true;
	}
	else if (p_args->event == UART_EVENT_RX_CHAR)
	{
		uart4_recv_char = p_args->data;
		uart4_recv_complete_flag = true;
	}
}

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

	(void)f;
	err = R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);
	if(FSP_SUCCESS != err) 
		__BKPT();
	/* Waiting until transmit finished */
	while(uart4_send_complete_flag == false) 
	{}
	uart4_send_complete_flag = false;

    return ch;
}

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

	while (uart4_recv_complete_flag == false)
	{}
	uart4_recv_complete_flag = false;

	return (int)uart4_recv_char;
}

app_uart.h

/*
@hehung
2023-5-22
email: 1398660197@qq.com
wechat: hehung95
reproduced and please indicate the source @hehung
*/

#ifndef __APP_UART_H
#define __APP_UART_H

#include "stdio.h"

extern void Uart_Init(void);

#endif

main.c中实现如下逻辑:

先使用printf打印一些信息

然后使用scanf读取一个整数,在打印出来。

printf ("Initialize finished!\r\n");
	printf ("This is a test\r\n");
	printf ("1+2=%d\r\n", 1+2);

	printf ("---------------------\r\n");
	int a;
	printf ("Please input a number with int type: \r\n");
	scanf ("%d", &a);
	printf ("The number you input is :%d", a);

4. 实现效果

打开串口调试工具,选择CMO口,波特率设置为115200。
1685078236950.png

更多回帖

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