当前位置: 首页 > news >正文

东莞北京网站建设成都住建局官网

东莞北京网站建设,成都住建局官网,腾讯云做网站怎么样,花店网站模板rtthread 驱动使用的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成#xff0c;无需修改任何文件或者简单定义几个宏即可直接使用的驱动#xff0c;如 GPIO#xff0c;UART#xff0c;I2C#xff0c;SPI#xff0c;SDIO 和 ETH 等。 使用 RT-Thread S…rtthread 驱动使用的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成无需修改任何文件或者简单定义几个宏即可直接使用的驱动如 GPIOUARTI2CSPISDIO 和 ETH 等。 使用 RT-Thread Studio 新建完整版工程时用户不需要修改任何代码 使用hal库实现 没有对接到设备驱动框架可直接使用 HAL 库函数进行开发的驱动如 DACFSMC 等。 使用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 PORT7) //GPIO PINUSART外设 由于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_DMAUARTx 表示的是哪个串口需要使用 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 ConfigurationPC11 ------ SPI3_MISOPB3 (JTDO-TRACESWO) ------ SPI3_SCKPB5 ------ 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-InstanceETH){/* 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 ConfigurationPC1 ------ ETH_MDCPA1 ------ ETH_REF_CLKPA2 ------ ETH_MDIOPA7 ------ ETH_CRS_DVPC4 ------ ETH_RXD0PC5 ------ ETH_RXD1PG11 ------ ETH_TX_ENPG13 ------ ETH_TXD0PG14 ------ 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) {}驱动开发 I/O设备模型框架 RT-Thread 提供了一套简单的 I/O 设备模型框架如下图所示它位于硬件和应用程序之间共分成三层从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。 设备驱动层是一组驱使硬件设备工作的程序实现访问硬件设备的功能。它负责创建和注册 I/O 设备对于操作逻辑简单的设备可以不经过设备驱动框架层直接将设备注册到 I/O 设备管理器中使用序列图如下图所示主要有以下 2 点 1、设备驱动根据设备模型定义创建出具备硬件访问能力的设备实例将该设备通过rt_device_register() 接口注册到 I/O 设备管理器中。 2、应用程序通过 rt_device_find() 接口查找到设备然后使用 I/O 设备管理接口来访问硬件。 对于另一些设备如看门狗等则会将创建的设备实例先注册到对应的设备驱动框架中再由设备驱动框架向 I/O 设备管理器进行注册主要有以下几点 1、看门狗设备驱动程序根据看门狗设备模型定义创建出具备硬件访问能力的看门狗设备实例并将该看门狗设备通过 rt_hw_watchdog_register() 接口注册到看门狗设备驱动框架中。 2、看门狗设备驱动框架通过 rt_device_register() 接口将看门狗设备注册到 I/O 设备管理器中。 应用程序通过 I/O 设备管理接口来访问看门狗设备硬件。 I/O 设备模型RT-Thread 的设备模型是建立在内核对象模型基础之上的设备被认为是一类对象被纳入对象管理器的范畴。每个设备对象都是由基对象派生而来每个具体设备都可以继承其父类对象的属性并派生出其私有属性下图是设备对象的继承和派生关系示意图。 设备对象具体定义如下所示 struct rt_device {struct rt_object parent; /* 内核对象基类 */enum rt_device_class_type type; /* 设备类型 */rt_uint16_t flag; /* 设备参数 */rt_uint16_t open_flag; /* 设备打开标志 */rt_uint8_t ref_count; /* 设备被引用次数 */rt_uint8_t device_id; /* 设备 ID,0 - 255 *//* 数据收发回调函数 */rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);const struct rt_device_ops *ops; /* 设备操作方法 *//* 设备的私有数据 */void *user_data; }; typedef struct rt_device *rt_device_t; I/O 设备类型 RT_Device_Class_Char /* 字符设备 */ RT_Device_Class_Block /* 块设备 */ RT_Device_Class_NetIf /* 网络接口设备 */ RT_Device_Class_MTD /* 内存设备 */ RT_Device_Class_RTC /* RTC 设备 */ RT_Device_Class_Sound /* 声音设备 */ RT_Device_Class_Graphic /* 图形设备 */ RT_Device_Class_I2CBUS /* I2C 总线设备 */ RT_Device_Class_USBDevice /* USB device 设备 */ RT_Device_Class_USBHost /* USB host 设备 */ RT_Device_Class_SPIBUS /* SPI 总线设备 */ RT_Device_Class_SPIDevice /* SPI 设备 */ RT_Device_Class_SDIO /* SDIO 设备 */ RT_Device_Class_Miscellaneous /* 杂类设备 */ 创建和注册 I/O 设备 创建设备 驱动层负责创建设备实例并注册到 I/O 设备管理器中可以通过静态申明的方式创建设备实例也可以用下面的接口进行动态创建 //返回值为设备句柄类型 非NULL表示创建成功 rt_device_t rt_device_create(int type, //设备类型int attach_size); //用户数据大小调用该接口时系统会从动态堆内存中分配一个设备控制块大小为 struct rt_device 和 attach_size 的和设备的类型由参数 type 设定。 struct rt_device_ops {/* common device interface */rt_err_t (*init) (rt_device_t dev); //初始化设备rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); //打开设备rt_err_t (*close) (rt_device_t dev); //关闭设备rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); //读操作rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);//写操作rt_err_t (*control)(rt_device_t dev, int cmd, void *args); //控制操作 }; 设备被创建后需要实现它访问硬件的操作方法。 当此设备不再使用时通过以下函数进行销毁 #### 删除设备 c void rt_device_destroy(rt_device_t device);#### 注册设备 驱动层负责创建设备实例并注册到 I/O 设备管理器中可以通过静态申明的方式创建设备实例也可以用下面的接口进行动态创建c //返回值非ERRO表示注册成功 rt_err_t rt_device_register(rt_device_t dev, //设备句柄const char* name, //设备名称rt_uint8_t flags); //设备模式标志flags 参数支持下列参数 (可以采用或的方式支持多种参数) #define RT_DEVICE_FLAG_RDONLY 0x001 /* 只读 */ #define RT_DEVICE_FLAG_WRONLY 0x002 /* 只写 */ #define RT_DEVICE_FLAG_RDWR 0x003 /* 读写 */ #define RT_DEVICE_FLAG_REMOVABLE 0x004 /* 可移除 */ #define RT_DEVICE_FLAG_STANDALONE 0x008 /* 独立 */ #define RT_DEVICE_FLAG_SUSPENDED 0x020 /* 挂起 */ #define RT_DEVICE_FLAG_STREAM 0x040 /* 流模式 */ #define RT_DEVICE_FLAG_INT_RX 0x100 /* 中断接收 */ #define RT_DEVICE_FLAG_DMA_RX 0x200 /* DMA 接收 */ #define RT_DEVICE_FLAG_INT_TX 0x400 /* 中断发送 */ #define RT_DEVICE_FLAG_DMA_TX 0x800 /* DMA 发送 */设备流模式 RT_DEVICE_FLAG_STREAM 参数用于向串口终端输出字符串当输出的字符是 “\n” 时自动在前面补一个 “\r” 做分行。 注册成功的设备可以在 FinSH 命令行使用 list_device 命令查看系统中所有的设备信息包括设备名称、设备类型和设备被打开次数。 当设备注销后的设备将从设备管理器中移除也就不能再通过设备查找搜索到该设备。注销设备不会释放设备控制块占用的内存。注销设备的函数如下所示 注销设备 rt_err_t rt_device_unregister(rt_device_t dev); //传入设备句柄进行注销设备访问设备 查找设备 应用程序根据设备名称获取设备句柄进而可以操作设备。查找设备函数如下所示 rt_device_t rt_device_find(const char* name); 初始化设备 获得设备句柄后应用程序可使用如下函数对设备进行初始化操作 rt_err_t rt_device_init(rt_device_t dev); 控制设备 通过命令控制字应用程序也可以对设备进行控制通过如下函数完成 rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); 参数CMD的通用设备命令可取如下宏定义 #define RT_DEVICE_CTRL_RESUME 0x01 /* 恢复设备 */ #define RT_DEVICE_CTRL_SUSPEND 0x02 /* 挂起设备 */ #define RT_DEVICE_CTRL_CONFIG 0x03 /* 配置设备 */ #define RT_DEVICE_CTRL_SET_INT 0x10 /* 设置中断 */ #define RT_DEVICE_CTRL_CLR_INT 0x11 /* 清中断 */ #define RT_DEVICE_CTRL_GET_INT 0x12 /* 获取中断状态 */
http://www.pierceye.com/news/749193/

