S32K1xx SDK(版本:S32_SDK_S32K1xx_RTM_4.0.3 )详细介绍

前言

在学习一款MCU之前,一般我的习惯是先下载官方提供的SDK包进行学习。然后学习了解SDK提供的资源、框架、以及各目录结构文件作用等,下面边学边做笔记记录。

S32K1系列SDK我们可以到下面的NXP官网去获取:

https://www.nxp.com.cn/design/software/development-software/s32-sdk/s32-software-development-kit-for-s32k1:S32SDK-ARMK1

1. S32K1系列SDK概述

下面是引用自NXP官网对S32K1xx SDK的介绍:

S32K1的S32软件开发工具包(SDK)提供了性价比高且使用便捷的完整解决方案,可与S32K1整个系列微控制器的连接、电机控制和安全库堆栈相匹配。S32K1系列的S32SDK非常适合汽车领域的所有应用。

特征

  • 包含在S32 Design Studio中
  • Processor Expert图形配置
  • 集成的恩智浦软件:电机控制库(AMMCLib)、结构核心自检(sCST)、SBC中间件
  • 支持5类编译器:GCC、GreenHills、Arm编译器、IAR和WindRiver DIAB
  • 带有操作系统接口层的FreeRTOS或裸机
  • 符合MISRA C 2012的量产级驱动程序
  • 以太网(TCP/IP+LWIP+WOLFSSL)
  • LIN堆栈

2. S32K1xx SDK软件架构

下图是 S32K1xx SDK 的软件架构:

在这里插入图片描述

从这幅图片我们可以了解到,S32K1xx SDK编程有分层的思想,包含有:

底层

  • 各系列MCU芯片支持
  • Low-level Drivers,底层驱动程序。包括PD(Peripheral Driver,外设驱动层)驱动和PAL(Peripheral Abstract Layer,外设抽象层)驱动
  • 各个编译器平台的Start-up(启动文件)、Linker files 支持

实时操作系统层

  • SDK提供移植好的 FreeRTOS
  • 还有OSIF(操作系统接口层),OSIF层提供了统一的操作系统API接口,是基于 FreeRTOS 或者裸机代码封装而来(如果不使用FreeRTOS,那么OSIF层,就是裸机接口实现的)。

中间件(Middleware)

  • 在 Low-level Drivers 上面,就是中间件层。主要包含有:
  • 一些静态库。如AMMCLib(电机驱动库)、Touch sensing(触摸感应库)、安全相关的库(SCST、SPTLib),这类库是不开源的,只提供编译好的 .a 文件。
  • 移植好的通信协议栈。如 TCP/IP、LIN、USB和文件系统等。
  • SCB(System Basis Chip)驱动程序。这部分就是NXP移植好了的一些外围芯片的驱动程序。

应用层

  • 一些demo应用程序
  • 驱动程序的示例程序(包括PD和PAL驱动)
  • 辅助工具。如Processor Expert UI config file(处理器专家配置文件),根据图形化配置界面生成初始化代码。

3. S32K1xx SDK各目录结构

从官网下载了 S32K1xx SDK 后安装到本地目录,SDK的根目录包含的内容如下:

在这里插入图片描述

下面对各个子目录结构简单介绍。

3.1 doc

该目录存放的就算各系列芯片SDK的帮助文档,如快速入门指南、各系列芯片的html格式的帮助文档等等。比如打开S32K144的html帮助文档,如下:

在这里插入图片描述

可以看到对SDK的各个组件还要Example,还有代码的变量、结构体定义都有介绍。

我们对SDK哪部分内容不了解,首先可以在这里找找有没有对应的介绍。

3.2 examples

该目录存放的是各系列芯片的示例程序,包括demo应用的综合示例程序,以及外设驱动代码的使用示例程序。以 S32K144 为例:

在这里插入图片描述

3.3 lib

该目录存放的是前面介绍的,编译好的中间件文件。比如电机驱动库、SCST安全库。还有触摸驱动库、NFC等这些 lib 也是不开源的,而且在这个目录还找不到,看网上的介绍说是需要找 NXP 的 FAE 才能拿到。

