加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、前言
    • 二、編程講解
    • 三、項目實戰(zhàn)
    • 四、進階學習
  • 推薦器件
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

RT-Thread零基礎快速入門第3講——點亮LED燈

03/25 14:56
2626
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、前言

單片機編程,總是從點燈開始,因為單片機控制外設的本質就是控制IO口,所以,項目實戰(zhàn)的第一講,我們就從點亮LED燈開始吧。希望同學們能夠堅持到最后,從入門到精通,需要耐心和堅持,從入門到放棄,只需要一個念頭。

源碼鏈接

我發(fā)布的所有關于RT-thread的教程源代碼都在下面這個鏈接里面,隨著我教程的更新,新的代碼也會加入進去。

教程源碼下載鏈接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx

二、編程講解

第一步:新建或打開一個工程

新建工程的方法我就不說了,不知道的同學可以看下我的入門教程第二講。
RT-Thread零基礎快速入門第2講鏈接:https://blog.csdn.net/ShenZhen_zixian/article/details/105027730

第二步:配置IO口

IO口可以通過rt_pin_mode(rt_base_t pin, rt_base_t mode)函數來配置,這個函數在pin.c里面。

/* RT-Thread Hardware PIN APIs */
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
    RT_ASSERT(_hw_pin.ops != RT_NULL);
    _hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}

這個函數的第一個參數是pin,這個是io口對應的pin腳序號,RT-thread對每一個IO口都有一個編號,可以在drv_gpio.c里面看到,我這里列舉一部分給大家看一下。

#if defined(GPIOA)
    __STM32_PIN(0 ,  A, 0 ),
    __STM32_PIN(1 ,  A, 1 ),
    __STM32_PIN(2 ,  A, 2 ),
    __STM32_PIN(3 ,  A, 3 ),
    __STM32_PIN(4 ,  A, 4 ),
    __STM32_PIN(5 ,  A, 5 ),
    __STM32_PIN(6 ,  A, 6 ),
    __STM32_PIN(7 ,  A, 7 ),
    __STM32_PIN(8 ,  A, 8 ),
    __STM32_PIN(9 ,  A, 9 ),
    __STM32_PIN(10,  A, 10),
    __STM32_PIN(11,  A, 11),
    __STM32_PIN(12,  A, 12),
    __STM32_PIN(13,  A, 13),
    __STM32_PIN(14,  A, 14),
    __STM32_PIN(15,  A, 15),
#if defined(GPIOB)
    __STM32_PIN(16,  B, 0),
    __STM32_PIN(17,  B, 1),
    __STM32_PIN(18,  B, 2),
    __STM32_PIN(19,  B, 3),
    __STM32_PIN(20,  B, 4),
    __STM32_PIN(21,  B, 5),
    __STM32_PIN(22,  B, 6),
    __STM32_PIN(23,  B, 7),
    __STM32_PIN(24,  B, 8),
    __STM32_PIN(25,  B, 9),
    __STM32_PIN(26,  B, 10),
    __STM32_PIN(27,  B, 11),
    __STM32_PIN(28,  B, 12),
    __STM32_PIN(29,  B, 13),
    __STM32_PIN(30,  B, 14),
    __STM32_PIN(31,  B, 15),
#if defined(GPIOC)
    __STM32_PIN(32,  C, 0),
    __STM32_PIN(33,  C, 1),
    __STM32_PIN(34,  C, 2),
    __STM32_PIN(35,  C, 3),
    __STM32_PIN(36,  C, 4),
    __STM32_PIN(37,  C, 5),
    __STM32_PIN(38,  C, 6),
    __STM32_PIN(39,  C, 7),
    __STM32_PIN(40,  C, 8),
    __STM32_PIN(41,  C, 9),
    __STM32_PIN(42,  C, 10),
    __STM32_PIN(43,  C, 11),
    __STM32_PIN(44,  C, 12),
    __STM32_PIN(45,  C, 13),
    __STM32_PIN(46,  C, 14),
    __STM32_PIN(47,  C, 15),
#if defined(GPIOD)
    __STM32_PIN(48,  D, 0),
    __STM32_PIN(49,  D, 1),
    __STM32_PIN(50,  D, 2),
    __STM32_PIN(51,  D, 3),
    __STM32_PIN(52,  D, 4),
    __STM32_PIN(53,  D, 5),
    __STM32_PIN(54,  D, 6),
    __STM32_PIN(55,  D, 7),
    __STM32_PIN(56,  D, 8),
    __STM32_PIN(57,  D, 9),
    __STM32_PIN(58,  D, 10),
    __STM32_PIN(59,  D, 11),
    __STM32_PIN(60,  D, 12),
    __STM32_PIN(61,  D, 13),
    __STM32_PIN(62,  D, 14),
    __STM32_PIN(63,  D, 15),

