【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关闭板载绿灯。
文字描述总是没有图形描述来的更加直观,直接上图:

在这里插入图片描述

图 1

二, 功能实现

本篇文章基于之前把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配置之前,先给出本文功能的软件流程图:
在这里插入图片描述

图 2

这里可以看到,默认的情况就是通过MCAL配置的情况,然后在代码里面也有去修改PWM的频率,然后通过按键以及循环延时等方式去修改PWM的占空比。

2.3 资源分配概览

将本文用到的硬件资源以及功能情况罗列如下:
在这里插入图片描述

图 3

关于emios相关总线的罗列配置如下:
在这里插入图片描述

图4

这里需要注意的是,对于MCL emios 中master bus和bus mode,需要在PWM模块中选择合适的PWM mode以及counter bus,否则要么配置报错,要么无法生成正确的PWM波形。
从官方的S32K3 RM中可以查阅,时钟通道和bus类型的情况:
在这里插入图片描述

图 5

比如,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下表:
在这里插入图片描述

图6

可以找到对应模式所能支持的通道类型,然后再根据图5中的通道类型去选择对应的通道,counter bus等。有了这些基础知识,下面直接进入EB 配置。

2.4 EB 配置

这里罗列出所有本文相关的EB tresos里面使用到的模块,并且重点给予需要具体配置的模块讲解。

在这里插入图片描述

图 7

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],
则,对应的中断情况如下:
在这里插入图片描述

图 8

在这里插入图片描述

图 9

(1) Icu->IcuSiul2->IcuSiul2Channels:13
(2) Icu->IcuChannel配置如下:
在这里插入图片描述

图 10

选择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:
在这里插入图片描述

图11

主要目的是通过Trigmux把PWM1 Emios0_ch4 连接到LCU0_IN0.
(3) Mcl->LCU Configuration
这里是配置LCU模块,主要功能是配置逻辑输入,以及逻辑输出情况,输入一个IN0,输出两个OUT0,OUT1.
在这里插入图片描述

图12

在这里插入图片描述

图13

在这里插入图片描述

图14

OUTPUT0 值0XAAAA=43690,
OUTPUT1 值0X5555=21845
这么做的目的是让输入的PWM生成一对互补的PWM。
在这里插入图片描述

图 15

(4)Mcl->Emios Common
添加两个Emios,分别为EMIOS_0, EMIOS_1,代表用到两个EMIOS。
EMIOS0配置了两个master bus通道:CH_22,CH_0,而且具有不同的模式类型,向上向下计数和向上计数。
EMIOS1配置了一个master bus通道:CH_23,向上计数
和图4对应。
在这里插入图片描述

图 16

在这里插入图片描述

图 17

注意,这里的通道并不是真正输出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里面的对应,否则会报错。
在这里插入图片描述

图18

不同的中断,有不同的中断服务函数,需要查到代码定义的函数名称填写到EB。
EB配置如下:
在这里插入图片描述

图19

2.4.6 Port module

配置8个引脚情况如下:
在这里插入图片描述

图 20

可以看到,有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,所以需要添加两个:
在这里插入图片描述

图 21

对于PwmEmios_1,里面有一个通道,配置情况如下:
在这里插入图片描述

图22

PwmEmiosBusRef: /Mcl/Mcl/MclConfig/EmiosCommon_1/EmiosMclMasterBus_0
在这里插入图片描述

图 23

可以看到,这里PwmEmios_1的busRef是Mcl里面的Emios_ch_23,即BusA
也就是说EMIOS1_CH12用的bus参考时钟来自EMIOS1_CH23,即Bus A。
PwmEmios_0里面配置了两个通道,配置情况如下:
在这里插入图片描述

图24

在这里插入图片描述

图25

EMIOS0_CH4用的bus参考时钟来自EMIOS0_CH22,即Bus F。
另外一个EMIOS0通道:
在这里插入图片描述

图 26

在这里插入图片描述

图27

EMIOS0_CH2用的bus参考时钟来自EMIOS0_CH0,即Bus B,所以选择Bus BCDE。
到这里,是可以清晰的知道,真正的PWM输出通道和内部的MCL的Emios counter bus通道的关系了。
(2)Pwm->PwmEmios
有了前面配置的PWM的具体信息,下面直接配置PWM的通道,一共三个通道:
PWM0, PWM1, PWM2,也正是代码里面需要用到的标志。
在这里插入图片描述

图 28

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均已经工作。
在这里插入图片描述

图29

在这里插入图片描述

图30
文章配套代码链接:

https://community.nxp.com/t5/S32K-Knowledge-Base/RTD400-MCAL-K344-KEY-control-EMIOS-PWM/ta-p/1967347

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

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

相关文章

STM32+ADC+扫描模式

1 ADC简介 1 ADC(模拟到数字量的桥梁) 2 DAC(数字量到模拟的桥梁)&#xff0c;例如&#xff1a;PWM&#xff08;只有完全导通和断开的状态&#xff0c;无功率损耗的状态&#xff09; DAC主要用于波形生成&#xff08;信号发生器和音频解码器&#xff09; 3 模拟看门狗自动监…

Oracle架构之数据库备份和RAC介绍

