关于初始化函数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条回答
正点原子
1楼-- · 2019-10-11 15:51
看《STM32不完全手册》关于这部分的介绍。
sun_shine
2楼-- · 2019-10-11 17:34
回复【楼主位】aaronlee0817:
---------------------------------
中断分抢先优先级和响应优先级,通过组合可以构成中断优先级,,,分组的目的是确定响应优先级和抢占优先级的级数。前两个参数是抢先优先级和响应优先级,最后一个参数是组号。组号2,应该不是你说的4:0,而是2:2。我也是新手菜鸟 ,只能理解这么多了,说的可能不对。
aaronlee0817
3楼-- · 2019-10-11 19:31
回复【2楼】正点原子:
---------------------------------
手册中就注释为“组2”,但是这个组是什么呢?
aaronlee0817
4楼-- · 2019-10-11 19:46
回复【3楼】sun_shine:
---------------------------------
刚又核实了一下~2:2的编号是5~
aaronlee0817
5楼-- · 2019-10-12 00:38
 精彩回答 2  元偷偷看……
shuidi_wangdan
6楼-- · 2019-10-12 03:14
回复【3楼】sun_shine:
---------------------------------
前两个参数是抢先优先级和响应优先级,这个级别是怎么来的?能否给详细介绍一下???

一周热门 更多>