在线时间27 小时
UID3066944
注册时间2014-10-13
NXP金币0
TA的每日心情 | 郁闷 2017-1-16 22:47 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
注册会员

- 积分
- 189
- 最后登录
- 2023-3-30
|
本帖最后由 x316639495 于 2016-10-10 15:21 编辑
在用kl46做项目,需要精确测量一脉冲高电平时间,脉冲触发外部中断后用PIT1来计时实现。为了精确测量,需要把外部中断的优先级设为最高,形成中断嵌套。参考了官方的例程修改优先级
void set_irq_priority (int irq, int prio)
{
/*irq priority pointer*/
uint8 *prio_reg;
uint8 err = 0;
uint8 div = 0;
/* Make sure that the IRQ is an allowable number. Right now up to 32 is
* used.
*
* NOTE: If you are using the interrupt definitions from the header
* file, you MUST SUBTRACT 16!!!
*/
if (irq > 32)
{
printf("\nERR! Invalid IRQ value passed to priority irq function!\n");
err = 1;
}
if (prio > 3)
{
printf("\nERR! Invalid priority value passed to priority irq function!\n");
err = 1;
}
if (err != 1)
{
/* Determine which of the NVICIPx corresponds to the irq */
div = irq / 4;
prio_reg = (uint8 *)((uint32)&NVIC_IP(div));
/* Assign priority to IRQ */
*prio_reg = ( (prio&0x3) << (8 - ARM_INTERRUPT_LEVEL_BITS) );
}
}
我现在把PORTD的中断优先级设为最高。但现在PORTD中断还是无法中断其它的中断形成中断嵌套,也无法精确测量脉冲高电平的时间。其它中断源还有PIT0,UART0,TPM。请问该如何处理。谢谢
if(PORTC_ISFR & (1<<8))
{
PORTC_ISFR |=(1<<8);
if(gpio_get(PORTC,9) )
{
if(gpio_get(PORTC,8) )
{
PIT_TCTRL1 = !PIT_TCTRL_TEN_MASK | !PIT_TCTRL_TIE_MASK | !PIT_TCTRL_CHN_MASK; //关闭定时器
PIT_LDVAL1 = 0xFFFFFFFF;// 最大值
PIT_TFLG1 = PIT_TFLG_TIF_MASK; // 清除标志
PIT_TCTRL1 |= PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK;
}
else
{
time = (0xFFFFFFFF - PIT_CVAL1)/(Bus_Fre/1000);//Bus_Fre总线时钟,计算时间,单位是微秒
PIT_TCTRL1 = !PIT_TCTRL_TEN_MASK | !PIT_TCTRL_TIE_MASK | !PIT_TCTRL_CHN_MASK; //关闭定时器
}
}
|
|