文章目录 1 数据库备份1.1 数据库备份分类1.1.1 逻辑备份与物理备份1.1.2 完全备份/差异备份/增量备份 1.2 Oracle 逻辑备份1.2.1 EXP/IMP1.2.1.1 EXP导出1.2.1.2 EXP关键字说明1.2.1.3 导入1.2.1.4 IMP关键字说明 1.2.2 EXPDP/IMPDP1.2.2.1 数据泵介绍1.2.2.2 数据泵的使用 1.…

通过 Groovy 实现业务逻辑的动态变更

Groovy 1、需求的提出2、为什么是Groovy3、设计参考1_引入Maven依赖2_GroovyEngineUtils工具类3_GroovyScriptVar类4_脚本规则表设计5_对应的实体类6_数据库访问层7_GroovyExecService通用接口 4、测试5、其他的注意事项6、总结 1、需求的提出 在我们日常的开发过程中&#xf…

嵌入式知识点复习(一)

国庆倒数第二天&#xff0c;进行嵌入式课堂测试的复习&#xff1a; 第一章 绪论 1.1 嵌入式系统的概念 嵌入式系统定义 嵌入式系统定位 嵌入式系统形式 嵌入式系统三要素 嵌入式系统与桌面通用系统的区别 1.2 嵌入式系统的发展历程 微处理器的演进历史 单片机的演进历史 …

【易社保-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【Python】数据可视化之聚类图

目录 clustermap 主要参数 参考实现 clustermap sns.clustermap是Seaborn库中用于创建聚类热图的函数&#xff0c;该函数能够将数据集中的样本按照相似性进行聚类&#xff0c;并将聚类结果以矩阵的形式展示出来。 sns.clustermap主要用于绘制聚类热图&#xff0c;该热图通…

用manim实现Gram-Schmidt正交化过程

在线性代数中&#xff0c;正交基有许多美丽的性质。例如&#xff0c;由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外&#xff0c;例如&#xff1a;在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法&#…

Python Tips6 基于数据库和钉钉机器人的通知

说明 起因是我第一版quant程序的短信通知失效了。最初认为短信是比较即时且比较醒目的通知方式&#xff0c;现在看来完全不行。 列举三个主要问题&#xff1a; 1 延时。在早先还能收到消息的时候&#xff0c;迟滞就很严重&#xff0c;几分钟都算短的。2 完全丢失。我手机没有…

AI 时代:产品经理不“AI”就出局?

即便你没想去做“AI 产品经理”&#xff0c;那你也不能成为一个不会用 AI 的产品经理。 产品经理肯定是所有互联网从业者中&#xff0c;最先捕捉到 AI 趋势的岗位。 但只知道 AI、关注 AI 还不够&#xff0c;仔细审视一下&#xff1a;你自己的工作&#xff0c;被 AI 提效了么…

《Windows PE》4.1导入表

导入表顾名思义&#xff0c;就是记录外部导入函数信息的表。这些信息包括外部导入函数的序号、名称、地址和所属的DLL动态链接库的名称。Windows程序中使用的所有API接口函数都是从系统DLL中调用的。当然也可能是自定义的DLL动态链接库。对于调用方&#xff0c;我们称之为导入函…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

STM32定时器(TIM)

目录 一、概述 二、定时器的类型 三、时序 四、定时器中断基本结构 五、定时器定时中断代码 六、定时器外部时钟代码 一、概述 TIM(Timer)定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基…

力扣刷题 | 两数之和

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 给定一个整数数组 nums 和…

网站建设完成后,切勿让公司官网成为摆设

在当今这个数字化时代&#xff0c;公司官网已经成为企业展示形象、传递信息、吸引客户的重要平台。然而&#xff0c;许多企业在网站建设完成后&#xff0c;往往忽视了对官网的持续运营和维护&#xff0c;导致官网逐渐沦为摆设&#xff0c;无法发挥其应有的作用。为了确保公司官…

15分钟学 Python 第40天:Python 爬虫入门(六)第一篇

Day40 &#xff1a;Python 爬取豆瓣网前一百的电影信息 1. 项目背景 在这个项目中&#xff0c;我们将学习如何利用 Python 爬虫技术从豆瓣网抓取前一百部电影的信息。通过这一练习&#xff0c;您将掌握网页抓取的基本流程&#xff0c;包括发送请求、解析HTML、存储数据等核心…

jvisualvm学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

ssm服装店销售管理系统

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第1章 绪论 1 1.1研究背景 1 1.2研究意义 1 1.3国内外研究现状 2 1.3.1国外研…

提高顾客满意度,餐饮业如何开展客户调研?

餐饮行业需明确调研目的&#xff0c;选择合适工具&#xff0c;设计问卷&#xff0c;收集并分析数据&#xff0c;持续追踪优化。通过客户调研&#xff0c;提升服务质量、顾客满意度和竞争力&#xff0c;利用ZohoSurvey等工具实现高效调研。 一、明确调研目的 进行客户调研前&am…

【hot100-java】【将有序数组转换为二叉搜索树】

二叉树篇 中序遍历实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示&#xff0c;现在我们主要完善一下工具栏菜单按键 一、添加任务ui 先加个ui页面&#xff0c;不想看ui的复制完这个文件到ui目录下转下py直接从第二步开始看 vi ui/formpy.ui <?xml version"1.0" encoding"UTF-8&q…