在stm32定时器中主程序中从哪儿进入中断

2019-07-14 23:16发布

请问大神,在STM32定时器中主程序中并没有进入中断的语句,,请问是从哪儿进入中断的?谢啦!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
__函数
1楼-- · 2019-07-15 06:40
依然落叶飘零 发表于 2014-10-27 01:24
系统发生中断的时候,程序调到中断向量表中对应的位置,中断向量表在starup_stm32f10x.hd.s这个启动文件中 ...

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  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);
还是
SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */呢???

依然落叶飘零
2楼-- · 2019-07-15 08:30
 精彩回答 2  元偷偷看……
__函数
3楼-- · 2019-07-15 12:48
依然落叶飘零 发表于 2014-12-16 22:10
这个是滴答时钟定时器中SysTick_IRQn。starup_stm32f10x.hd.s文件中会有对应的定时器服务中断函数入口, ...

我明白了,谢谢。觉得你研究的很深,能否给我解释一下这个问题/** @defgroup RCC_APB1_Peripherals
  * @{
  */
#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
#define RCC_APB1Periph_I2C3              ((uint32_t)0x00800000)
#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
#define RCC_APB1Periph_UART7             ((uint32_t)0x40000000)
#define RCC_APB1Periph_UART8             ((uint32_t)0x80000000)
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00))
/**
  * @}
  */

这是RCC.h文件中的一段,我不明白最后一个#define语句是什么意思?(PERIPH) & 0x09013600)是PERIPH取地址还是“按位与”?






依然落叶飘零
4楼-- · 2019-07-15 12:56
__函数 发表于 2014-12-16 23:41
我明白了,谢谢。觉得你研究的很深,能否给我解释一下这个问题/** @defgroup RCC_APB1_Peripherals
  *  ...

我也是大概了解一下库是怎么回事,也没有具体去详细读过,就是大概知道原理而已。(PERIPH) & 0x09013600)这个是取地址,这个地址应该是是RCC_APB1ENR寄存器(不是很确定),这个看stm32参考手册。这句就是读取这个寄存器的值,再转换为PERIPH类型。个人感觉新手还是很难读懂官方的数据手,固件库只要大概了解他怎么实现的就可以了,了解原理。没必要去深入了解他怎样一步步现实的,会用就行了。对它有个总体的认识就可以了。刚开始我也不知道有中断他怎么就进入服务函数了,它怎么没有好像51那样在函数上面标明是中断服务函数,后来深入了解才知道他在启动文件里面定义了服务函数入口。现在我还在学stm32,学到FSMC,SDIO,USB这些,感觉更难了,没有像以前那样有固件库使用手册。本来英文又不好,资料都是英文的。如果你还遇到什么问题可以上来,大家一起探讨一下。希望你可以不像我那样,少走点弯路。
__函数
5楼-- · 2019-07-15 13:04
依然落叶飘零 发表于 2014-12-17 12:44
我也是大概了解一下库是怎么回事,也没有具体去详细读过,就是大概知道原理而已。(PERIPH) & 0x09013600) ...

我的Q763612411,欢迎交流
hapyy
6楼-- · 2019-07-15 13:55
依然落叶飘零 发表于 2014-12-16 22:10
这个是滴答时钟定时器中SysTick_IRQn。starup_stm32f10x.hd.s文件中会有对应的定时器服务中断函数入口,就是SysTick_Handler这个。

怎么在定时器中断中做自己人想的事情呢?

一周热门 更多>