英飞凌AURIX2G系列TC37x——MCAL配置之 PWM(超详细,吐血)

前言
上次写了Port跟Dio相关的内容,虽然有些配置项没那么清晰,但是最重要的其实是思路,这个模块能实现什么样的功能,有哪些接口,跟其他什么模块有关?今天我们来看看PWM的实现。

关联性

即在EB中,除了我们这次主要关注的PWM模块外,还有哪些模块是需要额外配置的?不配置就会出错的?
首先就是Port,PWM总是要通过pin脚输出的,pin脚的输入/输出,输出的复选类型总得配好了,这部分内容见上一篇:英飞凌AURIX2G系列TC37x——MCAL配置之 Port & Dio(Draft版本)
其次是时钟,时钟是来源于GTM?还是CCU6?(有的同学可能就要问了,为什么没有GPT?我目前的理解:EB里只支持这两个,不信你看这个模块的名字:Pwm_17_GTMCCU6),那相关联的这些时钟模块在哪里配置?接下来我们来揭晓——

PWM

General: 主要配一些API的使能,对应在MC-ISAR_TC3xx_UM_Pwm_17_GtmCcu6.pdf中也可查阅
LowPower/PowerStateSupport…后三个container暂且不论,按默认处理。

抓住主要矛盾才是最重要的,不要被不重要的信息挡住去路。

在这里插入图片描述
如果得到的需求period和duty都是需要可调的,那么可以勾上PwmSetPeriodAndDuty项,若只有duty可调,可以只勾选PwmSetDutyCycle,按需勾选。这两项在生成代码中体现在:
在这里插入图片描述
在这里插入图片描述
下面这部分配置项中,重要的是:PwmDutyShiftInTicks,这个选项决定着在调用上述两个函数时,duty这个参数设置的是绝对时钟tick,还是0%-100%的相对时钟tick。其他的我没怎么用到,就按默认配置来了。
在这里插入图片描述

——————**************************************—————

接下来,便是本篇的重头戏:PwmChannel,我们新建一个Channel:
在这里插入图片描述

  • ChannelId: 从0开始递增,没什么好说的

  • PwmAssignedHwUnit: 此处便到了指定时钟源的部分了,指定时钟源是GTM/CCU6

  • PwmDutycycleDefault: 默认占空比,此处设置为0,如果你的需求不是0,则要根据你的占空比算出tick数填进去

  • PwmIdleState:初始电平/默认电平/停止电平

  • PwmPeriodDefault:默认状态下周期tick数

    假设:fpwm = 100MHz,目标频率:fd = 20kHz,则目标period = fpwm/fd = 5000; 若目标频率:fd = 1khz, 则目标period = fpwm/fd = 100000,但由于当时钟源模块为TOM时,此配置项的值要小于0xFFFF,因此要将TOM输出的时钟分频后再计算

在这里插入图片描述 - PwmPolarity:
在这里插入图片描述
简易图示:
在这里插入图片描述

  • PwmShiftValue (0 -> 16777215):此项主要指定当在程序中想要修改duty时,不同的value对应的占空比;
    当General中PwmDutyShiftInTicks 配置为OFF时,0为0占空比,0X8000为100%占空比;
    当PwmDutyShiftInTicks 配置为ON时,0为0占空比,要根据配置项:PeriodDefault为100%占空比,从而算出duty对应的ticks

    在这里插入图片描述

此项配置Channel为哪种模式:
在这里插入图片描述

  • PWM_FIXED_PERIOD: 固定周期,仅占空比可调
  • PWM_FIXED_PERIOD_CENTER_ALIGNED:
    此通道引用一个固定周期的PWM通道,从而产生中央对称式PWM,仅占空比可调
  • PWM_FIXED_PERIOD_SHIFTED: 此通道引用一个固定周期的PWM通道,占空比线性变化,仅占空比可调
  • PWM_VARIABLE_PERIOD: 周期,占空比均可调。

当此PWMchannel的时钟源选择为GTM时,需要在channel中引用所用到的GTM通道,将两者map起来,CCU6同理。
在这里插入图片描述

