本人初学freertos,手里只有一块STM32MP157裸板,屏幕都没有,显示都是通过串口模拟的,自己想了一个实验项目,可以用来熟悉freertos的基本内容。谢谢

目录

概述:

主要程序:

实验效果

源码


概述:

//使用百问网STM32MP157(仅使用M4内核)开发板移植FreeRTOS

//利用板载AP3216C传感器收集光和距离数据

//模拟实现手机的密码解锁功能

//模拟实现手机的实时PWM调光功能

//模拟实现手机或平板的合盖息屏(保护套息屏)功能

//模拟实现手机自动休眠锁屏功能

//硬件外设使用:key1:改变密码数字

//             key2:确定密码并切换密码位置

//             led(yellow):模拟手机屏幕

//             led(green):提示手机是否解锁成功

//             AP3216C:收集光和距离数据

//涉及相关外设功能:FreeRTOS(队列,任务状态,软件定时器)、I2C、串口、标准IO、定时器PWM

效果:双键一起按唤醒屏幕后,可进行输入密码解锁屏幕,同时黄色LED(模拟手机屏幕)随环境光亮暗变化,若有物体贴紧传感器,则会锁屏并熄灭屏幕,若唤醒屏幕后20秒未按按键,则自动休眠锁屏。

主要程序:

app_freertos.c

defaulttask:运行解锁屏幕程序

task02:模拟手机PWM自适应调光

task03 :模拟合盖息屏程序

