RTThread studio 驱动开发

rtthread 驱动开发的两种情况

在这里插入图片描述

rtthread studio 自动生成

由 RT Thread Studio 自动生成,无需修改任何文件或者简单定义几个宏即可直接使用的驱动,如 GPIO,UART,I2C,SPI,SDIO 和 ETH 等。
使用 RT-Thread Studio 新建完整版工程时,用户不需要修改任何代码

使用hal库实现

没有对接到设备驱动框架,可直接使用 HAL 库函数进行开发的驱动,如 DAC,FSMC 等。

使用rtthread studio自动生成的外设驱动

注:增加修改外设通过RT-Thread Setting和 board.h文件进行配置。配置完成烧写运行均可通过list_device命令进行查看外设驱动是否已经注册。

gpio外设

使用 PIN 驱动需要使用 GET_PIN 获取相应的引脚编号,获取到引脚编号后,可使用 rt_pin_write 等函数来操作引脚。 例如,stm32l475-atk-pandora 开发板的 LED 所接的引脚为 PE7,所以修改为

#define LED0_PIN    GET_PIN(E, //GPIO PORT
							 7) //GPIO PIN

USART外设

由于rtthread 默认启用了uart外设进行debug输出;默认使用 UART1 进行输出,若要修改为串口 2 (TX->PA2、RX->PA3)进行输出,则在 board.h 中定义宏 BSP_USING_UART2,并将串口 2 对应的引脚信息修改为实际所使用的引脚即可
新增串口只需要在 board.h 文件中定义相关串口的宏定义 BSP_USING_UARTx 及修改引脚信息即可,新增串口的步骤总结如下
1、新增对应串口的宏定义,如 BSP_USING_UART1、BSP_USING_UART2等。
2、修改串口 TX/RX 所使用的端口,如 “PA9”、"PA10"等。
3、基于修改控制台章节新增串口 1 的示例如下

#define BSP_USING_UART1
#define BSP_UART1_TX_PIN       "PA9"
#define BSP_UART1_RX_PIN       "PA10"

#define BSP_USING_UART2
#define BSP_UART2_TX_PIN       "PA2"
#define BSP_UART2_RX_PIN       "PA3"

如果需要使用串口 DMA 只需要在 board.h 文件中定义如下宏即可。

#define BSP_UARTx_RX_USING_DMA
#define BSP_UARTx_TX_USING_DMA

UARTx 表示的是哪个串口需要使用 DMA,使用的是 DMA 的发送还是接收功能。

I2C外设

软件I2C,在 board.h 文件中定义软件 I2C 相关的宏

#define BSP_USING_I2C1                         /* 使用 I2C1 总线 */
#define BSP_I2C1_SCL_PIN    GET_PIN(C, 1)      /* SCL -> PC1 */
#define BSP_I2C1_SDA_PIN    GET_PIN(D, 6)      /* SDA -> PD6 */

SPI外设

在 board.h 文件中定义 SPI 总线相关的宏,本例中使用 SPI3 总线,只需定义如下宏即可

#define BSP_USING_SPI3

在 stm32xxxx_hal_config.h 文件中打开对 SPI 的支持,也就是取消掉 HAL_SPI_MODULE_ENABLED 这个宏定义的注释,如下所示:

#define HAL_SPI_MODULE_ENABLED

定义了 BSP_USING_SPI3 宏之后,drv_spi.c 文件就会参与编译,该文件只是配置了 SPI 的工作方式和传输函数,具体 SPI 外设的时钟和引脚的初始化需要借助 STM32CubeMx 生成的代码。
例如 stm32l475-atk-pandora 开发板的 SPI3 外设连接了一个 LCD 屏幕,所以需要将 CubeMx 生成的 SPI3 的初始化代码(一般在 stm32_xxxx_hal_msp.c 文件中)复制到自己工程的 board.c 文件的末尾,使之参与编译

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(hspi->Instance == SPI3)
    {
        /* USER CODE BEGIN SPI3_MspInit 0 */

        /* USER CODE END SPI3_MspInit 0 */
        /* Peripheral clock enable */
        __HAL_RCC_SPI3_CLK_ENABLE();

        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        /**SPI3 GPIO Configuration
        PC11     ------> SPI3_MISO
        PB3 (JTDO-TRACESWO)     ------> SPI3_SCK
        PB5     ------> SPI3_MOSI
        */
        GPIO_InitStruct.Pin = GPIO_PIN_11;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        /* USER CODE BEGIN SPI3_MspInit 1 */

        /* USER CODE END SPI3_MspInit 1 */
    }
}

如果需要注册更多的 SPI 总线设备,只需参考 board.h 文件中 SPI 相关的宏定义并拷贝引脚初始化函数即可。

ETH外设

