一、前言
學(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