为STM32配置Systick

问题描述 投票:0回答:1

虽然这个问题可能很琐碎,但我不太明白我的工作结果。我遵循裸机编程文章,尝试在我的 Nucleo 板上使用 STM32H723 实现一些基本功能,而无需任何外部库。我明白大部分内容,但有些文章提到我需要启用 SysCfg 才能使用 systick。

 static inline void systick_init(uint32_t ticks) {
  if ((ticks - 1) > 0xffffff) return;  // Systick timer is 24 bit
  SYSTICK->LOAD = ticks - 1;
  SYSTICK->VAL = 0;
  SYSTICK->CTRL = BIT(0) | BIT(1) | BIT(2);  // Enable systick
  //RCC->APB4ENR |= BIT(1);                   // WHY NOT NEEDED?
}

我观察到的是,我不需要最后一行(注释掉的那一行),其中提到了 SysCfg 启用。我没有在代码的任何其他部分触及该寄存器,但中断仍在工作。我什至检查了Cube为我生成的startup.s文件,我只能看到中断向量的初始化。是因为电源模式吗? SysCfg 默认仅在低功耗时禁用?

c arm bare-metal
1个回答
0
投票

SysTick 是一个核心 Cortex-M7 外设,它独立于 SYSCFG 外设。

但有些文章提到我需要启用 SysCfg 才能 使用 systick。

不要相信网络“文章”。使用文档。

不要使用幻数 - 使用 STM32H7 CMSIS 的定义

#include "stm32h7xx.h"

void SysTick_Init(uint32_t ticks) 
{
    // Set the reload register
    SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
    
    // Set the SysTick priority (optional)
    NVIC_SetPriority(SysTick_IRQn, 0);
    
    // Reset the current value register
    SysTick->VAL = 0;
    
    // Select processor clock (HCLK) as SysTick clock source
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | 
                    SysTick_CTRL_TICKINT_Msk | 
                    SysTick_CTRL_ENABLE_Msk;
}

void SysTick_Handler(void) 
{
    // Handle the SysTick interrupt (e.g., increment a tick counter)
}

我什至检查了startup.s

Cube 不会在那里放置任何外围初始化。仅在

.c
源文件中。

是因为电源模式吗? SysCfg 默认情况下仅在低时禁用 功率?

使用误导性的信息来源会导致错误的结论。

SysCfg
默认情况下处于禁用状态,如果您需要其功能,则需要启用它。

但是SysTick是独立的,与该外设无关。

© www.soinside.com 2019 - 2024. All rights reserved.