在线时间4 小时
UID3942499
注册时间2023-9-23
NXP金币0
该用户从未签到
新手上路
- 积分
- 45
- 最后登录
- 2023-12-5
|
使用sdk中的ftm_pwm时,我们肯定需要先初始化ftm,即调用FTM_DRV_Init函数。这个函数需传入三个参数,其中state为输出驱动的状态的结构体。
如果不出意外的话,我们后面调用pwm相关的其他函数并不需要用到这个输出的结构体,所以我们很容易把他忽略。
但是,这个state结构体参数,在我们使用pwm的周期内,必须保证其保持在内存中(定义为静态变量).否则,在调用其他pwm函数时,可能会出错。
- <div>/*!</div><div> * @brief Initializes the FTM driver.</div><div> *</div><div> * @param[in] instance The FTM peripheral instance number.</div><div> * @param[in] info The FTM user configuration structure, see #ftm_user_config_t.</div><div> * @param[out] state The FTM state structure of the driver.</div><div> * @return operation status</div><div> * - STATUS_SUCCESS : Completed successfully.</div><div> * - STATUS_ERROR : Error occurred.</div><div> */</div><div>status_t FTM_DRV_Init(uint32_t instance,</div><div> const ftm_user_config_t * info,</div><div> ftm_state_t * state);</div>
复制代码
我就是因为在开始时,只在初始化函数调用位置定义了一个局部变量,然后程序执行其他任务后,再执行pwm占空比调整函数时,出现无法调整问题。最初是以为其他功能和pwm有冲突,找了好久问题。
最后发现,sdk源码中,其有个ftmStatePtr集合,是直接保存了我们传入的结构体的指针。
- status_t FTM_DRV_Init(uint32_t instance,
- const ftm_user_config_t * info,
- ftm_state_t * state)
- {
- ...
复制代码
当调用FTM_DRV_UpdatePwmChannel函数更新占空比时,会从ftmStatePtr集合中取出我们前面传入的指针,获取ftm的状态。如果此时指针指向的位置已经被覆盖,那状态就会出错。
- status_t FTM_DRV_UpdatePwmChannel(uint32_t instance,
- uint8_t channel,
- ftm_pwm_update_option_t typeOfUpdate,
- uint16_t firstEdge,
- uint16_t secondEdge,
- bool softwareTrigger)
- {
- ...
- <font color="#ff0000"> ftm_state_t * state = ftmStatePtr[instance];</font>
- status_t retStatus = STATUS_SUCCESS;
- /* Get the newest period in the MOD register */
- ftmPeriod = FTM_DRV_GetMod(ftmBase);
- /* Check the mode operation in FTM module */
- <font color="#ff0000"> if (state->ftmMode == FTM_MODE_CEN_ALIGNED_PWM)
- {
- ftmPeriod = (uint16_t)(ftmPeriod << 1U);
- }
- else if (state->ftmMode == FTM_MODE_EDGE_ALIGNED_PWM)
- {
- ftmPeriod = (uint16_t)(ftmPeriod + 1U);
- }
- else
- {
- retStatus = STATUS_ERROR;
- }</font>
复制代码
|
|