在这里插入图片描述

3.4 middleware

该目录存放的就是中间件的一些代码。比如lin总线协议栈、tcp/ip协议栈、sbc驱动代码。

在这里插入图片描述

3.5 platform

该目录是最重要的一个目录,是存放平台相关代码的目录。其中包含有devices、drivers、pal三个子目录。如下:

在这里插入图片描述

这个目录非常重要,下面对各子目录详细介绍。

3.5.1 platform/devices目录

devices目录包含各个MCU系列的设备头文件(如S32K144.h)、链接文件、启动文件、内核文件、还要一些公共的类型声明、断言的定义等等。

下面是该目录的截图:

在这里插入图片描述

下面对该目录的部分文件介绍:

1)common子目录

该目录 s32_core_cm4.h/s32_core_cm0.h 主要是 cm0/4 内核定义相关的操作。比如全局中断的开启和关闭、进入低功耗、获取内核ID等相关的宏定义,这些定义都是使用汇编指令操作的。

2)S32K1xx 各系列型号的子目录

这些目录主要是各系列的 S32K1xx.h ,属性头文件、各个编译器平台的启动文件和链接文件、xxx.svd 仿真文件等等。

比如以 S32K144 子目录为例:

  • S32K144.h 这个文件是对应芯片型号的寄存器结构体定义、寄存器位域的宏定义、各个外设中断号的定义、一些公共操作的宏定义等等。

  • S32K144_features.h 这个文件定义的是对应芯片型号外设的属性,特点全是 FEATURE_xxxxxx 这样的宏定义。另外还定义了芯片勘误表的信息,以 ERRATA 开头。部分勘误表的宏定义如下:

    /* @brief ARM Errata 838869: Store immediate overlapping exception return operation might vector to* incorrect interrupt. */
    #define ERRATA_E9005/* @brief ARM Errata 709718: VDIV or VSQRT instructions might not complete correctly when very* short ISRs are used. */
    #define ERRATA_E6940/* @brief E10655: When using LPSPI in master mode and the SR[MBF] bit is read as a one, then, the* flag is set. If it is read as a zero, it must be read second time and this second read will be* the correct state of the bit. */
    #define ERRATA_E10655
    

    ERRATA_E9005 这个E9005就是勘误表的编号,上面有注释说明该勘误编号修正了什么内容。如果在这个头文件定义了这个勘误码,那么会使能对应勘误码的错误修正代码。

3)startup子目录

很明显就是包含各个编译器平台的汇编启动文件,还有一个system_S32K144.c/h文件,下面主要介绍下 system 文件,汇编的启动文件到时研究启动过程时再学习记录。

system_S32K144.c 文件是ARM公司规定的 Cortex M 系列MCU的软件接口标准(CMSIS)规定的系统和时钟初始化API函数。主要有3个函数:

  • SystemInit :系统的初始化函数。该函数主要作用是使能 FPU、关闭 WatchDog、使能 I-Cache (CPU内部指令高速缓存)。
  • SystemCoreClockUpdate :系统内核时钟更新函数,不过在 SDK 中并没有调用这个函数。但是用户可以调用这个函数对MCU时钟进行初始化,当然 PD 层外设驱动代码也有系统时钟的初始化函数。
  • SystemSoftwareReset :MCU的软件复位函数,操作的是内核 SCB 寄存器实现的MCU软件复位。

