【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM
【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM
- 一,文档简介
- 二, 功能实现
- 2.1 软硬件平台
- 2.2 软件控制流程
- 2.3 资源分配概览
- 2.4 EB 配置
- 2.4.1 Dio module
- 2.4.2 Icu module
- 2.4.4 Mcu module
- 2.4.5 Platform module
- 2.4.6 Port module
- 2.4.7 Pwm module
- 2.5 main code
- 三,测试结果
一,文档简介
搞了有一段时间的S32K3了,MCAL的代码写了几个,但是一直没抽出时间好好写文章,MCAL的文章第一篇就从K344 EMIOS+ICU+TRIMUX+LCU的组合体开始,这个可以涉及到PORT, DIO, EMIOS,中断ICU,TRIGMUX,LCU等综合配置,板子平台还是基于NXP 官方S32K344EVB,RTD400,功能为:使用EMIOS0 两个通道,EMIOS1一个通道。EMIOS 0 其中一个通道输出PWM之后,通过TRIGUMX连接LCU生成一组互补的PWM,另外一个通道可以实现通过SW5 PT26按键实现硬件中断控制PWM占空比。EMIOS1一个通道直接连接到PTA29 板载红灯,通过改变PWM占空比实现亮度渐进改变,然后在亮灭直接循环改变实现呼吸灯效果。同时在PWM关闭红灯的时候,通过DIO打开板载绿灯,PWM打开红灯的时候,DIO关闭板载绿灯。
文字描述总是没有图形描述来的更加直观,直接上图:
二, 功能实现
本篇文章基于之前把MCAL代码porting到S32DS的demo上,然后就在S32DS的平台下,通过EB配置MCAL 相关模块,再通过S32DS去编译并且下载仿真。当然喜欢命令行模式的,还是可以直接去用EB配置好的xmd文件,然后借助VScode去编译,过程也很简单,本文在此就不赘述命令行方式。
2.1 软硬件平台
板子:S32K344EVB,其他K3板子也可以
IDE:S32DS3.5
RTD: K344 RTD 400
MCAL tool: EBtresos Studio 29.0
2.2 软件控制流程
在讲具体的MCAL配置之前,先给出本文功能的软件流程图:
这里可以看到,默认的情况就是通过MCAL配置的情况,然后在代码里面也有去修改PWM的频率,然后通过按键以及循环延时等方式去修改PWM的占空比。
2.3 资源分配概览
将本文用到的硬件资源以及功能情况罗列如下:
关于emios相关总线的罗列配置如下:
这里需要注意的是,对于MCL emios 中master bus和bus mode,需要在PWM模块中选择合适的PWM mode以及counter bus,否则要么配置报错,要么无法生成正确的PWM波形。
从官方的S32K3 RM中可以查阅,时钟通道和bus类型的情况:
比如,PWM0中选择的是EMIOS_CH23,那么这个bus对应的就是bus A,该时钟是可以给所有的通道使用的,所以PWM0是CH12是可以使用Bus A. CH22对应的是bus F,该时钟也是可以给所有通道使用的,所以PWM1 CH4 选择Bus F也没问题,CH0对应的是bus B,该时钟是对应通道0-7,所以对于PWM2是CH2也是可以使用的。在为自己的EMIOS 通道选择counter bus时钟源的时候,一定要考虑到counter bus对于通道覆盖度的问题。
除了counter bus的选择之外,还有就是PWM模式选择,这个就比较好办,对于时钟向上计数的,选择OPWMB,对于时钟向上向下计数的,选择OPWMCB中间对齐PWM。
在实际的使用中,通常是根据自己的PWM需求来决定模式选择,然后再根据RM下表:
可以找到对应模式所能支持的通道类型,然后再根据图5中的通道类型去选择对应的通道,counter bus等。有了这些基础知识,下面直接进入EB 配置。
2.4 EB 配置
这里罗列出所有本文相关的EB tresos里面使用到的模块,并且重点给予需要具体配置的模块讲解。
2.4.1 Dio module
需要配置DioPort界面,主要目的是配置PTA30, 板载绿灯,选择DioPort Id=1,Dio Channel Id=14. 关于DioPortId, Dio Channel Id的规则如下:
Channel = DioChannelId + DioPortId∗16
For S32K3X4 derivatives
– Port AL=0
– Port AH=1
– Port BL=2
– Port BH=3
– Port CL=4
– Port CH=5
– Port DL=6
– Port DH=7
– Port EL=8
– Port EH=9
– Port FL=10
– Port FH=11
– Port GL=12
– Port GH=13
PTA30=>30=DioChannelId(14)+DioPortId*16
2.4.2 Icu module
首先配置IcuSiul2,目标是使能板载SW5,PTB26的输入中断。PTB26对应的是EIRQ[13],
则,对应的中断情况如下:
(1) Icu->IcuSiul2->IcuSiul2Channels:13
(2) Icu->IcuChannel配置如下:
选择IcuChannelRef为之前配置的IcuSiul2Channels,另外就是添加中断通知函数:
User_EdgeDetect,注意,这个函数就是代码里面需要添加的用户中断处理函数名。
(3)Icu->IcuHwInterruptConfigList-> ICU Peripheral ISR Name: SIUL2_0_IRQ_CH_13,IcuIsrEnable enable
2.4.3 Mcl module
该模块主要用于配置emios 计数时钟,trgmux,LCU的配置。
(1)Mcl->Trgmux Logic Instance->Hardware Instance: TRGMUX_IP_HW_INST_0
(2) Mcl->Trgmux Logic Group:
主要目的是通过Trigmux把PWM1 Emios0_ch4 连接到LCU0_IN0.
(3) Mcl->LCU Configuration
这里是配置LCU模块,主要功能是配置逻辑输入,以及逻辑输出情况,输入一个IN0,输出两个OUT0,OUT1.
OUTPUT0 值0XAAAA=43690,
OUTPUT1 值0X5555=21845
这么做的目的是让输入的PWM生成一对互补的PWM。
(4)Mcl->Emios Common
添加两个Emios,分别为EMIOS_0, EMIOS_1,代表用到两个EMIOS。
EMIOS0配置了两个master bus通道:CH_22,CH_0,而且具有不同的模式类型,向上向下计数和向上计数。
EMIOS1配置了一个master bus通道:CH_23,向上计数
和图4对应。
注意,这里的通道并不是真正输出PWM的通道,只是需要使用PWM通道的counter bus通道,具有提供时钟能力的通道。
2.4.4 Mcu module
该模块是整个MCU用来配置时钟的基础,使用原始RTD PWM demo默认的情况,就一个点需要注意。
Mcu->McuClockSettingConfig_0->McuClockReferencePoint->McuClockReferencePoint_0->core clock 48MHZ.
这个时钟是EMIOS时钟的来源,有了时钟源,根据设定的周期,就不难计算真正的PWM频率了。比如需要一个1Khz的PWM,则可以配置period=48M/1K=48000
2.4.5 Platform module
Platform->Interrupt Controller->IntCtrlConfig0, 使能SIUL_1_IRQn, 并且添加Hanlder为:
SIUL2_EXT_IRQ_8_15_ISR
注意,这个SIUL2_EXT_IRQ_8_15_ISR不是乱写的,是要和Siul2_Icu_Ip_Irq.c里面的对应,否则会报错。
不同的中断,有不同的中断服务函数,需要查到代码定义的函数名称填写到EB。
EB配置如下:
2.4.6 Port module
配置8个引脚情况如下:
可以看到,有3路主EMIOS PWM,一路输入中断,一路输出GPIO,两路输出LCU 互补PWM。
2.4.7 Pwm module
Mcl里面配置的是EMIOS的counter 时钟通道,真正要输出的PWM通道都需要在Pwm模块中配置,并且链接到Mcu时钟源以及Mcl里面的emios counter bus源。
(1)Pwm->PwmEmios
添加两组,用来给对应的EMIOS模块,比如本文用到了EMIOS0,EMIOS1,所以需要添加两个:
对于PwmEmios_1,里面有一个通道,配置情况如下:
PwmEmiosBusRef: /Mcl/Mcl/MclConfig/EmiosCommon_1/EmiosMclMasterBus_0
可以看到,这里PwmEmios_1的busRef是Mcl里面的Emios_ch_23,即BusA
也就是说EMIOS1_CH12用的bus参考时钟来自EMIOS1_CH23,即Bus A。
PwmEmios_0里面配置了两个通道,配置情况如下:
EMIOS0_CH4用的bus参考时钟来自EMIOS0_CH22,即Bus F。
另外一个EMIOS0通道:
EMIOS0_CH2用的bus参考时钟来自EMIOS0_CH0,即Bus B,所以选择Bus BCDE。
到这里,是可以清晰的知道,真正的PWM输出通道和内部的MCL的Emios counter bus通道的关系了。
(2)Pwm->PwmEmios
有了前面配置的PWM的具体信息,下面直接配置PWM的通道,一共三个通道:
PWM0, PWM1, PWM2,也正是代码里面需要用到的标志。
2.5 main code
#include "Pwm.h"
#include "Mcu.h"
#include "Port.h"
#include "Mcl.h"
#include "Platform.h"
#include "Dio.h"
#include "Icu.h"
//#include "check_example.h"#define NUM_BLINK_LED (uint32)10U
#define DELAY_TIMER (uint32)5000000U
#define MCL_EMIOS_1_CH_23 (uint16)279U
#define MCL_EMIOS_0_CH_22 (uint16)22U
Mcl_LcuSyncOutputValueType PWM_OutputList[2];volatile uint8 UserCountIrqCH0;
void TestDelay(uint32 delay);
void TestDelay(uint32 delay)
{static volatile uint32 DelayTimer = 0;while(DelayTimer<delay){DelayTimer++;}DelayTimer=0;
}
void User_EdgeDetect(void)
{/* increment IRQ counter */UserCountIrqCH0++;if(UserCountIrqCH0 % 2 == 0){Pwm_SetDutyCycle(PwmChannel_2, 0X6000);}else{Pwm_SetDutyCycle(PwmChannel_2, 0X2000);}
}
int main(void)
{uint8 num_blink = 0U, i = 0;uint16 duty_cnt = 0;UserCountIrqCH0 = 0U;/* Initialize the Mcu driver */Mcu_Init(&Mcu_Config_VS_0);/* Initialize the clock tree */Mcu_InitClock(McuClockSettingConfig_0);/* Apply a mode configuration */Mcu_SetMode(McuModeSettingConf_0);Platform_Init(NULL_PTR);/* Initialize all pins using the Port driver */Port_Init(&Port_Config_VS_0);/* Initialize Mcl driver */Mcl_Init(&Mcl_Config_VS_0);/* Initialize the Icu driver */Icu_Init(NULL_PTR);Icu_EnableEdgeDetection(IcuChannel_0);Icu_EnableNotification(IcuChannel_0);/* Initialize Pwm driver , after that Led on*/Pwm_Init(&Pwm_Config_VS_0);/* PTA29 duty cycle is 50% */Pwm_SetDutyCycle(PwmChannel_0, 0X4000);// PTB16,pwm1 , emios0_ch4, use trigmux LCU output 2 Complementarity PWMMcl_LcuSyncOutputValueType lcuEnable[2U];lcuEnable[0].LogicOutputId = 0;lcuEnable[0].Value = 1U;lcuEnable[1].LogicOutputId = 1;lcuEnable[1].Value = 1U;Mcl_SetLcuSyncOutputEnable(lcuEnable, 2U);TestDelay(DELAY_TIMER);/* Set new period for all channels used external counter bus */Mcl_Emios_SetCounterBusPeriod(MCL_EMIOS_1_CH_23, 4800, FALSE); // pwmchannel_0 10KhzMcl_Emios_SetCounterBusPeriod(MCL_EMIOS_0_CH_22, 1200, FALSE);// for PwmChannel_1, 20Khz
// PWM0: 10kHZ
//PWM1: 20KHZ
//PWM2:1KHZ// PTA29 10kHZ/* PTA29 duty cycle is 50% */Pwm_SetDutyCycle(PwmChannel_0, 0X4000);/* Setup new duty cycle to the pin*/Pwm_SetDutyCycle(PwmChannel_1, 0x4000);for(i=0; i <= 10; i++){duty_cnt = i * 0x800;Pwm_SetDutyCycle(PwmChannel_0, duty_cnt);TestDelay(DELAY_TIMER);}/* Using duty cycle 0% and 100% to Blink LED */while(1){/* pwm1 when duty cycle is 75% */Pwm_SetDutyCycle(PwmChannel_1, 0X6000);//Led offPwm_SetDutyCycle(PwmChannel_0, 0X0000); //red offDio_WriteChannel(DioConf_DioChannel_Digital_ledgreenPTA30, STD_HIGH); //green onTestDelay(DELAY_TIMER);/* pwm 1 when duty cycle is 25% */Pwm_SetDutyCycle(PwmChannel_1, 0X2000);//Led ONDio_WriteChannel(DioConf_DioChannel_Digital_ledgreenPTA30, STD_LOW); //Green OFFPwm_SetDutyCycle(PwmChannel_0, 0X8000); //RED ONTestDelay(DELAY_TIMER);num_blink++;}/* De-Initialize Pwm driver */Pwm_DeInit();//Exit_Example(TRUE);return 0U;
}
三,测试结果
上电后,板载红灯闪烁,然后从灭渐进变亮,并且和绿灯交替闪烁。
测试PWM1 PTB16: EMIOS0_CH4,稳定后波形为20Khz,占空比在25%,75%交替改变。PWM2 PTB14:EMIOS0_CH2,稳定后,频率为1KHZ, 随着板载的SW5按下,在25%,75%占空比交替改变。
测试PTD3,PTD2,可以看到是一对互补波形,并且和PTB16是一样的频率,占空比改变规律也一致,由此可知,本文的按键中断,3个主PWM,2个LCU PWM均已经工作。
https://community.nxp.com/t5/S32K-Knowledge-Base/RTD400-MCAL-K344-KEY-control-EMIOS-PWM/ta-p/1967347
相关文章:

