基于RASC的keil电子时钟制作(瑞萨RA)(2)----配置keil以及使用串口进行打印

概述本篇文章主要介绍了一种基于瑞萨ra系列微控制器的电子时钟制作方法,重点关注如何利用瑞萨ra smart configurator生成串口配置,以及在具体实践中如何对瑞萨ra2e1开发板进行串口打印配置。通过详细的步骤和示例,读者将能够了解如何使用ra smart configurator这一强大工具来简化串口配置过程,并将其应用于实际项目中,以实现高效的串口通信和打印功能。文章还将涉及相关的代码片段和配置参数的解释,以帮助读者深入理解和应用这些概念。最终能够轻松地在瑞萨ra平台上开发出功能完善、稳定可靠的电子时钟应用。
参考文档https://renesas.github.io/fsp/_s_t_a_r_t__d_e_v.html#rasc-mdk-iar-user-guide
硬件准备首先需要准备一个开发板,这里我准备的是芯片型号r7fa2e1a72dfl的开发板:
视频教程https://www.bilibili.com/video/bv1bf411q7cq/
video(video-8gxjlufb-1689691298911)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=273520569)(image-https://img-blog.csdnimg.cn/img_convert/a9b7827864040a79610954c99ce24439.jpeg)(title-基于rasc的keil电子时钟制作(瑞萨ra)----(2)配置keil以及使用串口进行打印)
新建工程点击file->new->fsp project
保存工程路径输入工程名称,注意不要输入中文。
芯片配置本文中使用r7fa2e1a72dfl来进行演示,ide选择keil。
工程模板选择
时钟设置开发板上没有配置外部晶振,故选择内部晶振。
hoco为内部高速晶振。
管脚配置查看原理图可以得知,串口为p109和p110。
同时通过串口进行引出。
uart配置点击stacks->new stack->driver->connectivity -> uart driver on r_sci_uart。
uart属性配置
debug配置配置调试口为swd。
printf()函数printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf(“”,);
其中式样化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出;另一部分是式样化规定字符, 以%“开端, 后跟一个或几个规定字符, 用来确定输出内容式样。 参量表是需求输出的一系列参数, 其个数务必与式样化字符串所阐明的输出参数个数一样多, 各参数之间用英文逗号”,分开, 且顺序逐一对应, 不然将会出现意想不到的错误。
注意:函数printf从右到左压栈,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的。
设置e2studio堆栈printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。
生成工程点击generate project content生成项目工程。
生成完毕之后,在对应文件夹可以打开工程。
打开软件,进行编译,可以看到有个user_uart_callback未定义,因为刚刚生成了串口的回调函数,说明生成的项目是正常的。
若需要打开ra smart configurator,可以按照下图操作。
设置ra smart configurator到keil在keil中点击tools > customize tools menu…
配置如下图所示。
● 在menu item name中新建并且输入ra smart configurator
● 在command中输入rasc.exe地址
● 在initial folder输入
$p● 在arguments中输入
--device $d --compiler armv6 configuration.xml设置完毕之后,即可在tools->ra smart configurator开启。
开启成功如下所示。
keil配置microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 c 库少,并且根本不具备某些 iso c 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启
ddbug设置这里我使用jlink进行debug,可以看到是正确识别到了设备。
同时设置为全部擦除以及复位和运行。
需要添加3个包。
查看手册可以得知对应的sram地址为0x2000 4000-0x2000-8000。
所以在keil种输入对应的ram地址,为0x2000 4000-0x2000-8000
r_sci_uart_open()函数原型
故可以用 r_sci_uart_open()函数进行配置,开启和初始化uart。
/* open the transfer instance with initial configuration. */ err = r_sci_uart_open(&g_uart9_ctrl, &g_uart9_cfg); assert(fsp_success == err);添加到主程序里面。
定义err变量。
fsp_err_t err = fsp_success;
回调函数user_uart_callback ()当数据发送的时候,可以查看uart_event_tx_complete来判断是否发送完毕。
可以检查检查 p_args 结构体中的 event 字段的值是否等于 uart_event_tx_complete。如果条件为真,那么 if 语句后面的代码块将会执行。
volatile bool uart_send_complete_flag = false;void user_uart_callback (uart_callback_args_t * p_args){ if(p_args- >event == uart_event_tx_complete) { uart_send_complete_flag = true; }}同时需要printf引入头文件。
#include
printf输出重定向到串口打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include
int fputc(int ch, file *f){ err = r_sci_uart_write(&g_uart9_ctrl, (uint8_t *)&ch, 1); if(fsp_success != err) __bkpt(); while(uart_send_complete_flag == false){} uart_send_complete_flag = false; return ch; }
主程序中添加while循环打印hello world!
while(1) { printf(hello world!n); r_bsp_softwaredelay(1000u, bsp_delay_units_milliseconds); }
rtc配置若调试时候跳入rtc初始化,说明需要rtc所需要的时钟没有开启成功。
因为我们是没有使用外部晶振的。
点击stacks->new stack->timers -> realtime clock(r_rtc)。
修改时钟源由loco变为loco,内部的低速晶振。
配置完毕重新生成代码。
完整代码#include hal_data.h#include fsp_cpp_headervoid r_bsp_warmstart(bsp_warm_start_event_t event);fsp_cpp_footerfsp_err_t err = fsp_success;volatile bool uart_send_complete_flag = false;void user_uart_callback (uart_callback_args_t * p_args){ if(p_args- >event == uart_event_tx_complete) { uart_send_complete_flag = true; }}int fputc(int ch, file *f){ err = r_sci_uart_write(&g_uart9_ctrl, (uint8_t *)&ch, 1); if(fsp_success != err) __bkpt(); while(uart_send_complete_flag == false){} uart_send_complete_flag = false; return ch; }void hal_entry(void){ /* todo: add your own code here */ /* open the transfer instance with initial configuration. */ err = r_sci_uart_open(&g_uart9_ctrl, &g_uart9_cfg); assert(fsp_success == err); while(1) { printf(hello world!n); r_bsp_softwaredelay(1000u, bsp_delay_units_milliseconds); } #if bsp_tz_secure_build /* enter non-secure code */ r_bsp_nonsecureenter();#endif}实现效果


基于被动红外 (PIR) 的运动探测器
OPPO 成立安第斯事业部负责云平台、数据中心以及基础技术
电瓶修复技术—充电与硫化是否密不可分
选云,EDA厂商上云的第一步
你会操作在嵌入式Linux下PWM功能调试?
基于RASC的keil电子时钟制作(瑞萨RA)(2)----配置keil以及使用串口进行打印
环境光传感器和接近传感器的优势介绍
LED三维封装原理及芯片优化
忆联SSD存储虚拟化SR-IOV方案荣获“华彩杯”算力应用创新大赛优胜奖
科学家研发出可穿透细胞膜的药物递送纳米材料
USB4真的要来了
工信部将组织各单位开展IMS网络网间互通联调联测
盘点九月份发布的五款手机,哪款能挑战iPhone呢?
ANDFlash10月起将展开新一波补货潮 价格有望上涨
并购成风 传感器产业有望持续高速发展
智能电力运维的应用给配电运维人员减轻了压力
晶体管的工作原理介绍
可扩展的灵活多相解决方案
基于DSP芯片TMS320F240实现异步电动机调速系统的应用方案
The Very Best Ideas In Good Hair Care You Can Use Now