【瑞萨RA MCU创意氛围赛】1. PWM驱动LED以及STLINK下载配置
学习C语言,最开始学习的就是printf和scanf,用于接收信息和打印信息,但是在电脑上,printf和scanf都是通过命令行窗口来执行的,单片机上如何做呢?
其实对于不同的IDE,具体做法是不一样的,本文以KEIL为例,讲述如何将串口打印和接收功能重定向到printf和scanf。
如下图,可以看到USB-UART连接线路图,其中:
我们选择这两个引脚来作为串口引脚,就可以直接使用Type-C USB进行串口连接了。
打开RASC,配置SCI4,复用为异步串口或者同步串口,我选择使用异步串口,需要配合中断一起使用。
配置stack:
详细配置信息:
在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);
打开串口调试工具,选择CMO口,波特率设置为115200。
更多回帖