ETH 设备驱动的开发可总结为如下:
1、新建 RT-Thread 完整版项目
2、board.h中定义 BSP_USING_ETH 和 PHY 相关的宏
3、board.c中初始化 ETH 相关的引脚和时钟
4、stm32xxxx_hal_config.h中打开 HAL 库函数对 ETH 的支持
5、board.c 中实现自己的 PHY 复位函数
6、配置 lwIP 协议栈
定位到工程文件 board.h 中 ETH 配置说明部分,按照注释部分的说明分别定义 BSP_USING_ETH 和 PHY 相关的宏,本例中使用板载以太网 PHY 芯片为 LAN8720A, 所以 ETH 相关的宏定义如下 :

#define BSP_USING_ETH
#ifdef BSP_USING_ETH
#define PHY_USING_LAN8720A
#endif

定义了 BSP_USING_ETH 宏之后,drv_eth.c 文件就会参与编译,该文件只是配置了 ETH 的工作方式和传输函数等,具体 ETH 外设的时钟和引脚的初始化需要借助 STM32CubeMx 生成的代码。
将 STM32CubeMx 工具生成的 ETH 引脚和时钟初始化代码(一般在 stm32_xxxx_hal_msp.c 文件中)复制到自己工程的 board.c 文件的末尾,使之参与编译,如下所示:

void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(heth->Instance==ETH)
  {
  /* USER CODE BEGIN ETH_MspInit 0 */

  /* USER CODE END ETH_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_ETH_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    /**ETH GPIO Configuration
    PC1     ------> ETH_MDC
    PA1     ------> ETH_REF_CLK
    PA2     ------> ETH_MDIO
    PA7     ------> ETH_CRS_DV
    PC4     ------> ETH_RXD0
    PC5     ------> ETH_RXD1
    PG11     ------> ETH_TX_EN
    PG13     ------> ETH_TXD0
    PG14     ------> ETH_TXD1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /* USER CODE BEGIN ETH_MspInit 1 */

  /* USER CODE END ETH_MspInit 1 */
  }

}

在 stm32_xxxx_hal_config.h 文件中打开对 ETH 的支持,也就是取消掉 HAL_ETH_MODULE_ENABLED 这个宏定义的注释,如下所示:

#define HAL_ETH_MODULE_ENABLED

实现PHY复位函数:
在 drv_eth.c 文件中会调用 phy_reset 函数,该函数需要根据自己的实际情况进行实现,本例中 PHY 的复位引脚接在了 PD3 引脚,所以复位函数的实现如下所示 :

#include <rtdevice.h>
#define RESET_IO GET_PIN(D, 3)

void phy_reset(void)
{
    rt_pin_mode(RESET_IO, PIN_MODE_OUTPUT);
    rt_pin_write(RESET_IO, PIN_HIGH);
    rt_thread_mdelay(50);
    rt_pin_write(RESET_IO, PIN_LOW);
    rt_thread_mdelay(50);
    rt_pin_write(RESET_IO, PIN_HIGH);
}

配置 lwIP 协议栈
打开 RT-Thread Settings 文件,在图形化配置界面中左键单击 lwIP 图标即可打开 lwIP 协议栈的支持(组件开启,相应的图标会高亮)。

使用hal库实现外设驱动

1、使用 RT-Thread Studio 新建 RT-Thread 工程
2、使用 STM32CubeMx 配置外设和系统时钟
3、复制 stm32xxxx_hal_msp.c 函数
4、修改 stm32xxxx_hal_config.h 文件,打开相应外设支持。
5、替换 board.c 文件中时钟配置函数
6、使用外设

使用cubemx新建目标板卡工程

将 CubeMx 生成的代码 stm32l4xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译。复制完成后的结果如下图所示
在这里插入图片描述
由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32l4xx_hal_msp.c 文件中 #include “main.h” 替换为 #include “board.h”。

打开 HAL 库配置文件对应外设的支持宏

需要在 stm32l4xx_hal_config.h 文件使能相关外设模块

使用hal库在rtthread编写外设功能代码