【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM
【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM 一,文档简介二, 功能实现2.1 软硬件平台2.2 软件控制流程2.3 资源分配概览2.4 EB 配置2.4.1 Dio module2.4.2 Icu module2.4.4 Mcu module2.4.5 Platform module2.4.6 Port module2.4.7 Pwm module 2.5 …...

华为OD机试真题---绘图机器(计算面积)
题目描述 绘图机器的绘图笔初始位置在原点(0,0),机器启动后按照以下规则绘制直线: 尝试沿着横线坐标正向绘制直线直到给定的终点E。期间可以通过指令在纵坐标轴方向进行偏移,offsetY为正数表示正向偏移,为负数表示负向偏移。 给…...
HarmonyOs 查看官方文档使用弹窗
1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后,基本也就入门了,但是有一些操作网上没有找到合适教学的视频,这时,大家就需要养成参考官方文档的习惯了,因为官方的开发文档是我们学习深度任何一门语言或…...

uniapp+Android智慧居家养老服务平台 0fjae微信小程序
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…...

在一台电脑上实现网页与exe程序使用udp通信
要在同一台电脑上实现网页(前端)与 EXE 程序(后端)通过 UDP 通信,可以使用以下步骤。前端可以使用 JavaScript 通过 WebSocket 与自定义服务器进行通信,该服务器通过 UDP 发送和接收数据,再与 E…...

