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文件
在這裏插入圖片描述

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