相关文章:

  • 遵义花果园网站建设wordpress关闭rss功能
  • 建设网站需要哪些人做网站的猫腻
  • 番禺网站建设效果深圳app制作开发公司排名
  • 临沂品牌网站推广做关于时尚网站的目的
  • 建设银行网站 无法访问上海网站制作开发公司
  • windows网站建设教程网络流量统计工具
  • 网站被入侵后需做的检测 1优易网络公司员工发展
  • 吉安网站建设jxthw大型网站技术方案
  • 网站开发找哪个专门帮做ppt的网站吗
  • 网站关键词词库一级做ae视频教程
  • wordpress建站教程入门云南文山地图
  • 网站管理助手+建设中seo网站提交
  • 网站推广位怎么设置重庆网站seo好不好
  • 中小企业网站建设框架网易博客导入wordpress
  • 成都高新区制作网站个人网站域名选择
  • 丽水建设部门网站代理公司注册服务
  • 微软 网站开发网站建设 招标文件
  • 建设电子商务网站需要什么设备seo公司怎么推广宣传
  • 局域网内建立网站wordpress电商爬虫批量上产品
  • 网站地址和网页地址区别建设什么网站赚钱
  • 支付网站开发费可以做无形资产哈尔滨网站制作方案定制
  • 网站建设免费视频教学电视剧怎么做短视频网站
  • 动漫网站设计方案网站服务器解决方案
  • 网站建设平台汉龙网站建设的学习方法
  • 内蒙古集宁建设厅官方网站服务器的作用和用途
  • 网站备案主体自适应网站 seo怎么做
  • 个人网站开发制作教程wordpress会员设置
  • 门户网站建设为企业带来的好处扬州网官方微博
  • 建设网站需要多大域名空间公司网站开发费用计入
  • 企业网站建设优化江门站官网