基于Java的GeoTools对Shapefile文件属性信息深度解析
目录 前言 一、Shapefile的属性列表信息 1、属性表格信息 2、属性表格包含的要素 二、GeoTools对属性表格的解析 1、常规解析方法 2、基于dbf文件的属性信息读取 三、总结 前言 ESRI Shapefile(shp),或简称shapefile,是美…...

付费计量系统实体和接口(1)
13.System entities and interfaces 系统实体和接口 See also Clause 4 for a discussion on general concepts and Clause 5 for generic entity model. 参见条目 4 讨论总体概念、条目 5 通用实体模型。 An entity specification should specify the embodied functions and …...

网易博客旧文----bacnet学习系列之四----VTS的初步使用
bacnet学习系列之四----VTS的初步使用 2014-02-07 13:32:28| 分类: BACnet | 标签: |举报 |字号大中小 订阅 这是一个测试用 的工具,而且是开放源码的,下载地址为:VTS下载官网 也可以从我的网盘下载 VTS下载 我用的是…...

SpringIoC容器的初识
一、SpringIoC容器的介绍 Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这…...

队列的实现与讲解
一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作,在另⼀端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进⾏插⼊操作的⼀端称为队尾 出队列:进⾏删除操作的⼀端称为队头 注意&…...

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…...