4)devices子目录的其他文件

  • startup.c/h :里面实现了一个 init_data_bss() 函数,下面列出 __ARM_CC 编译器的部分代码:

    /* Copy initialized data from ROM to RAM */
    while (data_rom_end != data_rom)
    {*data_ram = *data_rom;data_ram++;data_rom++;
    }/* Copy functions from ROM to RAM */
    while (code_rom_end != code_rom)
    {*code_ram = *code_rom;code_ram++;code_rom++;
    }/* Clear the zero-initialized data section */
    while(bss_end != bss_start)
    {*bss_start = 0;bss_start++;
    }/* Copy customsection rom to ram */
    while(custom_rom_end != custom_rom)
    {*custom_ram = *custom_rom;custom_rom++;custom_ram++;
    }/* Copy the vector table from ROM to RAM */
    /* Workaround */
    for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++)
    {vector_ram[n] = vector_rom[n];
    }
    /* Point the VTOR to the position of vector table */
    *s_vectors[coreId] = (uint32_t) __VECTOR_RAM;
    

    从这个代码内容可以看出,主要完成的工作是:

    1. 初始化 .data 段。其实就是把已经初始化的全局变量或者静态局部变量从 Flash 复制到 RAM 中
    2. 初始化 .code_ram 段。就是用户写的代码,声明需要在RAM中运行的代码,那么就把那部分代码从 FLASH 复制到 RAM 中。
    3. 清除 .bss 段。目的就是把初值为0的全局变量,或者静态局部变量,所占用的那一段RAM空间清0.
    4. 初始化 .custom_ram 。就是用户自定义的数据段,然后这些数据是有初始值的(初值不是0),然后把这段数据,从Flash复制到RAM中。
    5. 把外设的中断向量表从Flash复制到RAM中,并且把新的中断向量表地址赋值给CPU内部的中断向量基地址寄存器。

上面复制数据的过程中,都需要知道从哪里复制、复制到哪里去、复制的长度这3条信息。这些其实都可以通过链接文件获取到。

疑问:这里有点点疑问,为什么要把中断向量表复制到RAM?程序又没有在RAM中运行,除非程序被搬运到了RAM运行才需要重定向中断向量表吧?后面估计需要研究下启动过程才能了解清楚。

  • callbacks.h :定义了全局的中断事件类型、中断回调函数类型。

    /* UART 外设的事件类型定义 */
    /*!* @brief Define the enum of the events which can trigger UART callback** This enum should include the events for all platforms** Implements : uart_event_t_Class*/
    typedef enum
    {UART_EVENT_RX_FULL      = 0x00U,    /*!< Rx buffer is full */UART_EVENT_TX_EMPTY     = 0x01U,    /*!< Tx buffer is empty */UART_EVENT_END_TRANSFER = 0x02U,    /*!< The current transfer is ending */UART_EVENT_ERROR        = 0x03U,    /*!< An error occured during transfer */
    } uart_event_t;/* UART 外设的回调函数类型定义 */
    /*!* @brief Callback for all peripherals which support UART features** Implements : uart_callback_t_Class*/
    typedef void (*uart_callback_t)(void *driverState, uart_event_t event, void *userData);
    

    可以看出每个外设的类型定义 xxx_event_t ,然后回调函数类型是 xxx_callback_t ,其中 xxx 就是外设的名称。

  • devassert.h :S32 SDK 内部所有函数都使用了断言的机制,用于检查用户输入的参数是否合法。这个文件就是断言宏的定义,用户可以定义自己的断言函数,又或者使用SDK定义的默认的断言函数。

  • device_registers.h :该文件包含所有系列MCU的外设头文件,然后通过定义某个芯片的宏定义,具体包含哪个芯片的头文件。

  • status.h :该文件定义了全局的状态码,主要是指示外设驱动代码的API函数操作成功还是其他什么错误状态。

3.5.2 platform/drivers目录

该目录存放的就算 PD (外设驱动层)的驱动代码,包含了所有MCU外设的驱动。每个外设就是一个子文件夹。下面以edma外设为例,介绍下文件的作用。

1、edma 外设的源文件目录

在这里插入图片描述

  • edma_driver.c 就是对用户开放的外设驱动层 API 函数的定义和实现,用户可以调用这些函数编写应用程序。
  • edma_hw_access.c/.h 文件,外设寄存器访问函数的实现。这些函数大部分都是 inline (内联函数),会被 edma_driver.c 文件实现的驱动封装函数所调用。这些函数是不对用户开放的函数。
  • edma_irq.c/.h 文件,这些函数都是 .s 启动文件中断向量表定义的函数,然后在这些文件实现了。这些函数的函数名一定是要和中断向量表的函数名一致的,不然发生了中断就找不到中断的入口了。函数内部调用的是 driver 层实现的中断处理函数,比如 EDMA_DRV_IRQHandler() 函数。

