启用S​​ysTick控制和状态寄存器中的标志后,未调用SYS_TICK处理函数

问题描述

我正在使用STM32F407G-disC1板,启用SysTick控制和状态寄存器中位于0xE000E010存储器映射位置的标志后,未调用SYS_TICK处理程序。 SysTick重载值寄存器的值设置为15999。

void init_systick_timer(uint32_t tick_hz)
{
    uint32_t *pSRVR = (uint32_t*)0xE000E014;
    uint32_t *pSCSR = (uint32_t*)0xE000E010;

    /* calculation of reload value */
    uint32_t count_value = (SYSTICK_TIM_CLK/tick_hz)-1;

    //Clear the value of SVR
    *pSRVR &= ~(0x00FFFFFFFF);

    //load the value in to SVR
    *pSRVR |= count_value;

    //do some settings
    *pSCSR |= ( 1 << 1); //Enables SysTick exception request:
    *pSCSR |= ( 1 << 2);  //Indicates the clock source,processor clock source

    //enable the systick
    *pSCSR |= ( 1 << 0); //enables the counter

}
void  SysTick_Handler(void)
{
}

解决方法

我宁愿不要重新发明轮子,并使用标准的STM提供的CMSIS标头。

您定义寄存器的方式不正确。如果决定重新读取theis值,它将无法正常工作。编译器将简单优化从内存中读取的内容。他们必须是volatile

但是要抽象一下,您需要在NVIC控制器中启用中断。否则,systick计时器将仅设置未决标志,而不会调用处理程序。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...