void adc_init(void)
{
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速入门Kotlin④集合

集合概述 继承关系(List、Set和Map均继承了Collection) List List 是一个接口,用于表示列表(List)数据结构。它是一个有序的集合,允许重复元素。 listOf 创建的列表是不可变的,而 mutableListOf 创建的列表是可变的,允许对其进行添加、删除和更新操作。 fun main()…

JAVA面试八股文之Redis相关

Redis相关 Redis6.0为什么要用多线程&#xff1f;在Redis中存一个list集合怎么实现排序&#xff1f;Redis的5大基本类型的底层原理&#xff1f;缓存穿透&#xff1f;缓存击穿&#xff1f;缓存雪崩&#xff1f;redis做为缓存怎么保持和mysql数据进行同步&#xff1f;&#xff08…

老子云、AMRT3D、眸瑞科技

老子云概述 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 1、基…

比特币革命:刚刚开始

作者&#xff1a;Marius Farashi Tasooji 编译&#xff1a;秦晋 要充分理解比特币及其含义&#xff0c;首先必须理解什么是价值&#xff0c;什么是货币。以及是什么赋予资产价值&#xff1f; 这个问题看似愚蠢&#xff0c;但实际上非常有趣。我们的生活是由我们消费或出售的物品…

Redis的三种部署方案

文章目录 单机模式主从复制哨兵模式分片集群 在Redis中提供的集群方案总共有三种&#xff1a;单机模式&#xff0c;主从复制集群、哨兵模式&#xff0c;Redis分片集群 单机模式 Redis 只运行在一台服务器上&#xff0c;并且所有的数据都存储在这一台服务器的内存中。 主从复制…

ATF密钥生成和验签

ATF密钥生成和验签 根密钥生成 密钥的生成依赖openssl库&#xff0c;需要提前安装&#xff1a; sudo apt-get install openssl生成.pem格式的RSA4096私钥 openssl genrsa -out pri_key.pem 4096生成对应的DER格式公钥 openssl rsa -in pri_key.pem -pubout -out pub_key.der …

select详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 SELECT语句是用于从一个或多个表中检索数据的操作&#xff0c;它作为数据库DQL语言&#xff0c;可以通过特定条件从表中检索数据。本篇文章以kingbase为例介绍select的详细用法。 文章目录如下 1. 基本语法 2. 条件…

DSP 技术基本概念及典型系统分析

1、 基本概念与典型的DSP系统 通常 DSP&#xff08;Digital Signal Processing&#xff09;是指数字信号处理。DSP 芯片是专用的数字信号处理器&#xff08;Digital Signal Processor&#xff09;&#xff0c;它采用哈佛结数、流水线作业方式的并行处理技术&#xff0c;有专用…

三、SpringBoot3 整合 SpringMVC

本章概要 实现过程web 相关配置静态资源处理自定义拦截器(SpringMVC 配置) 3.1 实现过程 创建程序引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【算法统治世界】动态规划 个人笔记总结

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

中仕公考:2024山东事业编笔试成绩已出!

2024年山东省事业编笔试成绩查询入口于4约8日已经开放&#xff0c;考生可以登录入口查询笔试成绩。 山东16地市除菏泽以外均有县区参加此次310事业单位统考&#xff0c;成绩查询入口及进面名单等分地市分县区发布&#xff0c;考生可关注报考当地人民政府网站。笔试成绩查询后&…

鸿蒙南向开发:制作【智能儿童手表】

样例简介 本项目是基于BearPi套件开发的智能儿童手表系统&#xff0c;该系统通过与GSM模块&#xff08;型号&#xff1a;SIM808&#xff09;的通信来实现通话和定位功能。 智能儿童手表系统可以通过云和手机建立连接&#xff0c;同步时间和获取天气信息&#xff0c;通过手机下…

【SpringBoot整合系列】SpringBoot 实现大文件分片上传、断点续传及秒传

目录 功能介绍文件上传分片上传秒传断点续传 相关概念相关方法大文件上传流程前端切片处理逻辑后端处理切片的逻辑流程解析 后端代码实现功能目标1.建表SQL2.引入依赖3.实体类4.响应模板5.枚举类6.自定义异常7.工具类8.Controller层9.FileService10.LocalStorageService11.File…

Mac系统Unity团结引擎打包OpenHomeny项目配置

1、团结引擎下载&#xff1a;直接百度下载即可 2、mac版本的DevEco4.0编辑器下载&#xff1a; widthdevice-width,initial-scale1.0https://docs.openharmony.cn/pages/v4.0/zh-cn/release-notes/OpenHarmony-v4.0-release.md/#%E9%85%8D%E5%A5%97%E5%85%B3%E7%B3%BB3、打开D…

IRIS / Chronicles 基础概念备忘录

数据类型存储不同 在 IRIS 中有 几种数据类型&#xff0c;但是这几种数据类型怎么存的和常用的关系数据库不太一样。 String&#xff1a;字符串类型&#xff0c;这个类型包括有字母和数字&#xff0c;需要注意在这里有一个 Padded 的概念&#xff0c;对与 String 类型的数据&…

深度解析Elasticsearch索引数据量过大的优化与部署策略

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 分片和副本策略 1.1分片策略 1.1.1 数据量 1.1…

spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题&#xff0c;应用启动的时候阻塞卡住。 spring.cloud 版本如下 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><vers…

春秋之境28512

题目说该CMS的/single.php路径下&#xff0c;id参数存在一个SQL注入漏洞。访问看一下随便点一个图片。 发现了注入点?id 那么开始查看闭合符一个 就报错了 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for th…

【智能算法】孔雀优化算法(POA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Wang等人受到自然界孔雀社会行为启发&#xff0c;提出了孔雀优化算法&#xff08;Peafowl Optimization Algorithm&#xff0c;POA&#xff09;。 2.算法原理 2.1算法思想 POA…

uni-app调用苹果登录,并获取用户信息

效果 模块配置 dev中的配置 需要开启登录的权限&#xff0c;然后重新下载配置文件&#xff0c;发布打包基座&#xff0c;再运行程序 代码 <button click"appleLogin">苹果登录</button>function appleLogin() {uni.login({provider: apple,success: …