自动驾驶-参考线生成
为什么要进行参考线生成? apollo在routing模块,已经得到的全局路径,但是其不能直接作为局部路径规划的参考线,这是因为: routing给出的全局路径过长;routing是基于高精地图给出的路径,高精地图…...

厂商资源分享网站
新华三(H3C)是一家中国知名的网络设备供应商,提供网络设备、网络解决方案和云计算服务。公司成立于2003年,是华为公司和惠普公司合资的企业,总部位于中国深圳。 华为(Huawei)是一家全球知名的电…...

【ONE·Web || HTML】
总言 主要内容:HTML基本知识入门,主要介绍了常见的一些标签使用,以及简单案例演示。 文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…...

MongoDB的安装与增删改查基本操作
MongoDB是一种非关系型数据库,是NoSQL语言,但是又是最接近关系型数据库的。内部存储不是表结构,但是可以对数据进行表结构的操作。 一、安装 在官网:Download MongoDB Community Server | MongoDB下载系统对应的版本进行安装即可 二、编辑器 在安装MongoDB后会自带一个编…...

Python水循环标准化对比算法实现
🎯要点 算法区分不同水循环数据类型:地下水、河水、降水、气温和其他,并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…...

【TypeScript】知识点梳理(一)
#国庆快乐!来点干货~ # #项目中团队总结生产问题,40%是类型相关问题,可见TS的重要性与向好趋势# TS是JS的超集 类型 Number、String、Boolean 首字母大小写,类型有区别,譬如: string是基元(原始…...

