yugong 发表于 2016-5-14 10:42:34

stm32的systick的中断配置

    请问systick的中断配置如何配置,没有对SysTick_IRQn 进行配置却也触发了中断,请问哪位高手能帮我解释下,谢谢。

00-405686 发表于 2016-5-14 11:29:53

看下手册:SysTick_Config(uint32_t ticks);
该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。

yugong 发表于 2016-5-14 12:54:29

00-405686 发表于 2016-5-14 11:29
看下手册:SysTick_Config(uint32_t ticks);
该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先 ...

SysTick_Config(uint32_t ticks);在core_cm3.h中,但core_cm3.h文件在V2.0版本后没有了,我是想问在高版本的库中怎么配置,谢谢

00-405686 发表于 2016-5-14 13:37:45

yugong 发表于 2016-5-14 12:54
SysTick_Config(uint32_t ticks);在core_cm3.h中,但core_cm3.h文件在V2.0版本后没有了,我是想问在高版 ...

还有,你看下V2.0移植到V3.0,而且V2.0没有core_cm3.h,V3.0后面才有吧

xmshao 发表于 2016-5-14 15:56:29

是个内联函数:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
_STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
    return (1UL);                                                   /* Reload value impossible */
}

SysTick->LOAD= (uint32_t)(ticks - 1UL);                         /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                   /* Function successful */
}

yugong 发表于 2016-5-14 19:03:06

00-405686 发表于 2016-5-14 13:37
还有,你看下V2.0移植到V3.0,而且V2.0没有core_cm3.h,V3.0后面才有吧

以下是我测试公共的代码,我没有配置NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);但是测试却成功了,请问是什么原因,谢谢
int      main (void)
{
      rcc_config ();                //      .\config.c
      nvic_config ();                //      .\config.c
      gpio_config ();                //      .\config.c
      usart_config ();      //      .\config.c
      systick_config ();      //      .\config.c
      while (1)
      {      
   GPIO_SetBits(GPIOB, GPIO_Pin_6);
                if(upload_cnt<=5)                                       
                {GPIO_SetBits(GPIOB, GPIO_Pin_5);
         USART_SendData (USART1, upload_cnt);      
               while ( USART_GetFlagStatus (USART1, USART_FLAG_TXE) == FALSE );}
                else if(upload_cnt<=10)
               {GPIO_ResetBits(GPIOB, GPIO_Pin_5);}
                else
               {upload_cnt=0;}
      }

}

void my_systick_IRQHandler (void)                                                                        //      ¶¨Ê±Æ÷ÖжϷþÎñ³ÌÐò
{
      upload_cnt++;                                                                                                      //      ¶¨Ê±Æ÷¼ÆÊý±äÁ¿¼ÓÒ»
      //adc_event = TRUE;
}
void systick_config (void)
{
      SysTick_CLKSourceConfig (SysTick_CLKSource_HCLK_Div8);      //      8·ÖƵ£º8M * 9 /8 = 9M
       //NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
      SysTick_SetReload (9000);                                                                  //      1ms
      SysTick_ITConfig (ENABLE);                                                                //      ´ò¿ªSystickÖжÏ
      SysTick_CounterCmd(SysTick_Counter_Enable);                        //      Ê¹ÄÜSystick
}

void SysTick_CLKSourceConfig(u32 SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));

if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}

void SysTick_SetReload(u32 Reload)
{
/* Check the parameters */
assert_param(IS_SYSTICK_RELOAD(Reload));

SysTick->LOAD = Reload;
}

void SysTick_ITConfig(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)
{
    SysTick->CTRL |= CTRL_TICKINT_Set;
}
else
{
    SysTick->CTRL &= CTRL_TICKINT_Reset;
}
}

void SysTick_CounterCmd(u32 SysTick_Counter)
{
/* Check the parameters */
assert_param(IS_SYSTICK_COUNTER(SysTick_Counter));

if (SysTick_Counter == SysTick_Counter_Enable)
{
    SysTick->CTRL |= SysTick_Counter_Enable;
}
else if (SysTick_Counter == SysTick_Counter_Disable)
{
    SysTick->CTRL &= SysTick_Counter_Disable;
}
else /* SysTick_Counter == SysTick_Counter_Clear */
{
    SysTick->VAL = SysTick_Counter_Clear;
}   
}

00-405686 发表于 2016-5-16 08:56:21

yugong 发表于 2016-5-14 19:03
以下是我测试公共的代码,我没有配置NVIC_SetPriority (SysTick_IRQn, (1CTRL |= SysTick_Counter_Enable ...

你这用的是那个库,可以上传工程文件吗?

yugong 发表于 2016-5-16 19:40:48

00-405686 发表于 2016-5-16 08:56
你这用的是那个库,可以上传工程文件吗?

文件包在附件,请帮我看看,谢谢。

00-405686 发表于 2016-5-17 17:50:13

yugong 发表于 2016-5-16 19:40
文件包在附件,请帮我看看,谢谢。

你这个是以前的V2.0的库,现在V3.0的库没有cortexm3_macro、stm32f10x_vector文件的这个才是V3.5的库的工程文件


页: [1]
查看完整版本: stm32的systick的中断配置