加入星計(jì)劃,您可以享受以下權(quán)益:

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

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

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

一、前言

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

源碼鏈接

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

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

二、編程講解

第一步:新建或打開一個(gè)工程

新建工程的方法我就不說了,不知道的同學(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ù)來配置,這個(gè)函數(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);
}

這個(gè)函數(shù)的第一個(gè)參數(shù)是pin,這個(gè)是io口對(duì)應(yīng)的pin腳序號(hào),RT-thread對(duì)每一個(gè)IO口都有一個(gè)編號(hào),可以在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),

第二個(gè)參數(shù)是mode,這個(gè)是io口的模式,在RT-thread里面一共有5種,在pin.h里面有定義,我把代碼復(fù)制給大家看一下。關(guān)于這幾種模式的區(qū)別我不做詳細(xì)的介紹了,不知道的同學(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  //開漏輸出

我們?cè)诖a里面直接調(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口的序號(hào),還有另外一種寫法

/* 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)這個(gè)函數(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口電平,這個(gè)函數(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ù)的第一個(gè)參數(shù)是pin,和配置IO口模式時(shí)一樣,不多說了
第二個(gè)參數(shù)是配置電平的,0為低電平,1為高電平,在pin.h有定義

#define PIN_LOW                 0x00
#define PIN_HIGH                0x01

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

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

三、項(xiàng)目實(shí)戰(zhàn)

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

#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);
    }
}

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

LED燈閃爍

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

/* 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);//延時(shí)500ms
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);//延時(shí)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);//延時(shí)500ms
        
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(500);//延時(shí)500ms
    }
}

五、結(jié)束語

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

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
LTC6991HS6#TRPBF 1 Linear Technology LTC6991 - TimerBlox: Resettable, Low Frequency Oscillator; Package: SOT; Pins: 6; Temperature Range: -40&deg;C to 125&deg;C
$15.23 查看
AD9361BBCZ 1 Analog Devices Inc RF Agile Transceiver

ECAD模型

下載ECAD模型
$269.47 查看
NC7S14M5X 1 onsemi TinyLogic HS Inverter with Schmitt Trigger Input, 3000-REEL

ECAD模型

下載ECAD模型
$0.28 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