本帖最后由 netlhx 于 2015-6-2 20:14 编辑
RTOS调度+LCD液晶显示模板,使用的是原子的探索者,只所以使用这个来做模板,是在为毕竟NUCLEO上的资源有限,比如FSMC就没法做。而要使用液晶,FSMC还是很有必要的。
看RTOS的资料看了一段时间,最近才勉强明白了一点,希望和大家一起讨论哈!
高手请多包容,多指导!
先看看效果图。
完整的工程可以参考github.com/netlhx/stm32f407,里面的general文件夹包含一个通用的模板,LCD文件夹里将LCD和RTOS的使用结合在一起。
后面准备将其它的模块功能添加进来,虽然以前基于NUCLEOF411做了一个模板,最近折腾原子的探索者,所以那一个就没有更新了。
几点说明:
1. 绘制文字的任务是一个守护者任务(GATEKEEPER TASK),这样输出就不会产生混乱。不过任务在输出实际内容时,每个像素点都带了各自输出的位置,所以如果不使用守护者任务来实现的话,应该也没有问题。这里之所以这样处理,是为了以后的统一处理。
2. 液晶驱动为ILI9341,分辨率为240X320.
3. 没有加注释,大部分代码都比较简单,以后再整理吧
实例一 、添加一个日历任务
框架已经搭好,使用RTOS的好处之一在于:每个任务就是一个模块,所以接下来看看如何添加一个日历模块,并在LCD上显示。
添加一个新任务,需要完成下列步骤:
1. 定义一个任务ID,用来对任务进行管理操作,如果不需要管理该任务,也可以跳过这步
2. 设定任务相关参数,如优先级、堆栈大小等
3. 创建任务
4. 编写任务函数
在freertos.c文件中,添加如下
完整的任务代码:
- <p>void StartShowCalendarTask(void const *argument)
- {
- char calendarStr[30] = "";
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct;
-
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
- RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
-
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
-
- RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
- RCC_PeriphCLKInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
-
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
-
- __HAL_RCC_RTC_ENABLE();
-
- RtcHandle.Instance = RTC;
- RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
- RtcHandle.Init.AsynchPrediv = 127;
- RtcHandle.Init.SynchPrediv = 255;
- RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
- RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
- RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
-
- HAL_RTC_Init(&RtcHandle);
-
- if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != 0x32F2)
- {
- /* Configure RTC Calendar */
- RTC_CalendarConfig();
- }
-
- for(;;)
- {
- RTC_DateTypeDef sdatestructureget;
- RTC_TimeTypeDef stimestructureget;
-
- /* Get the RTC current Time */
- HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
- /* Get the RTC current Date */
- HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
-
- /* Display time Format: hh:mm:ss */
- sprintf((char*)calendarStr,"%02d:%02d:%02d %02d-%02d-%04d",stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds,
- sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
- ShowString(10, 60, calendarStr);
-
- osDelay(100);
-
-
- }
-
- }
- </p><p> </p><p> </p><p>这是任务运行实例效果,外观与没有使用RTOS并没有区别。</p><p> </p><p><img alt="" src="https://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=344633&size=300x300&key=ef30ab9e6f6ce7f2&nocache=yes&type=fixnone" border="0" aid="attachimg_344633">
- </p>
复制代码
|
很不错的资料,E文版
实例二、加入红外解码,利用红外控制MCU
RTOS支持还是很不错的,加入RTOS之后,所有的任务都是一个独立的模块。
要控制MCU来完成一些任务,主要的方法一般是两个:串口通信、红外遥控。今天来加上红外遥控支持。
板载红外支持的协议是NEC协议,所以加上相应的读取值并解码之后,就能得到输入控制码,利用控制码来完成相应的任务即可。
先看一个逻辑分析仪抓到的信号
同上一个实例一样,使用任务来处理红外信息。同上一个实例不同的是,加入了中断控制,使用中断来处理编码信息。例程中用到了任务、信号量、队列、中断。上代码,慢慢看
FREERTOS就不错,免费、简单
在模板上添加一些任务,体验RTOS的魅力
准备折腾几个例程
官网上有的