2.RTT-点灯大师的修炼

发布于:2022-11-04 ⋅ 阅读:(1034) ⋅ 点赞:(0)

1.创建工程模板

        相信大家通过学习上一篇文章《1.RTT-环境搭建》现在能熟练的创建一个标准模板了,如果不会就跳回去学习一下吧~~链接:1.RTT-环境搭建_嵌入式路上的流浪的博客-CSDN博客

        建立好的工程模板编译并且下载到开发板测试是否正确

        如下图下载后开发板复位一下,串口助手有日志输出就可以进行下一步了

2.开始点灯

2.1初始化GPIO硬件外设

        按照学习单片机的经验来说在使用GPIO之前需要我们对GPIO的输出/输入模式还有输出速度模式等等一系列参数进行配置,但是在RT-Thread操作系统中PIN框架已经在制作bsp包的时候就已经配置好了,这个可以通过查看Settings来验证如下图

        所以我们就可以直接调用RT-Thread的API来对GPIO进行操作。

2.2在main.c中编写点灯代码

        以我们之前学习STM32裸机开发的经验来说我们需要在除了main.c文件里面编写代码同时也需要创建led驱动函数文件例如led.c和led.h文件,但是在RTT中由于已经默认初始化了PIN框架,我们可以省去led的驱动编写,现在只需要写led的应用子函数即可,甚至可以直接在main.c中编写控制LED,本次就是直接在main.c中对LED进行控制,然后将写好的代码添加到自动初始化中就可以啦!

战舰V3的LED原理图

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

/* defined the LED0 pin: PB5 */
#define LED0_PIN    GET_PIN(B, 5)
/* defined the LED1 pin: PE5 */
#define LED1_PIN    GET_PIN(E, 5)

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

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

        将代码写在main.c中,编译并且下载后复位开发板,两个LED灯便能每隔0.5s就改变亮灭状态。

3.分析API的用法

        代码中有几个API:GET_PINrt_pin_modert_pin_write

3.1获取引脚编号

        RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN 设备驱动程序定义,和具体的芯片相关。有3种方式可以获取引脚编号: API 接口获取、使用宏定义或者查看PIN 驱动文件。我们在代码编程中使用的是GET_PIN也就是宏定义来获取引脚编号的。首先介绍宏定义获取法,然后再补充一下另外两种获取引脚编号的方法。

3.1.1GET_PIN宏定义来获取引脚编号

 如果使用 rt-thread/bsp/stm32 目录下的 BSP 则可以使用下面的宏获取引脚编号:

GET_PIN(port, pin)

获取引脚号为 PF9 的 LED0 对应的引脚编号的示例代码如下所示:

#define LED0_PIN        GET_PIN(F,  9)

3.1.2使用API: rt_pin_get() 获取引脚编号

使用 rt_pin_get() 获取引脚编号,如下获取 PF9 的引脚编号:

pin_number = rt_pin_get("PF.9");

3.1.3查看驱动文件

        如果使用其他没有API接口的BSP(即其他没有API:rt_pin_get()接口的开发板)则需要查看 PIN 驱动代码 drv_gpio.c 文件确认引脚编号。此文件里有一个数组存放了每个 PIN 脚对应的编号信息,如下所示(注意:老版本的RTT中是用这种方法查询编号,现在更新的BSP中是没有下面的数组的,现在最新版本BSP基本上都是有API接口的,有API接口建议优先使用API接口):

static const rt_uint16_t pins[] =
{
    __STM32_PIN_DEFAULT,
    __STM32_PIN_DEFAULT,
    __STM32_PIN(2, A, 15),
    __STM32_PIN(3, B, 5),
    __STM32_PIN(4, B, 8),
    __STM32_PIN_DEFAULT,
    __STM32_PIN_DEFAULT,
    __STM32_PIN_DEFAULT,
    __STM32_PIN(8, A, 14),
    __STM32_PIN(9, B, 6),
    ... ...
}

以__STM32_PIN(2, A, 15)为例,2 为 RT-Thread 使用的引脚编号,A 为端口号,15 为引脚号,所以 PA15 对应的引脚编号为 2。

3.2rt_pin_mode设置引脚模式

引脚在使用前需要先设置好输入或者输出模式,通过如下函数完成:

void rt_pin_mode(rt_base_t pin, rt_base_t mode);

目前 RT-Thread 支持的引脚工作模式可取如所示的 5 种宏定义值之一,每种模式对应的芯片实际支持的模式需参考 PIN 设备驱动程序的具体实现:

#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         /* 开漏输出 */

使用例子:
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

3.3rt_pin_write设置引脚电平

设置引脚输出电平的函数如下所示:

void rt_pin_write(rt_base_t pin, rt_base_t value);
使用例子:
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_pin_write(LED1_PIN, PIN_LOW);

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到