2、drivers/inc目录

在这里插入图片描述

就是对用户开放的函数声明,以及结构体、宏定义、枚举等数据类型的声明和定义。每一个外设都有一个 xxx_driver.h 的头文件。

3.5.3 platform/pal目录

这个目录放的就是 PAL(外设抽象层)驱动代码了。外设抽象层其实就是外设驱动层代码的进一步封装,PAL的函数实现是调用了PD层的函数的。

下面是PAL层的软件架构:

在这里插入图片描述

PAL层的主要特性有:

  • 一系列外设的接口抽象(例如 LPUART + LINFlexD_UART + eSCI + FlexIO_UART + 等)
  • 每个 SDK 单层
  • 多个平台上的相同通用 API,可以具有跨平台的特性。

PAL层代码开发适用的场景:

  • 每当应用程序需要一个简化的通用接口来尽可能多地抽象底层芯片功能时。
  • 每当开发可移植的更高级别通用代码时,这些代码都旨在在不同的 NXP 平台上运行。这可能包括从低级控制台实用程序库到 TCP/IP 等通信堆栈的任何内容。

3.6 rtos

该目录存放的是已经适配了 S32K1xx 系列芯片的 FreeRTOS 源码(FreeRTOS_S32K子目录)以及 rtos 接口层代码的实现(osif子目录)。下面介绍下 osif 子目录。

在这里插入图片描述

  • osif_freertos.c 基于 FreeRTOS 实现的 os 接口层API函数,比如信号量、互斥量、任务创建等等和RTOS有关的接口。
  • osif_baremetal.c 基于裸机实现的操作系统接口层。没有任务相关的接口函数,但是有互斥量、信号量、嘀嗒心跳等一些API接口。

3.7 tools

这个目录存放的应该是一些工具文件,但是我还不了解文件怎么使用。后面再探索。

4. 总结

到这里,就对 S32K1xx SDK 做了基本的介绍,可以说是大致了解了这个SDK了。但是怎么去使用这个SDK,它的各个外设编程思路又是怎么样的,各个外设又有哪些数据结构,SDK的中断的处理机制是怎么样的…等等。这些都是我到目前为止的一些疑问,后面的学习中慢慢了解这些内容吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务如何治理

微服务远程调用可能有如下问题&#xff1a; 注册中心宕机&#xff1b; 服务提供者B有节点宕机&#xff1b; 服务消费者A和注册中心之间的网络不通&#xff1b; 服务提供者B和注册中心之间的网络不通&#xff1b; 服务消费者A和服务提供者B之间的网络不通&#xff1b; 服务提供者…

一、二维前缀和算法

文章目录 前缀和模板724. 寻找数组的中心下标238. 除自身以外数组的乘积560. 和为 K 的子数组974. 和可被 K 整除的子数组525. 连续数组1314. 矩阵区域和 前缀和模板 一维前缀和&#xff1a; import java.util.*;public class Main {public static void main(String[] args) …

香橙派Zero2安装wiringPi外设库

安装wiringOP库 直接在香橙派上下载 wiringOP 的代码 sudo apt update sudo apt install -y git git clone https://github.com/orangepi-xunlong/wiringOP 如果在香橙派上下载不下来&#xff0c;也可以在通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP …

ffplay播放器剖析(4)----音频输出和音频重采样流程

文章目录 1. 音频输出模块1.1 音频输出流程1.2 音频输出模型图 2. 打开SDL音频设备audio_open详解sdl_audio_callbackaudio_decode_frame 3. 音频重采样样本补偿 1. 音频输出模块 1.1 音频输出流程 打开SDL音频设备,设置参数启动SDL音频设备播放SDL音频回调函数读取数据,也就…

八、HAL_UART(串口)的接收和发送

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、UART和USART的区别 2.1、UART (1)通用异步收发收发器&#xff1a;Universal Asynchronous Receiver/Transmitter)。 2.2、USART (1)通用同步异步收发器&#xff1a;Universal Syn…

