层S32K3 eMIOS:PWM输出与输入捕获的MCAL层使用指南

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm输出输入捕获
对本文的补充介绍请参考:S32k3 eMios输入捕获(SAIC模式)测量信号周期、频率、占空比

1.Abbreviation

PWM Pulse Width Modulation
FlexIO Flexible I/O
eMIOS Enhanced Modular IO Subsystem
PCMC Power Conversion and Motor Control
LCU Logic Control Unit
UC Unified channel

2.eMios简介

S32K3中有四个模块都能生成PWM,分别是eMIOS、FlexIO、PCMC、LCU。

2.1.简介:

K344有3个instance,每个instance24个通道,16位的timer,265分频的全局分频器和8分频的本地分频器,不同型号其配置及差异如下如所示。

由于每个instance的通道比较多(24),因此将其分成了4种type:X/Y/G/H。每个type具有的功能如下图所示。(X表示具有此项功能)


上图中带buffered的功能就是指在下一个周期生效。比如MC和MCB,MC是一个计数器,修改后立即生效,MCB也是计数器,但是在修改后的下一个周期生效。
各个通道对应的type如下图所示,注意type X和G具有自己的timer(下图中灰色部分)。

如何选择通道:
根据需求在Table237中寻找相应的type,根据type在table238中找相应的通道。

2.2.Counter bus

如下图所示,channel 0/8/16提供bus B/C/D,为8个一组的channel提供counter;channel 22提供Second global counter bus F,channel 23提供global counter bus A。
时钟源为system clock。

下图为channel、counter、type一览表图:

2.3.Feature Introduction

UC = Unified channel

2.4.Unified Channels(UC)

2.4.1.Overview

