【S32K3 RTD LLD篇4】K344 EMIOS PWM+TRIGMUX+LCU

【S32K3 RTD LLD篇4】K344 EMIOS PWM+TRIGMUX+LCU

  • [1. 工程模块搭建](#1. 工程模块搭建)
    • [1.1 工程配置](#1.1 工程配置)
      • [1.1.1 Pins](#1.1.1 Pins)
      • [1.1.2 clocks](#1.1.2 clocks)
      • [1.1.3 Peripherals](#1.1.3 Peripherals)
    • [1.2 代码实现](#1.2 代码实现)
  • [2. 测试结果](#2. 测试结果)

最近学习了S32K344的EMIOS生成一路PWM, 尝试过上升计数,上升下降计数方式改变频率和占空比,还有输入PWM波捕获等功能,但是不过瘾,还想学习LCU,把一路PWM给输出成两路互补的PWM,不过由于LCU的输入信号不支持引脚直接输入,所以顺势学习了TRIGMUX,TRIGMUX可以把多种的内部信号给转成另外的内部信号。所以,本文主要以如何实现在S32DS RTD4.0.0 LLD,S32K344-EVB板子上使用EMIOS生成一路4KHz,50%占空比的PWM输出,并且把这路PWM接入到TRIGMUX,然后连接到LCU IN0,再通过逻辑单位输出两路互补的PWM到LCU0 OUT0,OUT1引脚,实现功能如下:


图1

1. 工程模块搭建

从上述框图可以看到,组成块主要有三块:eMIOS,TRGMUX, LCU,那么,到了S32DS K344 RTD LLD工程中,又分为哪些模块呢?主要还是分为Pins,Clocks,Peripherals。只是在Peripherals中需要添加的模块有:BaseNXP, Emios_Mcl_lp_1, Emios_Pwm_1, Lcu_Ip, Siul2_Port_1, Trgmux_Ip.

本文的代码,可以基于S32K344 RTD 4.0.0 现有的Emios_Pwm_Example_S32K344基础,然后删除不必要的代码和配置,添加上自己需要的模块和代码,工程名可以改为自己需要的名称,下面分别给出具体的配置以及代码情况。

1.1 工程配置

1.1.1 Pins

本文使用到的引脚主要有3个,一个Emios0_ch4自己原始输出的PWM波,两个LCU输出一对互补的PWM波,LCU0_OUT0和emios0_ch4同样,LCU0_OUT1和emios0_ch4反向。引脚情况添加如下:


图 2

1.1.2 clocks

对于时钟,保持原有RTD4.4.0 的Emios_Pwm_Example_S32K344工程默认配置即可,主要关注下emios的时钟源频率,这样可以去计算需要PWM频率所对应的周期counter值。可以看到,EMIOS_CLK默认配置的是48Mhz:


图 3

1.1.3 Peripherals

对于外设这块,需要添加的内容较多,主要配置的外设模块涉及到:

Emios_Mcl_lp_1: 配置emios通道,bus模式,周期counter,分频系数等。

Emios_PWM_1: 配置具体通道的ID,模式选择, PWM时钟周期以及占空比,时钟分频系数等。

Siul1_Port_1: 添加三个引脚的portpin

Trgmux_lp: 配置逻辑触发单元,硬件输入输出通道

Lcu_Ip: 配置LCU逻辑单元,逻辑输入,逻辑输出,控制值情况。

1.1.3.1 Emios_Mcl_lp_1配置

预想配置的PWM的周期为4KHZ,50%占空比,因为EMIOS0的时钟源为48MHZ,所以在不做分频的情况下,一个周期的counter个数是:48000000/4000=12000。对于Emios_Mcl_Ip_1的配置情况如下:


图 4

这里选择的emios channel 是EMIOS_CH_23,总线模式走的MCB_UP_COUNTER, ChTypeX类型。

1.1.3.2:Emios_Pwm_1配置

一个周期是12000 counter,那么50%占空比的counter就是一半,6000。对于Emios_Pwm_1的配置如下:


图 5

通道对应的是EMIOS0_CH4, 模式选择的是OPWMB,即Output Pulse Width Modulation Trigger模式,counter bus走的是counter Bus A。周期是12000 counter,占空比6000 counter,正好是50%。这里注意的是pwmEmiosBusRef选择的这个路径:

/Emios_Mcl_Ip_1/EmiosMcl/EmiosCommon_0/EMIOS_0_MasteBus0

就是前面的Emios_Mcl_lp_1配置的情况。

1.1.3.3:Siul1_Port_1配置

添加三个PortPin,主要需要输入正确的对应引脚的Mscr,具体port引脚的mscr可以在K344RM的附件表格IOMUX中查找到。这里三个引脚的配置情况如下:


图 6


图 7


图8

1.1.3.4: Trgmux_lp 配置
Trigmux的配置,主要是选择输入为EMIOS_CH4,输出为LCU0_INPUT0. 这样就可以把EMIOS和LCU进行连接:


图 9

1.1.3.5:Lcu_Ip 配置

LCU的几个关键配置如下:


图 10


图11

输出有两个,需要输出一对互补的PWM波形:


图 12


图 13

这里的output LUT control得出的理论是这样的:


图 14

实际上就是使用了一组的I0,然后输出到O0,O1,O0=I0, O1= I0取反。

所以最后得出O0的控制值是0XAAAA,O1的控制值是0X5555.

1.2 代码实现

需要添加对应模块的头文件,以及给相应外设给与配置:

c 复制代码
#include "Clock_Ip.h"
#include "Emios_Pwm_Ip.h"
#include "Emios_Mcl_Ip.h"
#include "Siul2_Port_Ip.h"
#include "Trgmux_Ip.h"
#include "Lcu_Ip.h"
#define NUM_BLINK_LED     (uint32)10U
#define DELAY_TIMER       (uint32)5000000U
#define INSTANCE_0        (uint8)0U
#define CHANNEL_4         (uint8)4U
#define CHANNEL_23        (uint8)23U

Lcu_Ip_SyncOutputValueType PWM_OutputList[4] = {
		                                        {0, LCU_IP_OUTPUT_DISABLE},
								 {1, LCU_IP_OUTPUT_DISABLE},
								 {2, LCU_IP_OUTPUT_DISABLE},
								 {3, LCU_IP_OUTPUT_DISABLE}
                                                };
int main (void)
{
    uint8 num_blink = 0U;
    /* Initialize clock */

    Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);

    /* Initialize all pins using the Port driver */
    Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_VS_0, g_pin_mux_InitConfigArr_PortContainer_0_VS_0);

    /* Initialize Emios_Mcl driver */
    Emios_Mcl_Ip_Init(INSTANCE_0, &Emios_Mcl_Ip_0_Config_VS_0);


    /* Initialize Emios_Pwm_Ip driver */
    Emios_Pwm_Ip_InitChannel(EMIOS_PWM_IP_VS_0_I0_CH4_CFG, &Emios_Pwm_Ip_VS_0_I0_Ch4);


    Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);
    Lcu_Ip_Init(&Lcu_Ip_xLcuInitPB);
    PWM_OutputList[0].Value = LCU_IP_OUTPUT_ENABLE;
    PWM_OutputList[1].Value = LCU_IP_OUTPUT_ENABLE;
    Lcu_Ip_SetSyncOutputEnable(&PWM_OutputList[0U], 4);

    /* Set new period for the channels that used external counter bus */
    Emios_Mcl_Ip_SetCounterBusPeriod(INSTANCE_0, CHANNEL_23, 12000);
    
    /* Setup new duty cycle to the pin*/
    Emios_Pwm_Ip_SetDutyCycle(INSTANCE_0, CHANNEL_4, 6000);


    while(1)
    {

    }

}

2. 测试结果

分别测试如下3个引脚的波形,理想情况,PTB16波形为4Khz,50%占空比,PTD3和PTB16一样,PTD2和PTD3互补:

CH1: PTB16:emios_ch4

CH4: PTD3 : lcu_o0

CH3: PTD2: lcu_o1


图 15

可以看到,实际测试的波形,频率, 占空比,互补情况都是满足要求的,另外上一张图说明下TRIGMUX+LCU的硬件延时情况:


图 16

可以看到,实际的TRIGMUX输入,到LCU输出互补的PWM,之间的延迟只有60ns,是不是跟随性还是很漂亮的硬件IP功能?

相关推荐
不能只会打代码2 小时前
51单片机从入门到精通:理论与实践指南(一)
单片机·嵌入式硬件·51单片机
石板小湫2 小时前
34 基于单片机的指纹打卡系统
单片机·嵌入式硬件
Shaun_青璇3 小时前
STM32的AFIO讲解
stm32·单片机·嵌入式硬件·mcu·物联网
LightningJie4 小时前
STM32中I2C总线中,允许从机控制SCL总线吗?
stm32·单片机·嵌入式硬件
浅陌pa5 小时前
18:(标准库)DMA二:DMA+串口收发数据
c语言·stm32·单片机·嵌入式硬件
嗯? 嗯。5 小时前
电烙铁焊接STM32芯片、贴片元器件、手册指南!!!
stm32·单片机·嵌入式硬件
打你个大西瓜️5 小时前
单片机知识总结(完整)
数据库·单片机·mongodb
楚灵魈6 小时前
[STM32]从零开始的STM32 FreeRTOS移植教程
stm32·单片机·嵌入式硬件
Shaun_青璇6 小时前
EXTI配置流程 含中断延时消抖点亮小灯
stm32·单片机·嵌入式硬件·mcu·物联网
liyinuo20177 小时前
如何使用GCC手动编译stm32程序
c语言·arm开发·stm32·单片机·嵌入式硬件