打印
[技术问题解答]

KL25 PIT,ADC中断的问题

[复制链接]
2077|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyriz|  楼主 | 2015-4-7 11:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ADC, pi, UART, ic, vi
你好!我碰到一个PIT,ADC中断的问题,如下:
1. 单独开PIT0或者ADC中断的时候都很正常,PIT0的中断周期是1S,ADC采用的是软件开启,连续触发;
2. 两个中断同时打开,默认优先级,这时候只能进ADC中断;
3. 两个中断同时打开的时候,PIT的优先级为默认,ADC的优先级设为2(NVIC_SetPriority(ADC0_IRQn, 2);),运行大概5秒钟左右,就会死机,或者只有ADC中断,PIT中断进不去了。我中断服务程序里面都有关、开中断的操作。
服务程序:
void PIT_ISR(void)
{
    NVIC_DisableIRQ(PIT_IRQn);
    GPIO_ToggleBit(HW_GPIOC, 5);
    count++;
   
    //UART_WriteByte(HW_UART2,count);
    NVIC_EnableIRQ(PIT_IRQn);
}

void ADC_ISR(void)
{
    NVIC_DisableIRQ(ADC0_IRQn);
    count2++;
    UART_printf(HW_UART2,"ADC conversion result is :%d\n",ADC_ReadValue(HW_ADC0, kADC_MuxA));
    UART_printf(HW_UART2,"PIT interrupt count is :%d\n",count);
    UART_printf(HW_UART2,"ADC0 interrupt count is :%d\n",count2);
    //NVIC_ClearPendingIRQ(ADC0_IRQn);
    DelayMs(10);
    NVIC_EnableIRQ(ADC0_IRQn);
}

求指教啊!谢谢!


相关帖子

沙发
FSL_TICS_ZJJ| | 2015-4-7 13:41 | 只看该作者
把你在中断中打印的程序全部去掉,还有ms延时,这个是非常占用时间的。
如果你在ADC中断中,而且中断服务函数执行时间过长,并且进入的中断的频率还很高,这个肯定会导致你的PIT中断进不去。
原因是这样的:
ADC的中断优先级是高于PIT中断的,ADC的服务函数执行时间过长,等你出来的时候,下一次的ADC中断紧接着又进来,这样就导致PIT的中断永远都被ADC中断抢占,从而导致PIT中断进入失败。

使用特权

评论回复
板凳
flyriz|  楼主 | 2015-4-7 14:53 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-4-7 13:41
把你在中断中打印的程序全部去掉,还有ms延时,这个是非常占用时间的。
如果你在ADC中断中,而且中断服务函 ...

默认是不是全为0?在这个情况下,优先级是按下面这个表从高到低么?

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-4-7 15:04 | 只看该作者
本帖最后由 FSL_TICS_ZJJ 于 2015-4-9 09:27 编辑
flyriz 发表于 2015-4-7 14:53
默认是不是全为0?在这个情况下,优先级是按下面这个表从高到低么?

默认就是这个优先级情况,0最高。
其实,你设置优先级,并不是整体打乱优先级,
而是4个一组,组内设置优先级,

举个例子,图中,FTFA的优先级比PMC高,你可以通过设置优先级,使PMC高于FTFA,这个是四个内的设置,也就是FTFA前面的数字1,四个1为一组。
最最关键的原因,你的ADC服务函数执行时间太长,中断服务函数要越短越好。

使用特权

评论回复
5
flyriz|  楼主 | 2015-4-7 15:14 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-4-7 15:04
默认就是这个优先级情况,0最高。
其实,你设置优先级,并不是整体打乱优先级,
而是4个一组,组内设置优 ...

非常感谢,太详细了!

使用特权

评论回复
6
FSL_TICS_ZJJ| | 2015-4-7 15:52 | 只看该作者
flyriz 发表于 2015-4-7 15:14
非常感谢,太详细了!

非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决.

使用特权

评论回复
7
flyriz|  楼主 | 2015-4-7 16:47 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-4-7 15:52
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决. ...

还有一个问题,

我看到上面这里,优先级是由一个字节的6、7位决定的,那么我写程序的时候是写0,1,2,3呢?还是写0,64,128,192?

使用特权

评论回复
8
FSL_TICS_ZJJ| | 2015-4-8 10:14 | 只看该作者
flyriz 发表于 2015-4-7 16:47
还有一个问题,

我看到上面这里,优先级是由一个字节的6、7位决定的,那么我写程序的时候是写0,1,2,3 ...

这个是一个32位的寄存器,你需要按照对应的位去配置,比如置位第6位:
0X00000040.

使用特权

评论回复
9
flyriz|  楼主 | 2015-4-8 10:44 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-4-8 10:14
这个是一个32位的寄存器,你需要按照对应的位去配置,比如置位第6位:
0X00000040. ...

我没说清楚,我指的是:
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 这个库函数中的 priority参数的取值,因为这个函数里面的代码我看了好一会儿也没看明白。谢谢!

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-4-8 10:56 | 只看该作者
flyriz 发表于 2015-4-8 10:44
我没说清楚,我指的是:
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 这 ...

Kinetis L系列中断优先级设置问题的解决方案

这个是我之前写过的一个关于优先级的帖子,你可以看看。

使用特权

评论回复
11
nolanpeers| | 2015-12-23 22:29 | 只看该作者
楼主,能否把你利用PIT中断进行AD转换的程序发我一份,我不会弄,我想定时器中断触发AD转换,您这个挺相似的,能发我一份吗?
我邮箱:lovshi@126.com,谢谢!

使用特权

评论回复
12
flyriz|  楼主 | 2015-12-25 12:58 | 只看该作者
nolanpeers 发表于 2015-12-23 22:29
楼主,能否把你利用PIT中断进行AD转换的程序发我一份,我不会弄,我想定时器中断触发AD转换,您这个挺相似 ...

已发,要好好学习哦

使用特权

评论回复
13
nolanpeers| | 2016-1-8 17:04 | 只看该作者
flyriz 发表于 2015-12-25 12:58
已发,要好好学习哦

看到了,多谢了 !!

使用特权

评论回复
14
maomaotr| | 2016-8-18 15:28 | 只看该作者
楼主,能否把你利用PIT中断进行AD转换的程序发我一份,非常感谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

439

帖子

7

粉丝