每个UC包含如下内容:

  • 两个双数据缓冲器,An和Bn,能同时实现输入捕获和输出比较。
  • 两个比较器,A和B,其值同An和Bn中的值进行比较。
  • 一个内部的counter(CNTn[C])运行在除GPIO的所有模式。
  • 一个状态寄存器UC Status n(S0 – S23),标记输入捕获和匹配事件,指示标记溢出和溢出,并显示输入和输出引脚状态。
  • 一个控制寄存器,UC Control n(C0 – C23)
  • 使用一个UC要操作如下内容:

  • 选择UC的模式(GPIO/SAIC/IPWM/OPWFMB/OPWMT等)
  • 操作counter bus提供时基
  • 确定时钟的分频系数
  • 选择可以通过输入滤波器的最小输入脉冲宽度(以滤波器时钟周期为单位)
  • 选择检测的边沿(上升、下降、双边沿)
  • 四个输出禁用输入信号(Cn[ODISSL])中的哪一个用于禁用输出
  • 对于除GPIO之外的所有输出模式,是否禁用输出触发器(Cn[ODIS])
  • 2.4.2.UC block diagram

    2.4.3.通道中断和DMA分配

    注意:不是所有emios通道都有DMA,因此需要用DMA时,要注意通道选择。

    2.4.4.模式

    EMIOs有多种模式,如下图所示

    其中与pwm输出相关的模式为:

    2.4.4.1.OPWMB

    Output PWM Buffered mode
    普通pwm的输出常用OPWMB模式

    前边沿和后边沿都可以自由设置。
    A1用来设置前边沿,B1用来设置后边沿。当比较器达到A1的值时,引脚输出Edge Polarity的电平值;当比较器达到B1的值时,引脚输出与edge polarity相反的电平值。
    在A1/B1的影子寄存器A2/B2中写值后,需要手动更新,若不调用更新API,则写入的新值不会生效,调用更新API后,当前周期立即生效。

    2.4.4.2.OPWFMB

    Output Pulse Width and Frequency Modulation Buffered mode

    可将此模式理解为一种边沿对齐模式,周期占空比都可调。
    由图可知,duty cycle是由A1寄存器决定的,当counter到达A1的值时,引脚的输出电平就改变为我们配置的edge polarity的极性(高或者低),A2位A1的影子寄存器,我们设置A2后将在下一个周期在A1中生效。
    Period由B1决定。

    2.4.4.3.OPWMCB

    Center Aligned Output PWM with Dead Time Insertion Buffered mode

    中心对齐的带死区插入的模式,需要用到两个counter。
    要实现死区插入功能,还需要结合LCU模块才行。

    2.4.4.4.OPWMT

    Output PWM with Trigger mode

    前边沿设置后就不能变了,后边沿可以自由设置,不受前边沿影响,可以跨越周期。Trigger可以在周期内任意位置产生。

    2.4.4.5.SAIC

    一个捕获上升沿或者下降沿的模式,既可以使用internal counter,也可以使用模块的counter,捕获的结果置于A2寄存器中。

    2.4.4.6.IPWM

    输入脉冲宽度测量,捕获到上升沿时,将counter保存在B2寄存器中,捕获到下降沿时,将counter的值保存在A2寄存器中,通过一个中断,就可以获得脉冲宽度。注意,若果计数器超出了自身周期,需要在计算结果上加上一个周期。
    B1中保存的是上一轮B2中的counter值

    2.4.4.7.IPM


    通过只捕获上升沿或者只捕获下降沿的方式来测量周期。

    2.4.4.8.MC

    生成时基,没有buffer的功能,改变周期值,在当前周期生效

    2.4.4.9.MCB

    有buffer功能的时基,通常用来生产master buses,注意此模式的即时起点是从1开始的,MC模式是从0开始的。

    3.Pwm输出

    3.1.EB配置

    3.1.1.模块依赖

    3.1.2.PORT配置

    在PortContainer中添加做为pwm输出的引脚,选择其对应的引脚号和引脚模式。
    请添加图片描述

    3.1.3.MCU配置

    使能用到的外设模块,如EMIOS_2等。

    Emios时钟为system clock,其实就是下图中的core clock,如下图所示。

    3.1.4.Platform配置

    使能channel对应的中断。

    配置回调函数

    回调函数在文件Emios_Mcl_Irq.c中,中断处理函数与通道对应关系如下:
    EMIOS0_5_IRQ
    – PWM_EMIOS_0_CH_0_ISR_USED
    – PWM_EMIOS_0_CH_1_ISR_USED
    – PWM_EMIOS_0_CH_2_ISR_USED
    – PWM_EMIOS_0_CH_3_ISR_USED
    EMIOS0_4_IRQ
    – PWM_EMIOS_0_CH_4_ISR_USED
    – PWM_EMIOS_0_CH_5_ISR_USED
    – PWM_EMIOS_0_CH_6_ISR_USED
    – PWM_EMIOS_0_CH_7_ISR_USED
    EMIOS0_3_IRQ
    – PWM_EMIOS_0_CH_8_ISR_USED
    – PWM_EMIOS_0_CH_9_ISR_USED
    – PWM_EMIOS_0_CH_10_ISR_USED
    – PWM_EMIOS_0_CH_11_ISR_USED
    EMIOS0_2_IRQ
    – PWM_EMIOS_0_CH_12_ISR_USED
    – PWM_EMIOS_0_CH_13_ISR_USED
    – PWM_EMIOS_0_CH_14_ISR_USED
    – PWM_EMIOS_0_CH_15_ISR_USED
    EMIOS0_1_IRQ
    – PWM_EMIOS_0_CH_16_ISR_USED
    – PWM_EMIOS_0_CH_17_ISR_USED
    – PWM_EMIOS_0_CH_18_ISR_USED
    – PWM_EMIOS_0_CH_19_ISR_USED
    EMIOS0_0_IRQ
    – PWM_EMIOS_0_CH_20_ISR_USED
    – PWM_EMIOS_0_CH_21_ISR_USED
    – PWM_EMIOS_0_CH_22_ISR_USED
    – PWM_EMIOS_0_CH_23_ISR_USED
    对于emios1和emios2的instance同emios0. 所有的中断回调函数及其相应的通道对应关系在Emios_Mcl_Ip_Irq.h文件中,EMIOS2_4_IRQ不仅处理pwm通道的中断,还处理了emios的ocu、icu、gpt的中断相应,如下图所示:

    3.1.5.Mcl配置

    在general中使能emios

    emiosCommon中配置:

    1.选择instance
    2.使能后,Debug模式下暂停counter
    3.使能时基,用到counter功能就一定要使能
    4.全局的预分频器。
    Emios Master Buses中最多能配置5个bus,分别是channel0/8/16/22/23的counter,如下图所示:

    某一个bus的配置如下:

    1.选择产生counter的channel。
    2.选择counter的计数方式,向上还是向下等。如果是带buffer的功能,比如OPWMB,就需要选择MCB的Master Bus Mode。
    3.配置周期,此处的周期需与pwm中的周期一致
    4.起始偏移
    5.Bus的分频器
    6.这是一个可选的分频器
    7.允许debug模式
    8.如果勾选PWM exclusive access,表示这个master bus只能由pwm模块使用,不能被其他模块使用(如ICU模块、OCU模块则不能使用)。

    3.1.6.Pwm模块配置

    Pwm模块抽象层次图:

    3.1.6.1.PwmEmios硬件配置:

    Instance选择

    Channel配置

    1.选择在前边沿还是后边沿置位flag
    2.选择counter bus,选择在Mcl模块中master bus中配置的
    3.Pwm的极性,作用见2.1.4.3.3节
    4.选择flag置位后的相应操作,产生中断或者DMA请求,这儿选择INTERRUPT_REQUEST,前面Platform中配置的相关中断才有效,当然pwm输出并不需要中断,中断的主要作用还是在回调函数中进行一些操作,单纯产生pwm波,我们可以在这把中断disable掉。
    5.占空比,一般填0,这样不会产生pwm及其中断,等需要使用在调用api,写入占空比
    6.周期,要与逻辑通道及Mcl中的周期配置一致,仅在OPWFMB模式下有用。

    3.1.6.2.PwmChannel逻辑通道配置

    1.逻辑通道,自动生成的,在代码中用。
    2.选择硬件配置作为参考
    3.配置周期是否可变,打开可变,不打开则不可变
    4.配置周期的单位为tick
    5.周期,要跟硬件中的和Mcl中的配置一致。这儿相当于40000个tick,每个tick的时间为core clock分之一,相乘得到周期的具体时间。
    6.默认占空比,一般填0,这样MCU的pwm初始化完成后既不生成pwm也不产生中断,等我们需要使用pwm的时候,调用设置占空比的api来使能。
    7.极性,作用见2.1.4.3.3节
    8.空闲时的电平状态。
    9.每产生一个周期的pwm波,就会进一次这个回调函数。
    10.参考时钟

    3.2.S32DS配置

    3.2.1.模块依赖

    3.2.2.头文件

    3.2.3.初始化

    调用Pwm_SetDutyCycle();后就可以直接产生pwm了,准确的说是pwm初始化后就已经产生了,只是我们配置的占空比为0,在此调用api来产生我们想要的占空比。

    3.2.4.API

  • Pwm_SetDutyCycle(ChannelNumber, DutyCycle)
  • 周期为32768,是一个定值,具体要输出百分之多少的占空比,用32768做分母来算。

  • Pwm_EnableNotification(PwmChannel_0, PWM_FALLING_EDGE);
    使能回调函数,第一个阐述为逻辑通道,第二个参数选择在上升沿还是下降沿产生中断。

  • Pwm_SetOutputToIdle(ChannelNumber)
    关闭pwm输出

  • Pwm_GetChannelState()
    返回channel的duty cycle参数

  • Pwm_SetDutyCycle_NoUpdate()

  • Pwm_SetPeriodAndDuty_NoUpdate()
    这两个调用后都没生效,需要调用

  • Pwm_SyncUpdate()后生效配置

  • Pwm一旦初始化完成后就跑起来了,没有start或者begin这样Api。一般将Pwm的占空比设置为0或者1,中断会自动关闭,因此建议配置,后期通过调用Pwm_SetDutyCylce()或者Pwm_SetPeriodAndDuty()来恢复或者停止pwm

    3.3.注意事项

    Pwm的输出可以用中断的方式(如果你需要在每个边沿处进行一些操作),当然也可以不用中断的方式。当我们从用中断方式转为不用中断的模式时,除了去Platform里面把相关的中断和中断回调关掉,还要记得关下面这个,否则EB能过,代码编译却报错

    4.输入捕获

    4.1.EB配置

    4.1.1.模块依赖

    4.1.2.Port配置

    4.1.3.Mcu配置使能外设:

    对应eMIOS instance

    如果要使用DMA功能,则需要打开相应的外设时钟,既要打开总开关,也要打开通道的开关。

    4.1.4.Platform配置

    emios中的icu的中断与其通道的对应关系如下表,来源于Mcal_Plugins/Mcl_TS_T40D34M1010R0/Include中的Emios_Mcl_Irq.h中
    EMIOS0_5_IRQ
    – ICU_EMIOS_0_CH_0_ISR_USED
    – ICU_EMIOS_0_CH_1_ISR_USED
    – ICU_EMIOS_0_CH_2_ISR_USED
    – ICU_EMIOS_0_CH_3_ISR_USED
    EMIOS0_4_IRQ
    – ICU_EMIOS_0_CH_4_ISR_USED
    – ICU_EMIOS_0_CH_5_ISR_USED
    – ICU_EMIOS_0_CH_6_ISR_USED
    – ICU_EMIOS_0_CH_7_ISR_USED
    EMIOS0_3_IRQ
    – ICU_EMIOS_0_CH_8_ISR_USED
    – ICU_EMIOS_0_CH_9_ISR_USED
    – ICU_EMIOS_0_CH_10_ISR_USED
    – ICU_EMIOS_0_CH_11_ISR_USED
    EMIOS0_2_IRQ
    – ICU_EMIOS_0_CH_12_ISR_USED
    – ICU_EMIOS_0_CH_13_ISR_USED
    – ICU_EMIOS_0_CH_14_ISR_USED
    – ICU_EMIOS_0_CH_15_ISR_USED
    EMIOS0_1_IRQ
    – ICU_EMIOS_0_CH_16_ISR_USED
    – ICU_EMIOS_0_CH_17_ISR_USED
    – ICU_EMIOS_0_CH_18_ISR_USED
    – ICU_EMIOS_0_CH_19_ISR_USED
    EMIOS0_0_IRQ
    – ICU_EMIOS_0_CH_20_ISR_USED
    – ICU_EMIOS_0_CH_21_ISR_USED
    – ICU_EMIOS_0_CH_22_ISR_USED
    – ICU_EMIOS_0_CH_23_ISR_USED
    对于emios1和emios2的instance同emios0. EMIOS0_0_IRQ不仅处理ICU通道的中断,还处理了emios的OCU、PWM、GPT的中断相应,如下图所示:

    根据上表,对中断进行相关配置:
    使能相应的中断

    配置中断处理函数

    若要使用DMA功能,则需使能相应的DMA中断,配置中断回调函数。
    中断使能:

    中断回调函数:
    此函数位于Mcal_Plugin/Mcl_TS_TXXXXXX/src/Dma_Ip_Irq.c中

    4.1.5.Mcl配置

    打开时基,配置相应的分频:

    Master Buses配置:

    1.能作为Mater bus的通道只有0/8/16/22/23,详见2.1.2节
    2.不同的IcuSubModeforMeasurment有不同的Master bus要求,根据实际情况选择。绝大部分模式要求使用MCB_UP_COUNTER.
    3.作为mater bus来使用时的default period必须填65535.
    4.使能后,Debug模式下回暂停counter
    5.使能后这个counter仅供pwm使用

    对于signal measure模式,若使用DMA来获取数据,需要在这儿配置DMA的通道,但是不是所有emios通道都支持DMA,详见2.4.3节
    使能DMA

    配置DMA instance

    配置DMA channel

    2处先不填,等配置完了点生产代码,会报错,报错里面会告诉你怎么填。

    Global配置:

    Transfer配置:

    4.1.6.Icu配置

    4.1.6.1.硬件通道配置

    4.1.6.2.IcueMios channel配置
    填写对应的instance

    配置channel

    1.选择bus,可以选择internal counter,也可以选择在Mcl的master buses中配置的bus。Internal counter只有type X/G有,详见2.1.2节,type X/Y必须要使用master buses,若使用master buses,则需要在2处选择相应的参考。
    2.根据需求,选择Mcl中配置的bus
    3.测量模式,有SAIC,IPW,IPWM,不同见文档或EB中的解释。
    使用signalMeasur这个模式时是否使用中断,对于signalMeasure这个模式,目前要么使
    4.用中断的方式,即不勾选这个选框,要么使用DMA的模式,在逻辑通道中使能DMA,并在MCL模块中配置DMA的相关设置。

    4.1.6.3.逻辑通道配置

    注意:
    当我们的测量模式选择edge counter时,对于ICU模块是通过MCB模式实现的,因此只有Type X和Type G这两类通道支持。(来自NXP AE)
    对于signal measure模式,若我们使用DMA来获取测量数据,需勾选第三个选项,使能DMA,并在MCL中进行DMA的通道配置。

    对于信号测量模式,注意下面的选项,emios通道中选择SAIC模式,对应逻辑通道中必须要选择ICU_DUTY_CYCLE的测量模式才行,图中2所示。

    1中的边沿选择会影响测得的占空比的值,正常情况下选择rising_edge,结果就是我们要的占空比(高电平时间),如果选falling_edge,结果则正好相反,是低电平的时间,若果选both_edge,结果与rising_edge的结果一致。

    4.2.S32DS配置

    4.2.1.模块依赖

    4.2.2.头文件

    4.2.3.初始化

    各个模块的初始化

    信号测量不支持回调函数,获取结果要等测量完成后再去获取,只能轮询,但是轮询频率不能过高,否则出错

    4.2.3.1.边沿计数模式

    使能边沿计数(对于配置为edge count的通道)

    调用相应的api获得边沿计数的个数:

    4.2.3.2.占空比、周期测量模式

    在EB中配置为SIGNAL_MEASUREMENT模式后,代码中需要调用如下api开始测量

    不管是使用DMA的模式还是中断的模式,都需要在代码的应用层用轮询的方式来获取,因为SIGNAL_MEASUREMENT模式没有提供回调函数,这个后期EB配置工具应该会优化。

    Icu_DutyCycleType icuDutyResult;

    icuDutyResult.ActiveTime = 0;
    icuDutyResult.PeriodTime = 0;

    typedef struct
    {
    Icu_ValueType ActiveTime; /< @brief Low or High time value. */
    Icu_ValueType PeriodTime; /
    < @brief Period time value. */
    } Icu_DutyCycleType;

    5.总结

    这里面小细节很多,稍不注意就会出错,一定要一步一步的来。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 层S32K3 eMIOS:PWM输出与输入捕获的MCAL层使用指南

    发表评论