第二個參數是mode,這個是io口的模式,在RT-thread里面一共有5種,在pin.h里面有定義,我把代碼復制給大家看一下。關于這幾種模式的區(qū)別我不做詳細的介紹了,不知道的同學可以網上查一下。

#define PIN_MODE_OUTPUT         0x00  //推挽輸出
#define PIN_MODE_INPUT          0x01  //浮空輸入
#define PIN_MODE_INPUT_PULLUP   0x02  //上拉輸入
#define PIN_MODE_INPUT_PULLDOWN 0x03  //下拉輸入
#define PIN_MODE_OUTPUT_OD      0x04  //開漏輸出

我們在代碼里面直接調用rt_pin_mode(rt_base_t pin, rt_base_t mode)函數即可

/* defined the LED0 pin: PF9 */
#define LED0_PIN    89
int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
}

如果不想去找IO口的序號,還有另外一種寫法

/* defined the LED0 pin: PF9 */
#define LED0_PIN    GET_PIN(F, 9)
int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
}

GET_PIN(PORTx,PIN)這個函數在drv_gpio.h里面有定義,定義如下

#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__STM32_PORT(PORTx) - (rt_base_t)GPIOA_BASE)/(0x0400UL) )) + PIN)

第三步:IO口輸出高/低電平

我們可以調用rt_pin_write(LED0_PIN, PIN_HIGH)函數配置IO口電平,這個函數在pin.c里面

void rt_pin_write(rt_base_t pin, rt_base_t value)
{
    RT_ASSERT(_hw_pin.ops != RT_NULL);
    _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value);
}

函數的第一個參數是pin,和配置IO口模式時一樣,不多說了
第二個參數是配置電平的,0為低電平,1為高電平,在pin.h有定義

#define PIN_LOW                 0x00
#define PIN_HIGH                0x01

根據自己的板子設置電平,如果IO口接的是LED正極,則輸出高電平點亮,反之則輸出低,我這里把引腳設置為低電平,代碼示例如下

/* defined the LED0 pin: PF9 */
#define LED0_PIN    GET_PIN(F, 9)
rt_pin_write(LED0_PIN, PIN_LOW);

三、項目實戰(zhàn)

按照上面的步驟,我們寫一個完整的工程,代碼如下:

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

/* defined the LED0 pin: PF9 */
#define LED0_PIN    GET_PIN(F, 9)

int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
    }
}

四、進階學習

LED燈閃爍

要實現LED燈閃爍,我們只需要用RT-thread的延時函數rt_thread_mdelay(rt_int32_t ms)就行了。這個是精準的軟件延時函數,而且在延時期間會掛起線程不占用cpu資源,這個等我后面講到線程的時候再細說吧。

/* defined the LED0 pin: PF9 */
#define LED0_PIN    GET_PIN(F, 9)

int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);//延時500ms
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);//延時500ms
    }
}

流水燈

#define LED0_PIN    GET_PIN(F, 9)
#define LED1_PIN    GET_PIN(F, 10)

int main(void)
{
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(500);//延時500ms
        
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(500);//延時500ms
    }
}

五、結束語

好了,關于LED的入門教程就講到這里,比較簡單,就不多說什么了,也不求贊了。如果需要看我寫的源碼的話可以在博文前言部分的鏈接下載。后續(xù)我會繼續(xù)更新RT-thread入門教程系列,如果感興趣的同學可以關注一下博主,謝謝!

RT-thread相關教程匯總:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
AD73311ARSZ 1 Analog Devices Inc Single-Channel, 3 V and 5 V Front-End Processor for General Purpose Applications Including Speech and Telephony

ECAD模型

下載ECAD模型
$10.72 查看
AT27C256R-70JU-306 1 Microchip Technology Inc IC OTP 256KBIT 70NS 32PLCC
暫無數據 查看
511FBA125M000BAG 1 Silicon Laboratories Inc LVDS Output Clock Oscillator,

ECAD模型

下載ECAD模型
$3.39 查看

相關推薦

電子產業(yè)圖譜