/*app_freertos.c*/
void StartDefaultTask(void *argument)           //任务一defaultTask中运行解锁屏幕程序
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){vTaskSuspend(defaultTaskHandle);         //在屏幕未唤醒时挂起任务一,等待双键点亮屏幕osTimerStart(myTimer01Handle,20000);      //开启软件定时器(自动重装载),定时为20s,用于模拟手机自动锁屏mycodefunc();                              //调用密码输入屏幕解锁程序osDelay(1);}/* USER CODE END StartDefaultTask */
}/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)          //task02任务为模拟手机PWM自适应调光,用黄色LED模拟手机屏幕
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */ for(;;){vTaskSuspend(myTask02Handle);             //在屏幕未唤醒时挂起任务二,等待双键点亮屏幕mypwmfunc();                              //调用PWM实时自适应调光程序osDelay(1);} /* USER CODE END StartTask02 */
}/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void *argument)            //task03任务为双键唤醒屏幕程序和实时模拟合盖熄灭屏幕程序(利用距离传感器)
{/* USER CODE BEGIN StartTask03 *//* Infinite loop */for(;;){if(key_1==down&&key_2==down){           //当开发板双按键同时按下,软件消抖vTaskDelay(5);if(key_1==down&&key_2==down){vTaskResume(defaultTaskHandle);     //此时恢复defaulttask和task02,屏幕正常使用,进行正常解锁和输入密码等vTaskResume(myTask02Handle);//ledon();vTaskDelay(1000);}}mypsfunc();                       //调用模拟合盖息屏程序osDelay(1);} /* USER CODE END StartTask03 */
}/* Callback01 function */
void Callback01(void *argument)           //软件定时器回调程序(利用freertos自带软件定时器功能)
{                                         //当超过20s未使用按键重置软件定时器时间,则会调用回调函数/* USER CODE BEGIN Callback01 */ledoff();                         //绿色LED熄灭,表示已上锁,解锁需要重新输入密码vTaskSuspend(myTask02Handle);     //挂起task02,实时PWM调光功能关闭pwmoff();                         //黄色LED熄灭,表示屏幕熄灭printf("************屏幕上边界************\r\n");     //串口打印此时屏幕状态,什么都没有printf("  \n");printf("  \n");printf("  \n");printf("  \n");printf("  \r\n");printf("************屏幕下边界************\r\n");printf("已锁屏  \r\n"); vTaskSuspend(defaultTaskHandle);        //挂起defaulttask任务,暂停按键输入任务/* USER CODE END Callback01 */
}

my_key.c

defaulttask中调用的解锁屏幕程序

uint8_t code[5]={'X','X','X','X'};                              //设定四位密码,默认显示为XXXX
uint8_t temp[11]={'0','1','2','3','4','5','6','7','8','9'};     //数字密码0-9
uint8_t rightcode[]="1234";                                     //在这里设定密码,默认为1234
extern osThreadId_t defaultTaskHandle;                          //外部声明相关句柄
extern osTimerId_t myTimer01Handle;
void mycodefunc(){printf("************屏幕上边界*********\r\n");              //屏幕亮起,提示输密码printf("请输入密码,按KEY2确定.\n");printf("  \n");printf("  \n");printf("  \n");printf("  \n");printf("  \r\n");printf("************屏幕下边界*********\r\n");vTaskDelay(500);uint8_t i=0,j=0;while(i<4){                                             if(key_1==down){                                //按key1更改数字vTaskDelay(5);if(key_1==down){xTimerReset(myTimer01Handle,100);if(j==11){code[i]=temp[0];j=0;myprint();}else{code[i]=temp[j++];myprint();}      vTaskDelay(500); }} if(key_2==down){                            //按key2确认并切换到下一位vTaskDelay(5);if(key_2==down){xTimerReset(myTimer01Handle,100);i++;j=0;//myprint();vTaskDelay(500);}}}if(i==4&&strcmp(code,rightcode)!=0)     printf("密码错误!请重新输入.\r\n"),mycodefunc(); //检测密码是否正确if(i==4){                                           //密码正确,提示已解锁,绿色LED亮代表已经解锁ledon();printf("*******************************\r\n");printf("屏幕已解锁. \r\n");}
}
void myprint(){for(uint8_t i=0;code[i]!='\0';i++)   printf("%c",code[i]);printf("\r\n");
}

my_pwm.c

实时PWM调光和合盖息屏模拟程序

void mypwmfunc(){                   //PWM调光函数,黄色LED会随外部光照情况调整自身亮暗uint16_t als,ps;while(1){AP3216_Read_ALS_Data(&als);     //读光照和距离数据AP3216_Read_PS_Data(&ps);if(myQueue01Handle!=0){           //将ps数据通过队列传给task03if(xQueueSend(myQueue01Handle,&ps,1)!=pdTRUE){xQueueReset(myQueue01Handle); }} sprintf(dec,"%x",als);uint16_t ret=hexToDec(dec);         //将十六进制als数据转换为十进制pwmon();                            __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,ret); //通过改变PWM的CCR值改变占空比调节亮度if(key_1==down||key_2==down){       //若在运行过程中有按键被按下,重置软件定时器,代表此时正在使用屏幕,不锁屏xTimerReset(myTimer01Handle,100);}}
}
void mypsfunc(){                //模拟合盖息屏程序uint16_t ps=0;if(myQueue01Handle!=0){         //从队列读取task02发出的ps数据if(xQueueReceive(myQueue01Handle,&ps,1)==pdTRUE){if(ps>0x1000){              //当距离过近时熄灭屏幕vTaskDelay(50);if(ps>0x1000){ledoff();     //绿色LED熄灭,表示锁屏vTaskSuspend(myTask02Handle);   //调光程序挂起pwmoff();     //屏幕熄灭printf("************屏幕上边界*********\r\n");printf("  \n");printf("  \n");printf("  \n");printf("  \n");printf("  \r\n");printf("************屏幕下边界*********\r\n");printf("已锁屏.  \r\n");vTaskSuspend(defaultTaskHandle);xQueueReset(myQueue01Handle);}}} }
}

my_AP3216C.c

芯片驱动部分

oid AP3216_Read_PS_Data(uint16_t *pPS)           //读距离传感器数据
{taskENTER_CRITICAL();                      //特别注意此时任务应进入临界段,否则读i2c会容易卡死uint8_t ps_l = 0, ps_h = 0;ps_l = AP3216_ReadOneByte(PS_L_ADDR);ps_h = AP3216_ReadOneByte(PS_H_ADDR);if( (ps_l&0x40)==0x40){*pPS = 0;}else    {*pPS = ((ps_h&0x1F)<<8) | (ps_l&0x0F);}taskEXIT_CRITICAL();
}void AP3216_Read_ALS_Data(uint16_t *pALS)      //读光传感器数据
{ taskENTER_CRITICAL();                     //特别注意此时任务应进入临界段,否则读i2c会卡死uint8_t als_l = 0, als_h = 0;als_l = AP3216_ReadOneByte(ALS_L_ADDR);als_h = AP3216_ReadOneByte(ALS_H_ADDR);*pALS = (als_h<<8) | (als_l);taskEXIT_CRITICAL();
}

实验效果

【基于FreeRTOS模拟手机屏幕自动调光,屏幕保护,屏幕解锁功能实验演示视频】 https://www.bilibili.com/video/BV1LW4y147fE/?share_source=copy_web&vd_source=02efc9b8955e0c6589b36882af845feb

源码

https://github.com/fredning/freertos-phone-sim

STM32+FreeRTOS模拟手机PWM调光、屏幕解锁、定时休眠小项目相关推荐

  1. 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.硬件框图 七.流程图 八.程序源码 九.资料包括 摘要 随着社会在不断进 ...

  2. 苹果亮度突然变暗_iPhone 12调光策略延续三星OLED经典方式 低于25%亮度将采用PWM调光_手机新闻...

    华强北电脑网10月23日消息 众所周知,苹果iPhone 12的屏幕是采用三星的OLED屏幕,大家也都知道,关于手机屏幕的亮度可以自动调节,在强光下,手机屏幕亮度就会调高,在弱光下,亮度就会变暗,就是 ...

  3. 关于LCD,LED,OLED那些事and关于DC调光与PWM调光

    关于LCD,LED,OLED那些事and关于DC调光与PWM调光 LCD(liquid-crystal display)液晶显示器 LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许 ...

  4. android 屏幕 占空比,手机选购漫谈 篇三:LCD永不为奴,还是OLED真香?深究 “瞎眼” 的PWM调光...

    手机选购漫谈 篇三:LCD永不为奴,还是OLED真香?深究 "瞎眼" 的PWM调光 2018-10-30 15:00:00 702点赞 1681收藏 551评论 在上一篇中,咱们聊 ...

  5. 全程pwm调光_dc调光的手机有哪些

    dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...

  6. STM32单片机RGB红蓝调光植物补光系统红光蓝光PWM调色调节亮度

    实践制作DIY- GC0040-红蓝调光植物补光系统 一.功能说明: 基于STM32单片机设计-红蓝调光植物补光系统 二.功能介绍: STM32F103C系列最小系统板+12V电源+2个恒流源驱动板驱 ...

  7. 笔记本电脑屏幕PWM调光频率测试调节软件

    目录 测试平台 支持Windows 10 PWM.exe PWMHelper.exe PWMCTL 1.0.0.2.exe 不支持Windows 10 PWMCTL 1.0.0.1.exe Intel ...

  8. LED调光之 PWM调光和CCR模拟调光的区别

    PWM调光和CCR模拟调光的区别 编者:Romeo 一:什么是PWM调光 1.1 PWM调光概念 PWM (Pulse Width Modulation)调光也称为脉宽调制调光,主要是通过在一个周期内 ...

  9. PT4115使用STM32单片机引脚PWM调光

    PT4115使用STM32单片机引脚PWM调光 与上位机使用modbus与上位机使用modbus通信,能够实现0~100%亮度调节,现存问题:上电时LED灯亮一下,可能怀疑是PWM初始化太慢,直接将引 ...

最新文章

  1. 百度发布智能电视伴侣,并公布短视频计划
  2. tflearn 数据集太大无法加载进内存问题?——使用image_preloader 或者是 hdf5 dataset to deal with that issue...
  3. 破除Odoo 菜单栏提示 99+
  4. JQUERY的appendappendTo
  5. OCPC 广告算法在凤凰新媒体的实践探索
  6. 数组 边界 检查的几种实现方法
  7. hdoj-3342-Legal or Not(拓扑排序)
  8. 波士顿动力放出新视频:谁都挡不住机器狗开你的门
  9. OJ1114: 逆序(数组)(C语言)
  10. 麦肯锡在全球调研分析160个案例,给出5个行业的34个AI应用场景
  11. 【原创】关于nginx.pid丢失的解决办法
  12. 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
  13. Excel函数实战技巧精粹(二)常用函数之VLOOKUP全解
  14. CF55D: Beautiful Number
  15. 关于bp抓包挂代理127.0.0.1服务器出现“有软件正在阻止Firefox安全连接至网站”问题的解决方法
  16. 黑马程序员---java基础-Java之IO
  17. linux判断文件类型是否存在脚本,shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断...
  18. 历年阿里面试题汇总(2017年不断更新中)
  19. 67键键盘如何输出`和~符号(一百五十一)
  20. 2k2实用球员_NBA2K Online2实用平民球员推荐:上篇

热门文章

  1. python类(面向对象)
  2. 什么是服务器、工作站,它们有什么区别?
  3. 网络IO和磁盘IO延时
  4. vue中使用element-resize-detector
  5. 你真的了解main函数吗?
  6. --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--
  7. vue、react打包app
  8. sklearn中对随机森林进行调参
  9. 我的世界服务器怎么弄领地语言,《我的世界》服务器怎么设置领地 我的世界服务器领地指令大全...
  10. 2020年山东春季高考计算机人数,2020年山东高考录取人数公布