DMA方式在执行中断处理程序时不中断现行程序吗
DMA方式在执行中断处理程序时会中断现行程序,但DMA数据传输过程本身不中断现行程序。以下是对DMA方式及其中断处理程序的详细解释: DMA方式的基本特点 DMA(Direct Memory Access,直接存储器存取)方式是一种由硬件直接…...

Redis:string类型
Redis:string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中,字符串string存储的是二进制,以byte为单位,输入的二进…...

【C++ STL】手撕vector,深入理解vector的底层
vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…...

【Android】CarWatchDog I/O监控服务
Android Car WatchDog I/O监控服务 背景: 某基于Android 13的车载系统。 某天长时间测试一款3方(非SystemApp)时,该款应用偶发闪退现象。 通过日志分析,发现应用被系统的 Car WatchDog(喂狗服务ÿ…...

如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。
当然!下面是关于如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。 掌握 Django 用户认证的艺术 Django 是一个强大的 Python Web 框架,以其灵活性和高效性著称。无论你是新手还是经验丰富的开发者,理解和实现用户认证都是 Web 开发中的一项核心…...

C++ 语言特性21 - 别名模板
一:概述 别名模板是 C11 引入的,用于为一个模板类型定义别名,从而简化复杂的模板类型定义。它结合了 using 关键字,可以对模板类型进行重新命名,使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…...

Jenkins pipeline配置示例
前提条件:已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考: 1.创建pipeline 点击新建项目: 输入名称,选择pipeline: 进入配置页面,如果要配置GitHub Webhook要勾选:<fo…...

Navicat for MySQL 常见问题
一、 创建连接失败问题 创建连接后,报错:1251 -Client does not support authentication protocal by server;consider upgrading MySQL client 原因:环境冲突 解决办法 : windowsR 打开 services.msc 找S开头:SQ…...

Windows:win11旗舰版连接无线显示器,连接失败
摘要:win11系统通过 miracast 无线连接到长虹电视的时候,一直连接不上。查看电脑又是支持 miracast 协议,后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视,打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…...

Android2024.2.1升级错误
提示 Gradle 版本不兼容,升级后就报错了 。 1.gradle安装包镜像 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencen…...

【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势
陪玩系统开发运营级别陪玩成品搭建 支持二开源码交付,游戏开黑陪玩系统: 多客陪玩系统,游戏开黑陪玩,线下搭子,开黑陪玩系统 前端uniapp后端php,数据库MySQL 1、长时间的陪玩APP源码开发经验,始终坚持从客户…...

Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:在学习了Arduino的相关基础知识后,现在做个综合应用,给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …...

ChatGPT全新功能Canvas上线:开启智能编程与写作新篇章
引言 随着人工智能技术的迅猛发展,OpenAI旗下的明星产品ChatGPT不断推出创新功能,以满足用户在各个领域的需求。2024年10月3日,OpenAI正式宣布了ChatGPT的全新功能——Canvas。这一功能基于先进的GPT-4o模型开发,为用户提供了一个…...