————————————**************************————————————
下面介绍如何去配置PWM的时钟源
我在使用时采用的GTM的TOM通道,其实也不算我选的,需求里需要的引脚跟GTM-TOM通道是绑定的,因此也不是我想用什么就用什么(手动狗头)
假设,需求里所需要的引脚是:P32.6 输出周期为1khz,占空比默认为0的PWM。

  1. 根据datasheet,发现P32.6为GTM_TOUT141
    在这里插入图片描述

  2. 在TC3xx_Appendix_UM中查到TOUT141对应TOUTSEL17这个选择寄存器中SEL5
    在这里插入图片描述

  3. 索引到相应寄存器的位置,能看到P我们所要配置的pin脚对应TOM1的channel8在这里插入图片描述

  4. 目前为止, 我们已经知道了将要索引的是哪个TOM哪个channel,EB 里打开MCU的hardwareResourceAllocation,打开TOM1,channel8,将其分配给PWM
    在这里插入图片描述

  5. 那么这个TOM通道输出的时钟频率如何确定呢?怎么跟Port连接起来呢?我们打开Mcu/GtmGlobalConfig:
    在这里插入图片描述

  6. 先打开对应的TOM通道,将该通道选择为对应的pin脚
    在这里插入图片描述

  7. 接下来就是时钟,TOM的时钟源我们选择:CMU_FXCLK
    在这里插入图片描述8. 在CMU中,Global Clock Divider对应EB中GTMClockManagementConfig,此处不分频
    在这里插入图片描述
    在FixedClocksetting中选择CMU_GLOBAL_CLOCK_SEL0,FXCLK_SEL选择全局时钟为产生FIXED_CLK的源,而不是上图中CMU_CLKx; 而不同的FX_CLK对应的分频也是固定的。
    若fgtm = 100Mhz, 则FX_CLK0= fgtm/1 = 100Mhz, FXCLK1 = fgtm/16 = 6.25Mhz,由此类推,见图上
    在这里插入图片描述
    9.由于GTM模块,TOM,ATOM等都是属于一个cluster中的,因此我们来看cluster的选择:
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    10.在PWM模块索引GTM channel时,选择GTM的时钟源为FIXED_CLOCKx

    若fgtm = 100Mhz, 则FX_CLK0= fgtm/1 = 100Mhz, FXCLK1 = fgtm/16 = 6.25Mhz 若目标频率为1khz, 则period = fTOM/fdst = 6.25Mhz/1khz = 6250
    到此为止,所有需要配置的地方都已经完成了,只需要在程序中,调用:Pwm_17_GtmCcu6_SetDutyCycle即可。
    调用时要注意的就是,Duty要设置的值的范围,如果好好看这篇,就知道该注意哪里了哦。

### MCUMCAL PWM中断实现方法 在MCU开发过程中,PWM(脉宽调制)广泛应用于多种场景,包括但不限于模拟信号控制、节能和功率控制、通信和数据传输以及音频处理等方面[^1]。对于涉及PWM操作的应用来说,在MCAL层面上理解如何配置和管理PWM相关的中断至关重要。 #### 寄存器级编程基础 由于MCAL层主要负责底层硬件抽象,其核心在于直接操控微控制器内部的各种寄存器来完成特定的任务。针对EVADC这样的外设模块,了解并掌握重要寄存器的功能有助于加速问题解决过程,并提高程序效率[^2]。同样地,当涉及到PWM时,也需要熟悉相应的定时器/计数器寄存器及其位定义。 #### 中断服务例程设计 为了响应由PWM产生的事件(如周期结束),通常会设置一个或多个中断源并与之关联的ISR(Interrupt Service Routine)。下面是一个简单的C语言伪代码示例,展示了如何编写一个基本的PWM ISR: ```c void TIM_PWM_IRQHandler(void){ if(TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET){ // 检查更新中断标志状态 /* 清除TIMx 更新中断待处理位 */ TIM_ClearITPendingBit(TIMx, TIM_IT_Update); // 执行具体的业务逻辑... } } ``` 此函数会在每次PWM波形的一个完整周期完成后被触发执行一次。需要注意的是实际项目中可能还需要考虑其他类型的中断条件,比如捕获比较匹配等。 #### 配置流程概述 - 初始化PWM使用的定时器资源; - 设置所需的频率及占空比参数; - 启用对应的中断通道并将上述编写的ISR链接到该通道上; - 开启全局中断使能开关以便允许CPU接收外部请求; 通过以上步骤即可构建起一套完整的基于MCAL框架下的PWM中断机制解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值