虽然这个问题可能很琐碎,但我不太明白我的工作结果。我遵循裸机编程文章,尝试在我的 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 默认仅在低功耗时禁用?
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是独立的,与该外设无关。