关于初始化函数MY_NVIC_Init

2019-10-11 14:24发布

void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)   {  u32 temp; u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址  u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移 IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置 MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组 temp=NVIC_PreemptionPriority<<(4-NVIC_Group);   temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); temp&=0xf;//取低四位
if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK) else NVIC->ISER[1]|=1<<(NVIC_Channel-32);     NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级            }

下面是调用它的函数
void WWDG_Init(u8 tr,u8 wr,u8 fprer) {   RCC->APB1ENR|=1<<11; //使能wwdg时钟 WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.    WWDG->CFR|=fprer<<7;    //PCLK1/4096再除2^fprer WWDG->CFR|=1<<9;        //使能提前唤醒中断 WWDG->CFR&=0XFF80;      WWDG->CFR|=wr;    //设定窗口值      WWDG->CR|=WWDG_CNT|(1<<7); //开启看门狗,设置7位计数器      MY_NVIC_Init(2,3,WWDG_IRQChannel,2);//抢占2,子优先级3,组2    }
MY_NVIC_Init第四个参数NVIC_Group是AIRC寄存器中的PRIGROUP位[10:8]么?如果是,那么实参给的是2,分配情况是4:0,即16个抢先式优先级,无子优先级,那MY_NVIC_Init的前两个参数怎么解释,新手菜鸟表示看晕了,求各位高手指点
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
sun_shine
2019-10-11 17:34
回复【楼主位】aaronlee0817:
---------------------------------
中断分抢先优先级和响应优先级,通过组合可以构成中断优先级,,,分组的目的是确定响应优先级和抢占优先级的级数。前两个参数是抢先优先级和响应优先级,最后一个参数是组号。组号2,应该不是你说的4:0,而是2:2。我也是新手菜鸟 ,只能理解这么多了,说的可能不对。

一周热门 更多>