野火科技
直播中

h1654155285.8644

6年用户 234经验值
擅长:处理器/DSP
私信 关注
[经验]

【野火启明6M5开发板体验】3、FreeRTOS+OLED

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
1 新建项目.png
2、设置项目名称和保存地址
2 设置项目名称和保存地址.png
3、设置单片机的型号和IDE
3 设置单片机型号和IDE.png
本人使用Keil编程,便选择“Keil MDK Version 5”,系统会自动指定ARM Compile 6。我以前使用的是AC5,使用AC6以后,发现其对语法的要求相对严格。
4、选择操作系统
4 选择操作系统.png
操作系统,其内部集成了FreeRTOS和ThreadX两种,目前FreeRTOS使用较多,但是ThreadX作为微软的开源操作系统,而且是一个全家桶的形式推出,并且具有众多的安全认证,用户也很多,本人计划后续进行测评。
5、设置模版
5 设置模版.png
6、完成
6 生成完成.png
当出现该界面的时候,说明就可以生成一个完整的项目了。
二、项目设置
1、IO口的设置
本次测评计划使用两个任务,一个是LED闪烁的任务,一个是IIC接口的OLED显示任务,因此要分别设置两组IO。
7 设置IO端口.png
根据查看电路的原理图,P00可以控制一个LED,故将P00设置为普通IO口,并且设置为输出模式,初始为高电平。8 LED设置.png
将P511、P512设置为IIC总线,其IO的设置界面如下所示。
9 IIC的 IO设置.png
2、增加外设
将P511和P512设置为IIC总线后,还需要在项目中增加外设,点击New Stack-Connectivity-I2C Master,在项目中增加了IIC模块。
10 增加IIC外设.png

image.png
同时对该模块进行设置
image.png
3、建立任务
点击New Thread便可以建立新的任务。本次测评,建立两个任务,分别为Led Thread和Display Thread。
11 建立新的线程.png
任务建立后,对其进行设置,包括FreeRTOS的设置和任务的设置。
12 FreeRTOS基本设置.png
上图为对FreeRTOS的设置,和keil下使用FreeRTOS设置内容相同,下图对任务的设置。
13 线程设置.png
RASC对任务的设置与Keil下建立任务有一点区别,就是堆栈是以字节为单位的,我在这里浪费了不少时间。在Keil中建立任务,我将堆栈设置为128甚至64都可以,在这里设置为128,就一直出错,后来仔细检查,才发现,是堆栈的单位设置不对,后来讲设置值改为512,才正常运行。
4、生成代码
完成上述设置后,点击image.png便可以生成Keil代码。

三、LED任务的编写

void led_thread_entry(void * pvParameters)
{
	FSP_PARAMETER_NOT_USED(pvParameters);

	/* TODO: add your own code here */
	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);

	/* TODO: add your own code here */
	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屏上的数字也在逐渐累加,由此证明,程序运行没有问题。

VID20221226090831

更多回帖

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