楼主: 火oooo

在190小红板上实现Trochili平台上的RFID

[复制链接]
  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-5-5 08:36:08 | 显示全部楼层
    分享到:
    火oooo 发表于 2016-5-5 07:46
    请问飞飞,一个楼层里能写多少字?我现在编辑3楼时,无法写入。

    应该是没有问题的,你再试试看!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-5-9 20:50:59 | 显示全部楼层
    THREAD_EXAMPLE2
    比起THREAD_EXAMPLE1,THREAD_EXAMPLE2的注释就详细了许多。从注释上看,我们上一楼做的整体结构的分析是正确的。让我们再重新看下这8个结构:
    1. 包含头文件        
    2. 预编译开关
    3. 三个参数          设定栈长宽字节、优先级字节、时间片字节的长度
    4. 定义线程
    5. 定义线程栈
    6. 定义线程入口函数  线程的主要功能在这里实现
    7. 定义应用入口函数  系统调用此应用,从而对线程进行处理
    8. 定义main函数
    逐个比上个例子比较,可以看到,在第三项参数多了一倍,也就是说多了一组的线程参数,这个例子中使用了多个线程,这一点在第4项中可以看到。
    在第4项中,我们可以看到定义了3个线程,分别是led点亮线程,led熄灭线程,与led控制线程。
    接下来是第5项,分别对三个线程的入口函数进行了声明。当然这里也是这个例子演示的重点的地方。仔细看这三个线程会发现,led点亮线程和led熄灭线程的入口函数都只是一个功能,以替换上一例子的亮灯命令和灭灯命令。而led控制线程则替代了上一例子的LED线程。让我们看一看两个函数的具体差异。
    上一例中,led入口函数实现实现3个led的依次亮灭,是用延时+对应指示灯亮/灭实现的,与无系统的程序的循环一样。在本例中,led控制线程的入口函数里已经看到了对线程的操作,
            /* 激活Led设备点亮线程 */ //这里对亮灯线程进行激活,对应现象可以看到led点亮
            state = TclActivateThread(&ThreadLedOn, &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");

            /* 控制线程延时1秒 */ //这里把led控制线程延时1s,但在这个时间里led控制线程失去作用?待测试
            state = TclDelayThread(&ThreadCTRL, TCLM_SEC2TICKS(1), &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");

            /* 休眠Led设备点亮线程 */ //这里休眠了led点亮线程,从现象上看,这里不会有任何变化
            state = TclDeactivateThread(&ThreadLedOn, &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");

            /* 激活Led设备熄灭线程 */ //这里激活了led熄灭线程,从现象上看,led就熄灭了
            state = TclActivateThread(&ThreadLedOff, &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");

            /* 控制线程延时1秒 */ //这里把led控制线程延时1s,但在这个时间里led控制线程失去作用?待测试
            state = TclDelayThread(&ThreadCTRL, TCLM_SEC2TICKS(1), &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");

            /* 休眠Led设备熄灭线程 */ //这里休眠了led熄灭线程,从现象上看没有变化
            state = TclDeactivateThread(&ThreadLedOff, &error);
            TCLM_ASSERT((state == eSuccess), "");
            TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
    以上仍然是在循环体内,是led控制线程的大循环。
    而接下来的用户入口函数则对三个线程进行初始化,对三个线程的最初状态进行设置。我们可以看到,在这里只有led控制线程是被激活的,led亮灯线程和led灭灯线程是被休眠的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-5-9 20:52:31 | 显示全部楼层
    糖悦之果飞 发表于 2016-5-5 08:36
    应该是没有问题的,你再试试看!

    飞飞,确实是每个楼层有字数或是行数的限制,待我有空再测试一下。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-5-9 21:32:34 | 显示全部楼层
    本帖最后由 火oooo 于 2016-5-10 17:54 编辑

    发现一个问题:在做第四章的程序测试时,按下按键B4或B3时,指示灯状态会不再变化,是当机吗?怎么回事?
    飞鸟哥说:key如果配置两次会有问题。exti的事情,GD官方暂未给出结果。
    但是配置两次?在什么地方?我查查看……结果待续
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-6-11 17:51:52 | 显示全部楼层
    本帖最后由 火oooo 于 2016-6-21 11:21 编辑

    入ROTS确实比想象中的累……这段时间各种出差,各种忙碌,害的飞飞都在不停的催交作业了,在这里先说个对不起啊。终于趁着端午这两天在飞鸟ROTS中把OLED点亮了。
    看下效果先

    说下心得。在RTOS中实现功能跟之前祼奔时思想大不一样啊。在《原理与最佳实践》一书中的各个例程很好,单独看都非常好理解,对吧?但是,各位看官,还是请多打点printf吧,在各个进程中,你会发现虽然led的效果看起来一样,但是实现的方式各有千秋,大不一样。然后在了解了各种相同现象背后的不同之后,应该就可以真正拿来使用了吧 我还差很远的呐
    虽然可以显示了,怎么让显示的更好,方便进行后面的调试,还要再多加考虑,继续理解中。
    PS:不是printf啊,是EvbUart2WriteStr。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-6-11 18:27:00 | 显示全部楼层
    本帖最后由 火oooo 于 2016-6-11 18:28 编辑

    又对小红板进行了改造……把5V供电的磁珠去掉了,用3.3V给190芯片供电。
    开发板上如果有能对5V和3.3V供电进行选择的跳线感觉会更方便,也更能体现190宽电压的优越性。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-6-20 22:52:36 | 显示全部楼层
    加入了RC522,也是此次的主角,虽然读出了信息,但是非常不理想,先看效果


    放出代码后,再来讨论
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-14 10:15
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-6-21 10:24:47 | 显示全部楼层
    很详细的帖子,鼓掌!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-6-22 17:37:16 | 显示全部楼层
    本帖最后由 火oooo 于 2016-6-22 17:39 编辑

    上传代码:(在trochili_v0.12_preview4_20160408基础上实现,由于全部体积大,故只保留了改动的部分)
    功能描述:读取RFID卡的id,并在OLED屏上显示
    设定方案:建立RC522与OLED两个线程,以邮件+信号量的方式建立同步关系。当RC522读取到卡片信息时,将卡片信息以邮件方式发送给OLED线程;OLED检测到邮件后更新显示。
    相关文件:1. 需要添加的文件:phoenix_bsp_oled_spi.c、phoenix_bsp_oled_spi.h、RC522.h、RC522.c。
                     2. 需要修改的文件:example.h、colibri_bsp.c。
    实验说明:1. 此实验主要目的是了解TrochiliRTOS的使用,所以重点在RTOS上实现功能的移植和功能的实现方式。
                     至于功能模块的驱动是借用stm32的,细节不过于追究。
                     2. phoenix_bsp_oled_spi.c:OLED和RC522的驱动部分(此处由于赶时间没做分离。其实是偷懒:P)
                     phoenix_bsp_oled_spi.h:OLED的头文件
                     RC522.h:RC522的头文件
                     RC522.c:RC522的应用程序



    trochili_v0.12_preview4_20160408.rar

    1.01 MB, 下载次数: 0

    TrochiliRTOS的RFID&OLED

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 09:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2016-6-22 17:55:26 | 显示全部楼层
    本帖最后由 火oooo 于 2016-6-22 18:09 编辑

    代码讨论区——OLED篇
    phoenix_bsp_oled_spi.h
    1. #define OLED_CS_1                                GPIO_SetBits(GPIOB,GPIO_PIN_5)  //
    2. #define OLED_CS_0                                GPIO_ResetBits(GPIOB,GPIO_PIN_5)  //
    3. #define OLED_RST_1                                GPIO_SetBits(GPIOB,GPIO_PIN_4)        //
    4. #define OLED_RST_0                                GPIO_ResetBits(GPIOB,GPIO_PIN_4)        //
    5. #define OLED_DC_1                                GPIO_SetBits(GPIOB,GPIO_PIN_3)        //
    6. #define OLED_DC_0                                GPIO_ResetBits(GPIOB,GPIO_PIN_3)        //
    7. #define OLED_SCLK_1                                GPIO_SetBits(GPIOB,GPIO_PIN_2)  //
    8. #define OLED_SCLK_0                                GPIO_ResetBits(GPIOB,GPIO_PIN_2)  //
    9. #define OLED_SDIN_1                                GPIO_SetBits(GPIOB,GPIO_PIN_1)        //
    10. #define OLED_SDIN_0                                GPIO_ResetBits(GPIOB,GPIO_PIN_1)        //
    复制代码
    这里是花了最多的时间的地方,因为对GD32F190不了解,以为STM32的位带操作一样可用,结果吃了亐。查看规格书后发现GD的GPIO的地址映射不在起始的1M空间内,所以不能直接用位带操作,之前的位带尝试全部作罢,最后使用了宏定义的形式。当然此处跟模块底层驱动相关,与RTOS无太大关系。

    phoenix_bsp_oled_spi.c
    1. RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
    2.         /* ÅäÖÃPB1,PB2,PB3,PB4,PB5ÍÆÍìÊä³ö */
    3.         GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
    4.         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;        //ÍÆÍìÊä³ö
    5.         GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
    6.         GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
    7.         GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;        //ËÙ¶È50MHz
    8.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                                //³õʼ»¯
    复制代码
    仍然是底层驱动,写法与STM32有些许不同,请留意。

    colibri_bsp.c
    1. void EvbSetupEntry(void)
    2. {
    3.    EvbUart2Config();
    4.    EvbLedConfig();
    5. //   EvbKeyConfig();
    6.    EvbOledConfig();
    7. }
    复制代码
    这里开始是RTOS的部分。需要在这里添加OLED的初始化程序,在此例中是EvbOledConfig();,当然不要忘记添加头文件。

    example.h
    1. #define EVB_EXAMPLE     SPIOLED   
    复制代码
    按照飞鸟哥的思路,应用程序需要从这里入口,记得定义一下。

    oled.c,此实验的主角,但此处写不下了,放下一楼。
    1. <blockquote>//1. 包含头文件        
    复制代码
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 08:12 , Processed in 0.218927 second(s), 32 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.