OpenEdv-开源电子网

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

为什么systick中断位置是-1怎么从手册上得到的,哪一本哪一页

[复制链接]

3

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-6-30
在线时间
2 小时
发表于 2018-7-28 17:07:16 | 显示全部楼层 |阅读模式
20金钱

]~2[G66Z@1{_%_0NPL`0.png
B2GO}~K75JB_A4J~SKAQS73.png

最佳答案

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

这个表中的-1不是优先级, 是IRQn的中断号, 就像下面列的EXTI0是6一样。 SYSTICK的优先级是可编程的, 好像系统时钟初始化时将其优先级预先设置成了优先级最大值-1 即16-1=15,即4BIT时的1111, 这样,无论你选择哪个分组,它都是最低优先级的。 补充一下,如果你问的确实是中断号为什么是-1, 这个真的在手册中没有地方明确,实际本应该在你截图1的表中第一栏中标示的。 但:中断向量表是严格按照中断号排列的, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 17:07:17 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 22:08 编辑

这个表中的-1不是优先级,
是IRQn的中断号, 就像下面列的EXTI0是6一样。
SYSTICK的优先级是可编程的,
好像系统时钟初始化时将其优先级预先设置成了优先级最大值-1
即16-1=15,即4BIT时的1111,
这样,无论你选择哪个分组,它都是最低优先级的。

补充一下,如果你问的确实是中断号为什么是-1,
这个真的在手册中没有地方明确,实际本应该在你截图1的表中第一栏中标示的。
但:中断向量表是严格按照中断号排列的,
最右侧有地址可以参照,0#的地址是0040,按照4字节一个向量往前推,
从-1(003C)一直到-14(0008)都是严格按地址对应的。
向量地址的计算公式是:0000 0040+IRQn*4
所以在stm32f10x.h中, SYSTICK的IRQn是按照-1来定义的。

这个应该没有问题的。

其实你图1的表中,最不能让我理解的是优先级这一栏,
这些数字除了固定为负数的那三个以外,其余的不知道有什么意义。
既不是复位值,也不符合优先级的定义要求。
唯一的解释是:表中各中断在优先级设置完全相同时,越靠前优先级越高。也不知这么理解对不对,手册中好像也没有明确说明。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 17:24:30 | 显示全部楼层
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 18:42:33 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 19:24 编辑

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
执行这一句相当于执行NVIC_SetPriority (-1, 15);
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 18:57:04 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 19:00 编辑

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if(IRQn < 0) {
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 19:22:41 | 显示全部楼层
执行这一句
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);
其中IRQn=-1即(0xffffffff0xF)-4=11
SCB->SHP[11] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);
                         =(15<<4)& 0xff=0xF0;
优先级只有高4位有效,故最终SCB->SHP[11]=11110000;
SCB->SHP[11]的地址是0xE000_ED23  是系统存放SYSTICK中断优先级的一个8位寄存器,高4位有效
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 19:50:10 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 20:39 编辑

如果你的程序没有调用过SysTick_Config();
很可能SYSTICK的中断优先级不是最低值,你可在程序中的任意地方,查看一下:
printf("SCB->SHP[11]=%02X",SCB->SHP[11]);        
或者,给它指派一个中断优先级,
SCB->SHP[11]=0xF0;    //指派为最低优先级
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-6-30
在线时间
2 小时
 楼主| 发表于 2018-7-30 09:33:09 | 显示全部楼层
大哥我说的是手册上的页数,请注意我的问题谢谢
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-6-30
在线时间
2 小时
 楼主| 发表于 2018-7-30 09:36:05 | 显示全部楼层
warship 发表于 2018-7-28 19:50
如果你的程序没有调用过SysTick_Config();
很可能SYSTICK的中断优先级不是最低值,你可在程序中的任意 ...

算了那个问题没答案,我换个问题
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-6-30
在线时间
2 小时
 楼主| 发表于 2018-7-30 09:39:35 | 显示全部楼层
为什么是未用,可作为通用I/O ,半双工不是也要收数据吗?收数据为什么可以作为普通io
IY_Z3(HLCD_IBALO){J9UV2.png
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-30 10:31:58 | 显示全部楼层
被打的boss 发表于 2018-7-30 09:39
为什么是未用,可作为通用I/O ,半双工不是也要收数据吗?收数据为什么可以作为普通io

这个没有用过,但半双工因为不同时使用TX和RX,
所以理论上只须其一,兼作收线和发线。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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