[第二期 空气质量分析仪]第1周作业_BSP跑起来

发布于 2019-08-26 22:04:33
前言:


Hello 各位好友,之前一直在MCU上跑裸机,寻思着学习个RTOS,无意间参加了西安的RTT线下培训活动,陈总热情洋溢的讲述了RTT,当然我肯定是前排,现场做了几个小实验,感觉打开了新世界,在之前学习了关于内核的指示,但是吧,在实际做项目中感觉有十八般武艺使不上来,什么信号量、互斥量、邮箱等等,能给你说的头头是道,还有RTT每周发布的新鲜软件包,香喷喷,啧啧,但是怎么用?怎么在项目中用,真的无从下爪,还好看了RTT公众号,于是下决心参加这个二期训练营,(感觉又重新上学了;P)

前言END:

废话说完开始交作业:

第一周作业:BSP跑起来、整体框架设计

任务1、BSP跑起来

任务2、实现按键模块

任务3、实现报警模块

任务4、实现温湿度传感器驱动

任务5、在论坛提交作业(正在做的作业;P)

使用的硬件为:潘多拉STM32L475 + 板载AHT10 + 攀藤PMS5003ST 三合一传感器

实现任务1:BSP跑起来

其实移植BSP并不难(其实我用的潘多拉是复制粘贴过来的:lol),但是我已经默默的练习了好几个MCU,从nano到4.0.2都移植多,这里也就不给大家啰嗦怎么移植BSP了,想要看怎么移植请参考官网文档《系列BSP制作教程.md》,主要还是分享我移植过程中的心得:
NO1: 关于RTT版本的选择,其实刚开始的时候我只知道从git pull一下就觉的是最新的,经过杨老师的指导,才发现除了Nano版,git上master版本是需要经常更新的,因此给我推荐使用发布版本,所谓的发布版本就是相当于手机操作系统的《正式版本》,我使用master版本的话就是《内侧版本》:L ,于是在git上将版本切换到《正式版本》,如下图所示

NO2: 关于RTT工程文件框架,这边所说的工程文件框架,就是你工程的文件分布,RTT的文件分布为图2所示 ,

就是你直接git pull的时候的工程,在bsp内放工程的话感觉很不友好,因为你想git pull最新代码时候你会发现会有很多错误,因为你更改了本地仓库,所以产生冲突,因为我参考了潘多拉开发板的工程文件框架,如图3所示

实现任务2:实现按键模块(字数有限一下只贴图了:L )

如图所示,每个作业模块都列了个finish,主要是方便老师检查:lol ,按键代码实现如下,感觉好easy,主要是实现杨老师的功能没做花哨的。
#include "key.h"

void key_up_CallBack(void *args)
{
if(rt_pin_read(PIN_KEY_UP) == PIN_HIGH) {
rt_thread_mdelay(10);
if(rt_pin_read(PIN_KEY_UP) == PIN_HIGH) {
while(rt_pin_read(PIN_KEY_UP) == PIN_HIGH) {
led_red_on();
}
led_red_off();
}
}
}

void key_up_init(void)
{
/* 按键0引脚为输入模式 */
rt_pin_mode(PIN_KEY_UP, PIN_MODE_INPUT);
/* 绑定中断,下降沿模式,回调函数名为beep_on */
rt_pin_attach_irq(PIN_KEY_UP, PIN_IRQ_MODE_RISING, key_up_CallBack, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(PIN_KEY_UP, PIN_IRQ_ENABLE);

rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
}

void key(void)
{
key_up_init();
}

MSH_CMD_EXPORT(key, key demo);

实现任务3:实现报警模块(这个自己做的功能比较多)

报警模块这块,做的比较多,自己做了一个滞回比较器,防止在告警阀值上下限来回告警,滞回比较原理如图5所示,这个图是个温湿度滞回比较原理,因此带有上下限告警,但是本次的程序只有上限阀值告警,随手做了一个,有点粗,下面直接贴代码
eAlarm alart_judge(alert_tab_t tab)
{
switch (tab->status)
{
case _NORMAL:
if(tab ->value >= tab->alert){
tab ->status = _ALERT;
// LOG_D("value alarm\n");
}
break;
case _ALERT:
if(tab ->value <= (tab->alert - tab->relieve)){
tab ->status = _NORMAL;
// LOG_D("value normal\n");
}
break;
default:
break;
}
return tab->status;
}
然后用finish做了个测试代码,代码有点长就不贴了
MSH_CMD_EXPORT(alert_scan,example: alert_scan temp pm2_5 hcho humi);
默认的告警值为
alert[_TEMP].alert = 30; //告警阀值
alert[_TEMP].relieve = 5; //告警解除下限
alert[_HUMI].alert = 30; //
alert[_HUMI].relieve = 5; //
alert[_PM2_5].alert = 30; //
alert[_PM2_5].relieve = 5; //
alert[_HCHO].alert = 30; //
alert[_HCHO].relieve = 5; //
统一都是为 30度告警阀值,5度的滞回区域,实现效果为,如果那个数据告警,则潘多拉对应的R G B 灯闪烁,湿度没有闪烁,因为潘多拉板子只有三个LED灯。
运行效果如图6所示

因为LED灯要闪烁,因此使用了一个软件的TIMER,给闪烁提供TICK,有告警的话启动TIMER,没告警的时候关闭,根据告警情况,闪烁那个LED,
static void led_blink_CallBack(void* parameter)
{
static uint8_t led_s[4]= {RT_FALSE,RT_FALSE,RT_FALSE,RT_FALSE};
rt_base_t led_c[4] = {PIN_LED_R,PIN_LED_B,PIN_LED_G,PIN_LED_O};

for(uint8_t i = 0; i < _MAX; i++) {
if (alert
    .status == _ALERT) {
    led_s
      = ~led_s
        ;
        rt_pin_write(led_c
          , led_s
            );
            }
            }
            }
            void led_blink_init(void)
            {
            /* 初始化定时器 */
            rt_timer_init(&time_led, "time_led", /* 定时器名字是 time_led */
            led_blink_CallBack, /* 超时时回调的处理函数 */
            RT_NULL, /* 超时函数的入口参数 */
            200, /* 定时长度,以 OS Tick 为单位,即 10 个 OS Tick */
            RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */
            rt_timer_stop(&time_led);
            }

            任务4、实现温湿度传感器驱动

            因为这个驱动RTT有现成的所以我直接copy过来的,但是还是放入到自己指定的位置,因为最新的AHT10 bsp带有sensor架构,为了简单起见,我还是把sensor架构移除了,费了老大的神,而且重新定义了Kconfig以及SConscript,毕竟env也是个神器呐,这个就不贴代码和运行图了(ps:支持原创),图7,图8自己定制化env代码配置:



            END 作业完成


            1_git上发布版本.png
            图2.RTT源码工程目录.png
            图3.自己的工程目录png.png
            图4,FINISH截图.png
            图5.滞回比较原理.png
            图6.滞回FINISH功能.png
            图7,env训练营.png
            图8.env训练营2.png

            查看更多

关注者
0
被浏览
482
6 个回答
MSKY_7796
MSKY_7796 2019-08-27
这才是真正的大佬啊
Mrp_Young
Mrp_Young 2019-08-27
yangjie 发表于 2019-8-27 10:40
看到你的中断回调中有rtt延时函数,中断中不能有延时,且操作尽量时间短


好得,我以为中断里面是回调标志,原来和传统裸机是一样的,谢谢
Mrp_Young
Mrp_Young 2019-08-27
MSKY_7796 发表于 2019-8-27 10:48
这才是真正的大佬啊


RTT小白一枚:lol

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友