主要任務有以下幾點:
任務 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檔案
