高级会员

- 积分
- 581
- 金钱
- 581
- 注册时间
- 2019-8-6
- 在线时间
- 132 小时
|
15金钱
本帖最后由 lyy26655 于 2021-1-28 09:46 编辑
又是本萌新,想请问下各位大佬,查了相关资料都有点语焉不详,现在F103设定的TIM3一秒进一次中断,然后 if(HAL_TIM_Base_Start_IT(&htim3)!=HAL_OK)
{
while(1);
}
但是while(1)里面的代码好像并没有执行,是因为1s太短了吗?但如果不这么写就会一直执行while(1)里的代码,没有必要这么频繁查询传感器数据
上面这个已解决
然后一直没完全确定一个答案,定时器每进一次中断应该就会触发一次HAL_TIM_PeriodElapsedCallback,那触发之后HAL_TIM_PeriodElapsedCallback是不是必须完全执行完才能执行下一次定时器中断?我在网上查的是定时器中断不会等待HAL_TIM_PeriodElapsedCallback执行完,但我现在的代码是这样的:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instrance == htim3.Instrance)
{
static uint16_t i=0;
static uint16_t j=0;
i++;
if(i>10)/*相当于就是11s执行一次*/
{
i=0;
dosomethingAAA;
}
j++;
if(j>15)
{
j=0;
dosomethingBBB;
dosomethingCCC;
}
}
那如果我的代码是这样的,定时器中断又是1s一次,这里面的执行关系是怎么样的呢?
(1)同时这里想问下,为什么写成
if(i==10)
{
i=0;
dosomething; }
dosomething就不执行呢?感觉没写错呀
(2)如果 dosomethingBBB;
dosomethingCCC;
代表用同一个串口发送信息,两个函数之间执行没有延时,它就不会执行,但回调函数里面肯定是不能加延时的,但写成这样它也不执行,我要疯了@@
j++;
if(j>15)
{
dosomethingBBB;
if(j>17)
{
j=0;
dosomethingCCC;
}
}
如果各位大神有好的思路也可以说一下,非常感谢!
|
最佳答案
查看完整内容[请看2#楼]
设几个全局变量作为标志位,定时器中断判断设置标志,主程序根据标志位处理,这种方式好一点,不要在中断里做过多的事情。
|