根据原理图LED连接到了P106,在 FSP 配置界面里面点开 “Pins”-> “Ports”-> “P1”-> “P106”, 然后将连接到LED灯的 IO 引脚的 “Mode” 属性配置为 “Output mode (Initial Low)”, 表示该引脚默认输出低电平,其他的属性默认即可。
IO配置:
Pin Configuration 页面的 IOPORT 属性介绍:
[size=0.9]IOPORT 属性
[size=0.9]描述
[size=0.9]Mode
[size=0.9]IO引脚的工作模式,包括输入模式和输出模式,选择输出模式时可以设置引脚的初始输出电平。
[size=0.9]Pull up
[size=0.9]IO引脚是否上拉。
[size=0.9]Drive Capacity
[size=0.9]IO引脚的驱动能力设置。
[size=0.9]Output type
[size=0.9]IO引脚的输出类型。可以选 CMOS 推挽输出或开漏输出。
因此时钟配置选择内部晶振:
配置完成之后按下快捷键 “Ctrl + S” 保存,最后点右上角的 “Generate Project Content” 图标, 让软件自动生成配置代码即可。
从keil左侧“项目资源管理器”打开工程目录下的 “Flex Software/pin_data.c” 源文件, 就会看到 g_bsp_pin_cfg_data 数组中已经加入了LED引脚的配置数据。 在 IOPORT 初始化的时候,它们会被用来对引脚进行初始化配置。当没有使用 RTOS 时,C语言程序的入口函数 main 函数调用了 hal_entry 函数。 打开 “Renesas RA Smart Configurator:Common Sources/hal_entry.c” 文件,在 hal_entry 函数里面编写代码。
- void hal_entry(void)
- {
- /* TODO: add your own code here */
- R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
- while(1)
- {
- R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_LOW);
- R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
- R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_HIGH);
- R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
- }
- #if BSP_TZ_SECURE_BUILD
- /* Enter non-secure code */
- R_BSP_NonSecureEnter();
- #endif
- }
串口数据收发
瑞萨 RA6M4的串口叫做SCI(Serial Communications Interface),意为串行通信接口, 是相对与并行通信的概念,是串行通信技术的一种总称,包括了UART,SPI等串行通信技术。在 FSP 配置界面里面点开 “Pins”-> “Peripherals”-> “Connectivity:SCI”-> “SCI7” 来配置SCI模块, 配置为 “Asynchronous UART” 模式,并选择开发板所使用的串口引脚
在配置界面底部点击 “Stack”,加入串口UART:
点击刚刚加入的窗口,在左下角的“属性”窗口中配置 名字(name)、通道(Channel)、回调函数(Callback)名字即可, 引脚(Pins)、波特率(Baud Rate)等其他的属性按照默认的配置即可。
使用 printf 函数时,需要使用到堆,默认情况下堆的大小为0,因此我们需要修改堆的大小。 可以在 FSP 配置界面中的“BSP”属性栏的“RA Common”中通过修改“Heap size”来设置堆区大小。 这里需要设置为 8 的整数倍,对于RA6M4推荐至少为4K(0x1000)
FSP 配置并生成代码之后,首先需要使用 R_SCI_UART_Open 函数打开 SCI7 UART 模块。
串口中断回调函数
在前面的 FSP 配置步骤的时候,设置了串口中断回调函数的名字为: uart7_callback。 设置这么一个函数的原因是:每当串口发送或者接收完成一个字符时,都会默认触发串口的中断, 而在串口中断中会调用函数 uart7_callback,在函数里需要根据不同的中断情况进行相应的处理。
- /* 发送完成标志 */
- volatile bool uart_send_complete_flag = false;
- /* 串口中断回调 */
- void uart7_callback (uart_callback_args_t * p_args)
- {
- switch (p_args->event)
- {
- case UART_EVENT_RX_CHAR:
- {
- /* 把串口接收到的数据发送回去 */
- R_SCI_UART_Write(&g_uart7_ctrl, (uint8_t *)&(p_args->data), 1);
- break;
- }
- case UART_EVENT_TX_COMPLETE:
- {
- uart_send_complete_flag = true;
- break;
- }
- default:
- break;
- }
- }
重定向 printf 输出
- int fputc(int ch, FILE *f)
- {
- (void)f;
- R_SCI_UART_Write(&g_uart7_ctrl, (uint8_t *)&ch, 1);
- while(uart_send_complete_flag == false);
- uart_send_complete_flag = false;
- return ch;
- }
hal_entry入口函数
C语言程序的入口函数 main 函数调用了 hal_entry 函数。 在 hal_entry 函数里面编写我们的应用代码。
USB转串口模块连接到串口7:
调用 printf 输出提示信息到串口: