• 正文
    • 一、前言
    • 二、編程講解
    • 三、項目實戰(zhàn)
    • 四、進階學(xué)習(xí)
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

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

2024/03/25
2483
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、前言

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

源碼鏈接

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

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

二、編程講解

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

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

第二步:配置IO口

IO口可以通過rt_pin_mode(rt_base_t pin, rt_base_t mode)函數(shù)來配置,這個函數(shù)在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);
}

這個函數(shù)的第一個參數(shù)是pin,這個是io口對應(yīng)的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),

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

#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  //開漏輸出

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

/* 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)這個函數(shù)在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口輸出高/低電平

我們可以調(diào)用rt_pin_write(LED0_PIN, PIN_HIGH)函數(shù)配置IO口電平,這個函數(shù)在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);
}

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

#define PIN_LOW                 0x00
#define PIN_HIGH                0x01

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

/* 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);
    }
}

四、進階學(xué)習(xí)

LED燈閃爍

要實現(xiàn)LED燈閃爍,我們只需要用RT-thread的延時函數(shù)rt_thread_mdelay(rt_int32_t ms)就行了。這個是精準的軟件延時函數(shù),而且在延時期間會掛起線程不占用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
    }
}

五、結(jié)束語

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

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
CMR200T32768DZFT 1 Citizen Finedevice Co Ltd Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, SMD, 2 PIN

ECAD模型

下載ECAD模型
$0.77 查看
CPC2017NTR 1 IXYS Corporation Transistor Output SSR, 2-Channel, 1500V Isolation, ROHS COMPLIANT, MINIATURE, SOIC-8
$3.87 查看
FTLF1321S1MTL 1 Finisar Corporation Transceiver, 1270nm Min, 1360nm Max, 2667Mbps(Tx), 2667Mbps(Rx), LC Connector, Through Hole Mount
$912.99 查看

相關(guān)推薦