OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7430|回复: 5

NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));怎样理解,为什么这样写??

[复制链接]

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-4-4
在线时间
0 小时
发表于 2015-4-29 17:26:31 | 显示全部楼层 |阅读模式
5金钱
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
}

这个函数怎样理解,为什么是((IRQn) >> 5)?又为什么是(1 << ((uint32_t)(IRQn) & 0x1F));

最佳答案

查看完整内容[请看2#楼]

1)NVIC->ISER[((uint32_t)(IRQn) >> 5)] ,左移5,就是除2的5次方的意思,,,这是因为中断0-31,是ISER[0],中断32-63是ISER[1]配置,依次类推。。这个好理解 2)右边 (1 << ((uint32_t)(IRQn) & 0x1F));   IRQn取低5位,,比如你中断是 31,那么低5位就直接是31,所以左移31位,就是设置他在ISER[0]中的位31了,,  比如你是中断 63,低五位, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-4-29 17:26:32 | 显示全部楼层
1)NVIC->ISER[((uint32_t)(IRQn) >> 5)] ,左移5,就是除2的5次方的意思,,,这是因为中断0-31,是ISER[0],中断32-63是ISER[1]配置,依次类推。。这个好理解
2)右边 (1 << ((uint32_t)(IRQn) & 0x1F));   IRQn取低5位,,比如你中断是 31,那么低5位就直接是31,所以左移31位,就是设置他在ISER[0]中的位31了,,
 比如你是中断 63,低五位,左移也是31位,只不过设置的是ISER[1]而已。。
这个逻辑不算太难,,,具体哪个位对哪个,我们手册描述很详细:

手册原文:

ISER[8]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。上面说了CM3内核支持256个中断,这里用8个32位寄存器来控制,每个位控制一个中断。但是STM32的可屏蔽中断最多只有68个(互联型),所以对我们来说,有用的就是三个(ISER[0~2]]),总共可以表示96个中断。而STM32只用了其中的前68位。ISER[0]的bit0~31分别对应中断0~31;ISER[1]的bit0~32对应中断32~63;ISER[2]的bit0~3对应中断64~67;这样总共68个中断就分别对应上了。你要使能某个中断,必须设置相应的ISER位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO口映射等设置才算是一个完整的中断设置)。具体每一位对应哪个中断,请参考stm32f10x.h里面的第170行处。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-4-29 17:26:32 | 显示全部楼层
不是左移一位。。。
是1左移 IRQn位(IRQn取低5位)
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-4-4
在线时间
0 小时
 楼主| 发表于 2015-4-30 00:12:46 | 显示全部楼层
回复【2楼】Admin:
---------------------------------
前面这个NVIC->ISER[((uint32_t)(IRQn) >> 5)]我看懂了,是为了得出ISER[0]、ISER[1]或ISER[2]的;但后面的 (1 << ((uint32_t)(IRQn) & 0x1F));为什么在((uint32_t)(IRQn) & 0x1F)结果后还需要左移一位?
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-4-4
在线时间
0 小时
 楼主| 发表于 2015-4-30 13:05:05 | 显示全部楼层
回复【4楼】Admin:
---------------------------
谢谢,我太糊涂了,这都能倒过来。1左移IRQn位(IRQn取低5位)是为了使相应的IRQn位置1,从而打开使能。。。。。
请问一下为什么要加这个static __INLINE
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-5-4 20:40:25 | 显示全部楼层
你可以百度一下 static __INLINE 
 http://my.oschina.net/mummy108/blog/222680
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表