1、【野火启明6M5开发板体验】野火启明6M5开箱:
https://bbs.elecfans.com/jishu_2324111_1_1.html
2、基于野火启明6M5的可调频正弦波发生器
https://bbs.elecfans.com/jishu_2324831_1_1.html
一、设计思路
本文章介绍利用瑞萨的RASC软件生成FreeRTOS操作系统,并在此系统下实现OLED的动态显示。对于OLED的设置,本人参考了“华仔STM32”的文章https://bbs.elecfans.com/jishu_2324092_1_1.html
,在这里提出感谢。
二、项目的生成
本测评利用RASC生成项目。
1、新建项目
打开RASC软件,File-New-FSP Project
2、设置项目名称和保存地址
3、设置单片机的型号和IDE
本人使用Keil编程,便选择“Keil MDK Version 5”,系统会自动指定ARM Compile 6。我以前使用的是AC5,使用AC6以后,发现其对语法的要求相对严格。
4、选择操作系统
操作系统,其内部集成了FreeRTOS和ThreadX两种,目前FreeRTOS使用较多,但是ThreadX作为微软的开源操作系统,而且是一个全家桶的形式推出,并且具有众多的安全认证,用户也很多,本人计划后续进行测评。
5、设置模版
6、完成
当出现该界面的时候,说明就可以生成一个完整的项目了。
二、项目设置
1、IO口的设置
本次测评计划使用两个任务,一个是LED闪烁的任务,一个是IIC接口的OLED显示任务,因此要分别设置两组IO。
根据查看电路的原理图,P00可以控制一个LED,故将P00设置为普通IO口,并且设置为输出模式,初始为高电平。
将P511、P512设置为IIC总线,其IO的设置界面如下所示。
2、增加外设
将P511和P512设置为IIC总线后,还需要在项目中增加外设,点击New Stack-Connectivity-I2C Master,在项目中增加了IIC模块。
同时对该模块进行设置
3、建立任务
点击New Thread便可以建立新的任务。本次测评,建立两个任务,分别为Led Thread和Display Thread。
任务建立后,对其进行设置,包括FreeRTOS的设置和任务的设置。
上图为对FreeRTOS的设置,和keil下使用FreeRTOS设置内容相同,下图对任务的设置。
RASC对任务的设置与Keil下建立任务有一点区别,就是堆栈是以字节为单位的,我在这里浪费了不少时间。在Keil中建立任务,我将堆栈设置为128甚至64都可以,在这里设置为128,就一直出错,后来仔细检查,才发现,是堆栈的单位设置不对,后来讲设置值改为512,才正常运行。
4、生成代码
完成上述设置后,点击便可以生成Keil代码。
三、LED任务的编写
void led_thread_entry(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
while(1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW);
vTaskDelay(500);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH);
vTaskDelay(500);
}
}
IO已经设置完成,直接对IO口进行高低电平设置即可。
四、显示任务的编写
本人编写了一个OLED显示的任务,要求显示一个变化的数字。OLED的驱动,参考的是华仔stm32的代码,本人主要是借助其代码编写了显示的程序。任务代码如下:
void display_thread_entry(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
static uint32_t tt=0;
oled_init();
oled_display_init();
vTaskDelay(100);
while(1)
{
tt+=1;
if(tt>120)
{
oled_display_init();
tt=0;
}
oled_display_test();
vTaskDelay(500);
}
}
oled_display_init()用来显示初始界面,而且在任务中,为防止显示出现乱码,每1分钟将基本显示界面刷新一下,利用oled_display_test()动态显示数字,两部分程序的代码如下:
void oled_display_init(void)
{
oled_clear();
OLED_ShowStr(32,0,"ELECFANS",16);
OLED_ShowStr(0,3,"DIST: mm",24);
}
void oled_display_test(void)
{
static int32_t num=0;
char str[30];
num+=1;
sprintf(str,"%d",num);
OLED_ShowStr(60,3," ",24);
OLED_ShowStr(60,3,str,24);
}
五、运行效果
从视频可以看出,LED1周期的闪烁,OLED屏上的数字也在逐渐累加,由此证明,程序运行没有问题。