Rust 数据类型 之 类C枚举 c-like enum

目录 枚举类型 enum 定义和声明 例1&#xff1a;Color 枚举 例2&#xff1a;Direction 枚举 例3&#xff1a;Weekday 枚举 类C枚举 C-like 打印输出 强制转成整数 例1&#xff1a;Weekday 枚举 例2&#xff1a;HttpStatus 枚举 例3&#xff1a;Color 枚举 模式匹配…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

一、 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 二、 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注记 …

Kubernetes集群故障排查—审计

Kubernetes 审计&#xff08;Auditing&#xff09; 功能提供了与安全相关的、按时间顺序排列的记录集&#xff0c; 记录每个用户、使用 Kubernetes API 的应用以及控制面自身引发的活动。 审计功能使得集群管理员能够回答以下问题&#xff1a; 发生了什么&#xff1f;什么时候…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表&#xff1a;树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表&#xff0c;这样效率会高一些。 数组模拟单链表 邻接表&#xff1a;存储图和树 实…

(css)自定义el-dialog对话框添加背景图片

(css)自定义el-dialog对话框添加背景图片 效果&#xff1a; // 文件管理对话框 /deep/ .el-dialog {background: transparent;background-image: url("../assets/image/file-upload-background.png");background-size: 100% 100%; } // 头部 /deep/ .el-dialog__titl…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义&#xff1a; 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用&#xff0c;多数人知晓的&#xff0c;经过分类的&#xff0c;代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

WEB:wife_wife

背景知识 JavaScript原型链污染 题目 先尝试一下&#xff0c;注册了管理员账号 这里不知道邀请码&#xff0c;所以没有勾选 答案不正确 这里借鉴其他大佬的思路 查看源代码才知道&#xff0c;后端没有数据库&#xff0c;所以sql注入是不可能的 // post请求的路径 app.pos…

【网络】应用层——协议定制 | 序列化和反序列化 | 初识http

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面本喵已经带大家见识过了scoket网络通信的样子&#xff0c;现在开始深入学习网络的原理&#xff…

机器学习 day29(高偏差、高方差,参数d对模型的影响)

1. 高偏差、高方差、拟合能力、泛化能力 偏差和方差分别代表拟合能力和泛化能力若给左图数据集拟合一阶多项式&#xff08;d取1&#xff09;&#xff0c;则该模型有很高的偏差&#xff08;欠拟合&#xff09;。因为它对训练集和验证集的表现均不好&#xff0c;所以Jtrain很高…

快手内推(2024校招,社招)

校招 校招可以直接投递&#xff0c;如果想投递指定部门或岗位的可以私聊我。可以帮看简历和面试状态&#xff0c;加快推进。 内推码&#xff1a;vlxMTFNBS 专属内推链接&#xff1a;https://campus.kuaishou.cn/#/campus/jobs?codevlxMTFNBS 社招 社招内推私聊&#xff0c;可…

[Java]详解什么是注解以及如何自定义注解?

文章目录 一、什么是注解(1).注解的作用(2).注解的格式(3).注解在哪里使用 二、注解的类型(1).内置注解(2).元注解(3).自定义注解 三、自定义注解实现及测试结果&#xff1a; 一、什么是注解 (1).注解的作用 ①&#xff1a;注解一般用于对程序的说明&#xff0c;就像注释一样…

windows系统修改mysql8配置文件,关闭ssl验证

如何寻找配置文件 我的电脑&#xff0c;右键&#xff0c;管理&#xff0c;服务 找到MySQL8 右键&#xff0c;属性 找到配置文件位置 通常情况下的默认路径是&#xff1a; C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 如何关闭SSL验证 打开 my.ini 配置内容如下&#x…

【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用

目录 1 列表的创建 2 列表的删除 3 访问列表元素 4 遍历列表 5 添加修改删除列表元素 6 对列表进行统计和计算 7 对列表进行排序 8 列表推导式 9 多维列表 在Python中&#xff0c;列表是一种有序的可变数据类型&#xff0c;用于存储一组元素。 列表使用方括号“[] ”来…