首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LiteOS裸机驱动移植教程01 | 以LED为例说明裸机驱动移植方法

LiteOS裸机驱动移植教程01 | 以LED为例说明裸机驱动移植方法

作者头像
Mculover666
发布2020-07-16 11:30:19
1.5K0
发布2020-07-16 11:30:19
举报
文章被收录于专栏:TencentOS-tinyTencentOS-tiny

1. LiteOS裸机驱动移植系列

俗话说的好,光说不练假把式,上一个系列 LiteOS内核实战教程 中讲述了内核中任务如何管理、如何使用信号量同步多个任务的运行,如何用互斥锁保护共享资源,如何申请分配动态内存空间。

但是在嵌入式系统中,如果不能将内核有效的应用在实际场景中控制外围设备,那么一切都是纸上谈兵。

在这个系列中,本教程将会带领大家,手把手添加一些常用的外设驱动到LiteOS系统中,掌握外设驱动的移植方法。

2. 何为裸机驱动

驱动层代码,简单通俗的来说就是向上给用户提供一层可以控制设备的API,向下负责和设备打交道,直接操作硬件。

比如LED的驱动代码可以给用户提供一个初始化的 API 和打开/关闭的 API ,按键的驱动代码可以提供初始化的 API 和读取按键状态的 API,LCD的驱动代码可以提供初始化的 API 和屏幕上显示相关内容的API,传感器的驱动代码可以提供传感器初始化的API 和读取数据的 API,等等。

如果对基于HAL库的裸机驱动不熟悉,请先阅读[嵌入式基础教程]!

这里以使用 STM32CuebMX 生成的 LED 闪烁的裸机工程为例,其中 Src 目录下的gpio.c文件就相当于 LED 的驱动层文件,其中提供了 LED 的初始化代码:

LED初始化代码

有了该文件,也就是驱动层代码,我们可以直接调用MX_GPIO_Init来初始化LED。

那么,驱动层代码从哪里来呢

如果是比较简单的外设,比如LED,按键这种,只使用了GPIO,可以直接使用STM32CubeMX生成的gpio.c文件和gpio.h文件;

如果是比较复杂的外设,比如LCD的底层是使用SPI驱动的,那么除了 STM32CubeMX 生成的spi.hspi.c文件,还需要自己在此基础上手写LCD屏幕的驱动文件,具体的教程可以参考嵌入式基础教程系列。

3. 如何移植驱动到LiteOS

复制裸机驱动文件

LiteOS 工程 target 目录结构如下:

LiteOS工程目录

其中和设备驱动相关的有三个文件夹:

  • Inc:对应STM32CubeMX生成裸机工程中的Inc
  • Src: 对应STM32CubeMX生成裸机工程中的Src
  • Hardware:存放自己编写的设备驱动代码

复制文件的时候按照情况复制到对应的文件夹即可。

这里LED相关的代码文件只有gpio.hgpio.c,所以复制gpio.h到 Inc 文件夹,复制gpio.c到 Src 文件夹。

使用IoT-Studio创建的HelloWorld工程中已经提供好了这两个文件,了解这个操作即可,不用再次复制。

添加裸机驱动文件路径

因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。

project.mk文件指明了工程中所有文件的路径:

project.mk文件

在该文件中:

  • C文件路径
    • HARDWARE_SRC:对应Hardware文件夹下的Src文件夹
    • USER_SRC:对应Src文件夹
  • 头文件路径
    • HARDWARE_INC:对应Hardware文件夹下的Inc文件夹
    • USER_INC:对应Inc文件夹

如下,LED驱动的gpio.c文件夹添加到USER_SRC下(工程中默认已添加,无需重复添加):

LED驱动c文件路径

LED驱动的gpio.h文件夹添加到USER_INC下(工程中默认已添加,无需重复添加):

LED驱动头文件路径

至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,加入工程编译,就完成了驱动的移植。

4. 外设驱动文件的使用

初始化外设

在使用外设之前,首先需要初始化外设,在LiteOS中,初始化设备有两种方式:

  • 在系统启动调度之前初始化:设备在系统中随时可被任意任务使用
  • 在任务中初始化:设备一般只在该任务中被使用

举个例子:

像LED这种的驱动,一般都是任意的任务需要点亮或者关闭LED,没有专门的LED点亮任务或者关闭任务,在系统启动调度之前初始化比较好;

像光照强度传感器这种驱动,一般都是有专门的数据采集任务,专门去读取传感器数据,不需要别的线程去调用驱动读取数据,所以放在该数据采集任务中初始化就可以。

在任务中调用初始化API比较简单,那么,如何在系统启动之前调用初始化API呢

其实,答案就在 Src 文件夹下的main.c中,main函数如下:

LiteOS启动流程

可以看到,系统上电后首先调用 HardWare_Init 函数初始化硬件设备,然后初始化内核,初始化shell,最后启动LOS内核。

同样在main.c中存放着HardWare_Init函数的实现,来一探究竟:

HardWare_Init函数

怎么样?有没有惊喜?是不是和裸机工程的main函数开始部分一模一样?

我们可以将初始化函数尽情的扔到这个函数里,比如LED的初始化函数MX_GPIO_Init(),在系统上电的时候自动将LED初始化,是不是很爽。

修复gpio.c文件中的小bug

在IoT Studio默认提供的gpio.c文件的MX_GPIO_Init()函数中,没有对 LED 的引脚 PC13 进行初始化,手动添加如下的初始化代码:

添加LED引脚初始化代码

操作外设

接下来首先创建一个文件夹,用于存放本系列教程实验的代码:

新建文件夹

文件夹名称

在该文件夹中创建一个文件:

创建demo文件

编写代码:

#include <osal.h>
#include <gpio.h>

static int led_blink_entry()
{
    while (1)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        osal_task_sleep(1*1000);
    }
}

int standard_app_demo_main()
{
    osal_task_create("led_blink",led_blink_entry,NULL,0x400,NULL,2);
    return 0;
}

然后按照之前的方法,在 user_demo.mk 中将led_driver_demo.c文件添加到makefile中,加入编译:

user_demo.mk文件

最后在.sdkconfig中配置开启宏定义:

.sdkconfig文件

编译,烧录,即可看到LED开始闪烁:

LED闪烁效果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 何为裸机驱动
  • 3. 如何移植驱动到LiteOS
  • 复制裸机驱动文件
  • 添加裸机驱动文件路径
    • 4. 外设驱动文件的使用
    • 初始化外设
    • 修复gpio.c文件中的小bug
    • 操作外设
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档