RT-thread基础移植//依据rtt实战学习记录

主要任务有以下几点:
任务 1:BSP 跑起来
任务 2:完成报警模块
任务 3:完成按键模块
任务 4:完成温湿度传感器的驱动

和明显各个任务是层层递进的,并且有易到难,今天是第一天,由于上课的原因,我只完成了前面两个相对容易的任务。!

任务一:
个人认为这个任务主要是针对开发板的移植
在这里我介绍两种方法:
1、直接从 CubeMX 中导入该软件包
2、在官网下载rtthreadd源码。
两种方法选择一般看官网有没有自己手中板子的bsp和个人喜好,一般开发板的话官网bsp都有。
方法一:官网有专门的教程介绍相信你们和我一样,肯定一看就会啦,看的话点这里哦
方法二:点这里下载最新版rtt包,下载完后解压然后进入下面这个路径(以正点原子f429为例),用ENV工具使用scons --dist命令将所需要的文件给拷贝到 dist 后的文件夹中,这样就可以把自己板子的bsp提取出来了,如果没有配置ENV的话也可以散出不必要的bsp来实现较为精简的RTT包,配置ENV官网也有教程哦。

ok这样第一个任务就完成了。

任务二:
首先keil工程,注册自己要用的pin,没错教程也在官网,如果使用 rt-thread/bsp/stm32 目录下的 BSP 则可以使用下面的宏获取引脚编号:
GET_PIN(port, pin)
如:

/* defined the LED0 pin: PB1 */
#define LED0_PIN    GET_PIN(B, 1)
复制代码
注册完之后就可以使用IO口了,下面是我写的led警报的代码
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <led_alert.h>

/* defined the LED0 pin: PB1 */
#define LED0_PIN GET_PIN(B, 1)

/*接口可以初始化 led*/
void led_init()
{
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
}
/*接口可以点亮 led*/
void led_on()
{
  rt_pin_write(LED0_PIN, PIN_LOW);
}
/* 接口可以熄灭 led*/
void led_off()
{
  rt_pin_write(LED0_PIN, PIN_HIGH);
}
/*接口可以使 led 闪烁,200ms 闪烁周期*/
void led_blink()
{
  rt_pin_write(LED0_PIN, PIN_HIGH);
  rt_thread_mdelay(200);
  rt_pin_write(LED0_PIN, PIN_LOW);
  rt_thread_mdelay(200);
  rt_pin_write(LED0_PIN, PIN_HIGH);
  rt_thread_mdelay(200);
  rt_pin_write(LED0_PIN, PIN_LOW);
  rt_thread_mdelay(200);
}

在main函数调用发现没什么问题,这样第二个任务就可以了哦。

任务三:
昨天看到人家大佬都整完了,心里好慌啊,睡觉的时候都在想,早上赶紧来了,整到现在终于可以交作业了,还是挺开心的。任务三还是挺简单的主要是keypin口的控制;和裸机控制差不多,但是由于rtt系统带来的便利,初始化简单太多了。
我的代码是这样的:



#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include<key.h>

int key_sign = 0;
void key_init(void)
{
                rt_pin_mode(key_0, PIN_MODE_INPUT_PULLUP);
                                rt_pin_mode(key_1, PIN_MODE_INPUT_PULLUP);

}
int key_scan(void)
{
static int key_up=1;     //按键松开标志
    if(key_up&&(rt_pin_read(key_0) == 0 || rt_pin_read(key_1) == 0))
    {
        rt_thread_mdelay(10);
        key_up=0;
                if(rt_pin_read(key_0) == 0)  key_sign = 1;
                else if(rt_pin_read(key_1) == 0)  key_sign = 2;
               
                rt_kprintf("keysign %d\n",key_sign);
        }
        else
        {
         key_up = 1;
        }
        
        return key_sign;
}

注意添加.c和头文件文件夹哦,不要和我一样笨哦。
任务四:
由于我的传感器(DHT11),软件包里是有的所以配置相对简单。
主要步骤:
1、打开自己的bsp文件夹,进入env;
2、输入menuconfig进入以下目录:

3、由 menuconfig 配置保存后,使用 pkgs --update 命令将该软件包下载到本地 bsp 工程中,再使用scons --target=mdk5生成文件就可以了。

问题可能主要有:
1、配置完bsp发现不能用,这个我又按照步骤来了两遍,终于可以了,还是cubemx不会用啊,刚开始学还是要多用用。
2,配置完任务4,发现dht11老是失败,不知道咋回事,检查一遍发现也没错啊,下一遍裸机代码,发现硬件也没有问题,然后有下载了一次我配置的代,amazing!又可以了,好神奇啊,看板子的手册发现,该传感器的输出口和一个中断口连接,需要先对 中断口数据 进行一次读取操作,以释放 IIC_INT 引脚,才可以。目前不确定是不是这个原因,猜测是这个原因或者时序的问题。
3、写好的线程,不能用,主函数直接一个while(1);直接不给别的线程反应时间。这样是不可以的,而且禁止在中断中加延时。
4、关于自己写的.c文件加到工程后,再用env配置软件包更新生成之后会给我删除掉,这个问题是怎么解决的:

在你的代码文件加下修改SConscript文件
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章