STM32使用RTT的硬件定时器驱动,基本只能用来定时,回调函数回调也是在STM32的超时回调函数中调用。
想用PWM中断,去用PWM设备驱动并没有这个选项。
又想要硬件定时器开启定时,又不想修改设备驱动代码。
可以选择像我这样干。
0.使用CUBEMX生成需要的功能,比如开启PWM并启用中断。或者开启主从定时器等等。
1.先使能硬件定时器,并设置回调函数
2.再把CUBEMX生成的初始化代码安插在最后面。
这样就可以不修改驱动框架,并可以使用回调函数了。
实测PWM中断可以进入,从定时器溢出中断也可以进入。
温馨提示:PWM开启中断的话,pwm频率不要太高。容易卡死其他程序。
/**
[url=home.php?mod=space&uid=2666770]@Brief[/url] PWM初始化函数.
[url=home.php?mod=space&uid=3142012]@param[/url] None.
@retval None.
[url=home.php?mod=space&uid=1902110]@NOTE[/url] None
/
static int PWM_Init(void)
{
rt_err_t ret = RT_EOK;
rt_hwtimerval_t timeout_s; / 定时器超时值 /
rt_device_t hw_dev = RT_NULL; / 定时器设备句柄 /
rt_hwtimer_mode_t mode; / 定时器模式 /
/ 查找定时器设备 /
hw_dev = rt_device_find(HWTIMER_DEV_NAME);
if (hw_dev == RT_NULL)
{
LOG_E("hwtimer sample run failed! can't find %s device!", HWTIMER_DEV_NAME);
return RT_ERROR;
}
/ 以读写方式打开设备 /
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
LOG_E("open %s device failedn", HWTIMER_DEV_NAME);
return ret;
}
/ 设置超时回调函数 /
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/ 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)/
mode = HWTIMER_MODE_PERIOD;
ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
if (ret != RT_EOK)
{
LOG_E("set mode failed! ret is :%d", ret);
return ret;
}
MX_TIM9_Init();
HAL_TIM_Base_Start_IT(&htim9); / 启动TIM9*/
#ifdef IRQ_PRIORITY
struct stm32_hwtimer *tim_device = RT_NULL;
tim_device = rt_container_of(hw_dev, struct stm32_hwtimer, time_device);
HAL_NVIC_SetPriority(tim_device->tim_irqn,IRQ_PRIORITY, 0);
#endif
MX_TIM2_Init();
return ret;
}
原作者:用户名由3_15位
|