初级会员
- 积分
- 189
- 金钱
- 189
- 注册时间
- 2019-6-28
- 在线时间
- 27 小时
|
1金钱
如题:我打开了定时器的PWM功能,PWM闪烁正常。但是定时器的5秒定时不准,基本是几毫秒级别的。但是当我把pwm功能屏蔽后,定时器功能就正常了。是不是rtt中通一个定时器不能同时打开定时中断和溢出中断啊!!!!
static rt_thread_t tid1 = RT_NULL;
struct rt_device_pwm *pwm_dev;
rt_device_t hw_dev;
rt_uint32_t period=500000;
rt_uint32_t pulse = 50000;
rt_uint32_t dir;
rt_err_t ret = 0;
rt_uint32_t freq = 10000;
rt_hwtimer_mode_t mode;
rt_hwtimerval_t timeout_s;
int main(void)
{
hw_dev = rt_device_find("timer3");
if(hw_dev!=NULL)
{
rt_kprintf("timer3 find ok\r\n");
}
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open timer3 device failed!\n");
return ret;
}
rt_device_set_rx_indicate(hw_dev, timeout_cb);
rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
mode = HWTIMER_MODE_PERIOD;
rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
timeout_s.sec = 5;
timeout_s.usec = 0;
rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s));
pwm_dev = (struct rt_device_pwm *)rt_device_find("pwm3");
if(pwm_dev!=NULL)
{
rt_kprintf("pwm find ok\r\n");
}
rt_pwm_set(pwm_dev, 2, period, pulse);
rt_pwm_enable(pwm_dev, 2);
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
500,
23, 10);
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
return 0;
}
|
最佳答案
查看完整内容[请看2#楼]
高铁和绿皮车的宽度都一样的,低速时可以共轨道。
但跑300时就没法共轨了。
比如你PWM要输出10Khz,而定时器要定20ms,他们2个没法在一个timer上实现啊。
你是用stm32吗? stm32的每个timer有4个通道,12通道是共用时基的,34通道是共用时基的。
你翻下STM32的参考手册看下是否可以满足你的要求的吧。
以及你之前分别是要求多少,再对比下现在代码,看是否可以改进下。
|