【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM

news2025/1/23 3:03:24

【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 PWM
    Mcl_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 10Khz
    Mcl_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 off
        Pwm_SetDutyCycle(PwmChannel_0, 0X0000); //red off
        Dio_WriteChannel(DioConf_DioChannel_Digital_ledgreenPTA30, STD_HIGH); //green on
        TestDelay(DELAY_TIMER);

        /* pwm 1 when duty cycle is 25% */
        Pwm_SetDutyCycle(PwmChannel_1, 0X2000);
        //Led ON
        Dio_WriteChannel(DioConf_DioChannel_Digital_ledgreenPTA30, STD_LOW);     //Green OFF
        Pwm_SetDutyCycle(PwmChannel_0, 0X8000); //RED ON
        TestDelay(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.coloradmin.cn/o/2192979.html

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

相关文章

SCTF2024(复现)

SCTF2024&#xff08;复现&#xff09; web SycServer2.0 开题&#xff1a; 需要登录&#xff0c;进行目录扫描&#xff0c;得到/config&#xff0c;/hello&#xff0c;/robots.txt 等&#xff0c;访问/hello 显示需要 token&#xff0c;查看源码发现存在 sqlwaf 可以通过抓…

基于ucontext库实现协程类

文章目录 前言协程基础知识协程上下文对称协程与⾮对称协程有栈协程与⽆栈协程 ucontext库接口熟悉一个简单的函数切换自动调用 协程类的实现接口全局变量线程局部变量malloc封装协程切换构造函数协程执行的方法 测试协程切换手动切换复用 前言 协程&#xff08;Coroutine&…

Maven安装使用

说明&#xff1a;Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。一般来说&#xff0c;它帮助我们管理依赖、构建项目。本文介绍在Windows系统下安装Maven。 下载&安装&验证 下载 首先&#xff0c;在Maven官网&#xff08;https:…

【第十五周】PyTorch深度学习实践2

目录 摘要Abstract1.多分类问题1.1.Softmax1.2.维度问题1.3.NLLLoss v.s. CrossEntropy1.4.代码实践1.4.1.导入相应的包1.4.2.准备数据集1.4.3.模型设计1.4.4.构造损失和优化器1.4.5.模型训练 2.卷积神经网络基础篇2.1.代码实践2.1.1.导入相应的包&#xff1a;2.1.2.准备数据集…

我谈巴特沃斯滤波器

目录 写在前面的内容我谈巴特沃斯滤波器巴特沃斯滤波器的幅频响应频率变换巴特沃斯各种滤波器例子 写在前面的内容 先看看冈萨雷斯对巴特沃斯滤波器的介绍。 低通 高通 带阻 带通 第一个问题&#xff0c;截止频率处的增益。 0.5的增益是不是陡度小了&#xff1f;巴特沃…

ai智能论文生成系统有用吗?分享5款ai文献综述自动生成器

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术在学术写作领域的应用越来越广泛&#xff0c;尤其是在文献综述的自动生成方面。AI智能论文生成系统通过深度学习和自然语言处理技术&#xff0c;能够帮助研究人员快速生成高质量的文献综述&#xff0c;从而提高写作效…

深度扩展AntSK,让.NET Aspire助力您的AI项目

引言 在现今飞速发展的技术世界中&#xff0c;引用最新的工具和框架来提升项目的性能和可管理性至关重要。作为一名开发者&#xff0c;我最近在自己的AI知识库项目AntSK中集成了.NET Aspire&#xff0c;这为我的项目注入了新的活力。如果你还不清楚什么是.NET Aspire&#xff0…

[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv 在集群中认证ceph 用下面代码生成ceph的secret .创建 ceph 的 secret&#xff0c;在 k8s 的控制节点操作&#xff1a; 回到 ceph 管理节点创建 pool 池&#xff1a; [rootmaster1-admin ~]# ceph osd pool create k8stest 56 pool k8stest created [rootm…

BERT论文解读及情感分类实战(论文复现)

BERT论文解读及情感分类实战&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 BERT论文解读及情感分类实战&#xff08;论文复现&#xff09;简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 N…

【web安全】——常见框架漏洞

1.ThinkPHP框架漏洞 thinkphp是一个国内轻量级的开发框架&#xff0c;采用phpapache&#xff0c;在更新迭代中&#xff0c;thinkphp也经常爆出各种漏洞&#xff0c;thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本&#xff0c;前两个版本已经停止更新&#xff…

【详细教程】如何使用YOLOv11进行图像与视频的目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

m4a怎么转换成mp3?音频转换MP3只需要这6个小工具!

m4a怎么转换成mp3&#xff1f;M4A和MP3是两种常见的音频格式&#xff0c;M4A通常使用AAC&#xff08;高级音频编码&#xff09;进行压缩&#xff0c;提供更高的音质和更小的文件体积&#xff0c;特别适合在Apple设备上使用。而MP3则以其高压缩比和广泛的兼容性著称&#xff0c;…

TM1618数码管控制芯片使用共阳极数码管过程中的问题和解决办法

控制芯片的基本了解 相比于不用控制芯片的电路&#xff1a;这里带2根电源线和3个信号线&#xff0c;共使用了5根线&#xff0c;但可以控制4个8段数码管显示。若是电路直接控制4个8段数码管需要84113个接口&#xff0c;这对于MCU的珍贵引脚简直是浪费。 这里不会出现余晖效应也…

大花蔷薇T2T基因组-60

Multi-omics analyzes of Rosa gigantea illuminate tea scent biosynthesis and release mechanisms 多组学分析揭示了大花蔷薇茶香合成及释放机制 摘要 玫瑰是一种全球广泛栽培的重要观赏作物&#xff0c;用于香水生产。然而&#xff0c;由于缺乏茶玫瑰的参考基因组&#x…

鸿蒙开发(NEXT/API 12)【穿戴设备传感器获取】手机侧应用开发

手机侧应用可以通过Wear Engine获取穿戴设备上的传感器信息&#xff0c;并通过打开、关闭命令控制获取传感器数据。 使用传感器相关接口前&#xff0c;需要向手机侧用户申请获取对应权限的授权 传感器类型申请权限ECG、PPG、HR[HEALTH_SENSOR]人体传感器ACC、GYRO、MAG[MOTIO…

汇编DEBUG程序调用

工具 系统&#xff1a;Windows 11 应用&#xff1a;DOSBox 0.74-3 下载安装教程&#xff1a;本人写的《DOSBox下载安装&#xff08;Windows系统 DOSBox 0.74-3&#xff09;》 https://blog.csdn.net/just_do_it_sq/article/details/142715182?spm1001.2014.3001.5501 相关文…

C++ 算法学习——1.3 深度优先搜索

深度优先搜索&#xff1a;简单讲就是搜到某条路尽头&#xff0c;再掉头回溯搜其他的路。此中重点是尽头的判断&#xff0c;和对走过的路进行标记。 一般采用递归的写法&#xff0c;模板大致如下&#xff1a; DFS(node,visited):if node is in visited:returnadd node to visi…

通用mybatis-plus查询封装(QueryGenerator)

结果如下图所示 java类代码分别如下 1 package com.hdx.contractor.util.mybatis;import com.hdx.contractor.common.user.SecurityUser; import com.hdx.contractor.common.user.UserDetail; import com.hdx.contractor.util.query.oConvertUtils; import lombok.extern.slf…

OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 轻量带屏解决方案之恒玄芯片移植案例 本文章基于恒玄科技BES2600W…

【AI知识点】交叉验证(Cross-Validation)

交叉验证&#xff08;Cross-Validation&#xff09; 是机器学习中常用的一种模型评估方法&#xff0c;用于评估模型的性能和泛化能力。它通过在不同的训练集和验证集上多次训练和测试模型&#xff0c;从而有效地评估模型在未见数据上的表现&#xff0c;帮助防止模型的过拟合和欠…