![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Zephyr
文章平均质量分 74
MCU单片机方面的知识
17岁boy想当攻城狮
在时间的大钟上,只有两个字「现在」
展开
-
Zephry Uart Device详解
目录前言一、Uart Device介绍1 常用API介绍1.1 uart_configure1.2 uart_get1.3uart_tx1.4uart_tx_abort1.5uart_rx_enable1.6uart_poll_in1.7uart_poll_out1.8 uart_callback_set1.9uart_irq_callback_set(旧版)1.9.2 回调函数介绍2.0uart_irq_callback_user_...原创 2021-09-08 17:16:13 · 2611 阅读 · 11 评论 -
基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型
前言本文没有使用文件系统,以最小RTOS为例来调用Tensor Flow TFLite模型Tensor FLow TFLite的工作流程就是先训练好模型,然后转换为TFLite模型文件,最后在通过Tensor Flow Tflite加载调用相关知识什么是Tensor Flow和lite以及数据流图_17岁boy的博客-CSDN博客神经网络全连接层详解_17岁boy的博客-CSDN博客Tensor Flow V2:基于Tensor Flow Keras的摄氏度到华氏度温度转原创 2021-09-29 10:21:29 · 858 阅读 · 0 评论 -
原理图查看I2C设备地址以及使用STM32和Zephyr Driver进行IC通讯时的注意事项
如下图,是一个WM8994CODER的从设备地址,它的地址是:00110100 转化为16进制就是0x34,但这不是它的实际地址,实际地址是右移一位:00011010,0x1A。为什么需要右移一位呢?这个原因是因为I2C的通讯模式,在发送地址位时,只有前七位是有效的,最后一位是读写位,I2C的通讯时序是先发高位,在发低位,所以最低位就是读写位,也就是最后发的一个位,那么我们把最低位的0去掉不看,因为它是读写位,所以就是00011010,右移一位。在Stm32的HAL外设库中,不需要右移一位,St原创 2022-01-08 23:10:02 · 2081 阅读 · 1 评论 -
Zephyr_Bindings目录作用
概述Bindings目录在zephyr下主要是负责生成与driver tree设备树文件对应的c语言.h文件,通常我们在dts中写好设备描述信息,那么我们需要在c语言中能够用到它,Zephyr的构建工具west会解析dts里的节点,从里面取到compatible的名称,然后在dts/bindings文件夹里去遍历寻找与compatible对应的文件名,然后在里面取到类型信息生成对应的c语言.h文件。bindings目录介绍bindings目录由两大目录组成:1.设备dts的描述类型yaml描原创 2022-03-07 13:35:59 · 734 阅读 · 0 评论 -
Zephry I2C和SPI驱动器介绍和操作FM24V10闪存
前言本文涉及到的I2C与SPI通讯原理可以参考这篇文章:一文详细介绍GPIO、I2C、SPI通讯原理以及物理层原理一、I2C Drive1. 开启方法在当前工程的prj.conf文件中输入以下内容:CONFIG开头的代表包含指定Drive,格式:CONFIG_Drive名称CONFIG_I2C=y编译时Zephry会自动把I2C Drive代码一并编译进来,我们就可以在开发阶段使用I2C的功能了2. 使用方法在你代码文件中包含“drivers/i2c.h”即可#i原创 2021-08-25 16:36:09 · 3122 阅读 · 0 评论 -
ROM、RAM存储器原理详解以及DRAM、SRAM、SDRAM 、FLASH存储器的介绍
概述ROM、RAM是可读与可读可写存储器的一种框架,DRAM、SRAM、SDRAM是基于RAM框架的一种实现一、ROM1. 介绍ROM全拼是Read Only Memory(只读存储器),它是只读的,一旦出厂不能在写,在出厂之前会预设好它的数据,并且它是掉电不丢失的,又称为固定存储器,它使用一些特定材料存储数据,这里以磁盘为列简单说一下原理:磁盘里面使用一些磁材料存储数据,当对内部导体进行导通时会导致内部磁场发生变化,会让内部的磁极根据电流的方向而产生改变,发生的改变不会因为没有电流而消失,原创 2021-09-01 16:47:12 · 16800 阅读 · 13 评论 -
在Zephyr RTOS上实现一个轮询系统
近日在设计一个服务系统,使用的是RTOS,因为是实时操作系统,所以有时候需要进行切片,需要跑不同的任务,所以需要让它多线程起来,这里是我实现的一些思路,分享给大家,在实时RTOS上如何设计一款轮询系统,这里没有使用中断,使用的是Zephyr线程优先级的方式以及Zephyr Sleep时会发生线程切换的机制实现的,然后去执行其它任务。在开发时需要保证你的线程不能陷入死循环,因为Zephyr中有一个时间片,这个时间片针对主线程(main)以外无效,针对线程时如果超出这个时间片,会将你的线程挂到后面重新排队,原创 2022-01-12 14:37:34 · 767 阅读 · 0 评论 -
Zephyr调整Main栈大小
当我们在main函数里申请一个局部变量过大时会出现内存溢出的问题int main(){ char buff[1024] = {0};}这样会有问题,并且在单片机里也不建议这样做,因为局部变量就是用完就扔,最好要小,如果要大一点的变量可以放在全局区,zephyr里设置了栈的大小,可以通过修改prj.conf修改CONFIG_MAIN_STACK_SIZE=2024将这个值设置高一点就可以了,以字节为单位...原创 2021-11-09 16:17:21 · 464 阅读 · 0 评论 -
Zephyr下计算耗时
Zephyr下有两个时间特点:32位硬件时钟是一个高精度计数器,可以跟踪若干个周期时间,但这个周期不能指定单位。一个周期的持续时间取决于内核使用的电路板硬件,通常以纳秒为单位进行测量。 64位系统时钟是一个计数器,用于跟踪自内核初始化以来已经过的tick数。tick的持续时间是可配置的,通常范围从1毫秒到100毫秒,同时它也可以获取32位的 获取32位的硬件时钟函数是:uint32_t k_cycle_get_32();获取64/32位系统时钟uint64_t k_uptime_.原创 2021-12-20 15:37:25 · 650 阅读 · 0 评论 -
Zephry传感器模型介绍和bme280测试
一、Sensor模型介绍Zephry针对传感器这一类设备定义了一套统一传感器驱动接口,如果你的传感器想要在Zephry上实现自己的驱动,那么需要遵守这一套接口模型标准。因为市面上的传感器大多数所反馈的数据基本上都是差不多的,如水平X、Y轴,温度、气压等一些数据,Zephry为了统一管理实现了一套标准API与宏定义,要求开发者们根据去实现这一套标准API,在结合对应的宏定义来反馈传感器对应的值。Zephry不关心传感器底层是如何实现的,也不关心如何与传感器进行通讯,它要求开发者们实现这套标准统一A原创 2021-08-26 16:54:56 · 2238 阅读 · 2 评论 -
Zephyr驱动程序框架简介
Zephyr为驱动提供一套具体的驱动框架模型,开发者可根据这一套驱动框架模型来实现自己的驱动,这一套模型非常类似Linux内核的驱动实现,如果你对Linux内核驱动模型或有Linux内核驱动开发相关经验那么学习起来会非常轻松与简单。驱动模型框架是使用了结构化的方式描述驱动,每个驱动都有等级,等级在Zephyr内部已经规定好了,每个等级对应不同的阶段,Zephyr在启动过程中会根据等级来依次初始化这些驱动,同时在不同的阶段下某些内核服务的可用性也是不同的。一些通用类型的驱动 (常见驱动) Zephyr给出了具原创 2023-03-05 08:27:55 · 1631 阅读 · 0 评论 -
Zephry_GPIO的中断使用详解以及中断原理
1. 开发环境1.1 系统环境与硬件环境系统环境 系统 版本 UBNUTU 20.04 LTS 硬件环境 厂商 型号 核 STM32 F746G_DISCO CORTEX-M7 中断控制器 型号 说明 NVIC (Nested Vectored Interrupt Controller) 嵌套向量中断控制器 你.原创 2021-08-11 09:24:37 · 3505 阅读 · 1 评论 -
Zephyr Power Management Subsystem详细介绍
Power Management Subsystem(电源管理子系统)在Zephyr下是负责管理电源模式的系统,它制定了一套规范与模型由SOC开发者实现在这个系统上属于自己的电源模式,并且还提供了几种电源管理策略,开发者基于这些策略为SOC开发出对应的电源模式电源的管理统一由Power Management Subsystem控制,在Power Management Subsystem里定义了部分Weak函数,当发生电源操作时电源管理子系统会去调用这些函数,如果开发者没有实现那么什么都不会做,如果实现了则调原创 2022-06-04 12:44:22 · 1793 阅读 · 1 评论 -
Zephyr下使用TFLite进行语音识别
语音识别与之前的图像识别大同小异,基本步骤代码可以参考这篇:基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类_17岁boy的博客-CSDN博客语音识别与图像识别的差异就在于使用的卷积层与池化层语音识别方面不需要使用池化层,是直接通过深度卷积来做特征提取,因为图像重复部分会很多,但是语音不同,如果对语音做了卷积会导致丢失部分特征,因为卷积会提取合适部分的特征,针对图像会非常好,因为图像重复像素点或相似像素点会许多,做了卷积能提升运算效率。if(micro_原创 2021-12-20 15:37:56 · 1533 阅读 · 0 评论 -
Zephyr_overlay文件讲解
在Zephyr下针对不同的boards可能会出现定制板的情况,或你的板子使用的串口或sdram内存空间与原生板不同,所以我们需要进行修改,但是,如果去修改zephyr目录下boards里的dts文件,很明显这会破坏文件体系,并且后面如果有人要编译同类型的板子就会出现问题。同时这个板子可能只针对当前的项目,所以我们可以在当前项目的根目录下生成一个目录:boardsmkdir boards然后进入这个目录,并创建一个与MCU型号一样名字以.overlay结尾如我们的MCU是:mimxrt106原创 2021-12-16 13:51:15 · 1432 阅读 · 0 评论 -
Zephry_安装与移植到Stm32F746g_disoc
1sudo apt updatesudo apt upgrade2 CMake 3.13.1 Python 3.6 device-tree-compiler 1.4.6 3sudo apt install --no-install-recommends -y git cmake ninja-buildsudo apt install --no-install-recommends -y gperf ccache dfu-utilsudo a原创 2021-08-05 17:40:19 · 1501 阅读 · 1 评论 -
Zephry DMA驱动使用教程(内存到内存)
前言本文涉及到理论知识可以参考以下文章:SRAM/DRAM:ROM、RAM存储器原理详解以及DRAM、SRAM、SDRAM 、FLASH存储器的介绍_17岁boy的博客-CSDN博客_ram和rom的区别I2C/SPI:详细介绍GPIO、I2C、SPI通讯原理以及物理层原理_17岁boy的博客-CSDN博客_iic通信原理UART:UART工作原理详解_17岁boy的博客-CSDN博客_uart接口DMA:ROM、RAM存储器原理详解以及DRAM、SRAM、SDRAM 、FLASH存储器原创 2021-09-10 11:39:29 · 923 阅读 · 0 评论 -
Zephyr:undefined reference to `__device_dts_ord_xx‘
我最近为开发板开发了一个wm89xx编码器驱动程序,因为Zephyr对多媒体支持较少,所以我打算自己为Zephyr开发Driver,我的注册方式是drivertree,注册代码如下:#define WM89XX_CONFIG_I2C(inst) \ { \ .bus.i2c = I2C_DT_SPEC_INST_GET(inst), \ .bus_io = &wm89xx原创 2022-01-10 11:41:12 · 3934 阅读 · 1 评论 -
Zephyr:compatible ‘micro,wm89xx‘ has unknown vendor prefix ‘micro‘
当我们为自己的硬件设备开发了一套Drive,在编译时如果你的厂商没有被Zephyr支持就会在编译时出现这样的信息:Found BOARD.dts: /home/zhihao/zephyrproject/zephyr/boards/arm/stm32f746g_disco/stm32f746g_disco.dtsnode '/soc/i2c@40005c00/wm89xx@1a' compatible 'micro,wm89xx' has unknown vendor prefix 'micro'原创 2022-01-10 13:44:12 · 620 阅读 · 0 评论 -
Zephyr在编译时将二进制文件转化成c语言数组
在Zephyr下是没有文件系统的,因为Zephyr主打低功耗,如果在低功耗环境上在搭载文件系统会使得代码变得沉重与复杂化,如果我们一般想要包含一些文件的话Zephyr的Cmake提供了一组开发环境包,其中generate_inc_file_for_target就是将指定文件转化为inc文件。这个函数的作用就是将一个文件的数组转化为unsigned char数组,不过不会定义变量,只是一组数据。如xxx.jpg会转化为0x12,0x13,0x14这样的数据格式,可以在代码里直接包含接下来我们在cm原创 2021-11-04 13:00:16 · 476 阅读 · 0 评论 -
在zephyr上使用mipi-sys-t
目录Mipi-Sys-T简介在Zephry中使用它配置示例解码Mipi-Sys-T简介Mipi-Sys-T是低功耗数据传输协议,主要应用在底宽带、移动设备上用于打印LOG日志,它内部函数会将要打印的字符串经过算法进行转换并打印,它会将要打印的字符变的更短,在打印之后可以通过Mipi-Sys-T提供的printer工具进行解析比如在Zephyr中开启了Mipi-Sys-T功能作为输出log的方式,那么Zephyr在你调用Printk或者LOG_DBG的时候都会在内部原创 2022-04-27 09:38:42 · 514 阅读 · 0 评论 -
Zephyr移植到NXP MIMXRT1060_EVK-RT1061 CVL5A过程
最初我在工作时需要在NXP平台上运行AI代码,我需要一个操作系统作为基柱,这样能更好地去实现相关功能,领导选择的板子是基于NXP MCU系列的I.MXRT1060 EVK为基础的一块开发板,这块板子主频600MHZ,用来跑一些基础的AI代码还是可以的,毕竟目前只是想用于测试。最开始...原创 2021-10-14 10:57:26 · 1222 阅读 · 0 评论 -
Zephyr单元测试框架:ztest/twister的使用和介绍
简介Zephyr为开发者们提供了一套简单的测试框架:Ztest,用于测试开发者们开发的Core,Ztest提供了断言以及一些基础的测试API,类似C语言的断言功能。开发者们可以用这套框架编写Test Case,可以编写自动化脚本来测试自己的Drier或其它API接口是否能够正常工作,同时Zephyr也提供了自动化测试的脚本:twister,它是使用Python编写,用于批量或指定运行Test Cose,并且它能根据Ztest输出结果生成一些诊断信息。Ztest简介Ztest是zephyr原创 2022-04-06 19:06:00 · 3470 阅读 · 0 评论 -
基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类
首先需要保证你已经拥有了一个图像分类的模型。其次我们需要Zephyr RTOS。这些可以参考如下文章:基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型_17岁boy的博客-CSDN博客原创 2021-12-09 13:51:45 · 1554 阅读 · 0 评论 -
Zephyr NVS文件系统原理及应用
概念Zephyr NVS是建立在Flash存储器之上的一个简易文件系统,它的目的是为了解决Flash擦除的寿命,因为Flash每次覆盖写入时都需要擦除扇区区域,NVS的作用是让用户每次覆盖写入时不会去擦除块区域,有效降低Flash的擦写寿命实现原理Flash特性Flash在每次写入数据时需要将Flash按扇区(不同的Flash类型划分单位不一样)擦除,也就是将所有的存储单元置为1(0xFFFF),因为Flash的特性它只能将bit从1变为0,而不能将0变为1,所以它不能对同一块内存区域进行重原创 2022-04-24 20:00:30 · 3921 阅读 · 0 评论 -
在Zephyr上使用malloc/new
在Zephyr上如果要是堆需要配置默认堆大小,在prj.conf文件中配置CONFIG_HEAP_MEM_POOL_SIZE=2024不建议在Zephyr上使用堆,因为Zephyr本身就是一个小型的实时操作系统,专门跑在低功耗的MCU上,它的内存管理算法并不是很完美,申请几次可能会造成内存碎片,从而导致内存浪费,在micro上内存是非常重要的,所以建议大家使用内存池的方式,申请一个全局的buff,在ram里然后对这个buff进行内存分配处理。...原创 2021-11-10 15:58:17 · 932 阅读 · 0 评论