STM32F030 SYSTICK LL 库 中断

前面都用 HAL 开发 STM32F030K6T6, 由于空间消耗太快,采用优化编译也无法解决内存不够的问题;只能从来把 HAL 换成 LL 库;

用STM32CUBEMX 生成模板程序后,发现Systick 不能进入中断;

比较HAL 和 LL的区别如下:

标准HAL库是如下的:

__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 */
}
 

LL 库是如下的:

/**
  * @brief  This function configures the Cortex-M SysTick source of the time base.
  * @param  HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro)
  * @note   When a RTOS is used, it is recommended to avoid changing the SysTick 
  *         configuration by calling this function, for a delay use rather osDelay RTOS service.
  * @param  Ticks Number of ticks
  * @retval None
  */
__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
{
  /* Configure the SysTick to have interrupt in 1ms time base */
  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */
  SysTick->VAL   = 0UL;                                       /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | \
                   SysTick_CTRL_ENABLE_Msk;                   /* Enable the Systick Timer */
}

仔细比较二种的区别,发现LL库默认没有设置:enable 中断:

也就是没有设置这个位:SysTick_CTRL_TICKINT_Msk

跟踪调试也可以看到:TICKINT 标志位没有勾上,这时如果认为点上勾,就可以进入中断函数了!

具体解决程序段如下:

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
     
  /* Configure the system clock 定义自己需要是时钟, 同时设置了Systick =1ms, 但并没有启动systick */
  SystemClock_Config();

    /* 2024.06.15 必须人工启用Systick enable 中断允许*/
    SysTick->CTRL  |= SysTick_CTRL_TICKINT_Msk;
  NVIC_SetPriority(SysTick_IRQn, 3);
  NVIC_EnableIRQ(SysTick_IRQn);
 

### STM32F030K6T6 标准下载与使用教程 对于STM32F030K6T6微控制器而言,开发者通常会依赖于ST官方提供的标准外设来简化编程工作。然而,在实际操作过程中可能会遇到一些挑战[^2]。 #### 获取标准资源 为了获取适用于STM32F030K6T6的标准,建议访问ST官方网站并导航至对应的产品页面。这里可以找到最新的固件包,其中包括了针对不同系列MCU优化过的HAL (Hardware Abstraction Layer) 和LL (Low-Layer) 文件。需要注意的是,早期版本可能存在某些缺陷或不兼容的情况,因此务必确认下载的是最新发布的稳定版固件包[^4]。 #### 安装配置环境 安装完成后,需按照指导文档设置好开发工具链,比如选择合适的IDE(如Keil MDK、IAR Embedded Workbench 或者 STM32CubeIDE),并将项目属性中的固件路径指向所下载的资料位置。这一步骤确保编译器能够正确识别和链接必要的头文件及源码。 #### 编程实践指南 当准备就绪后,可以通过查阅《STM32F030中文用户手册》了解具体硬件特性和寄存器定义等内容[^1]。与此同时,《STM32F0xx_HAL_Driver_User_Manual》提供了关于如何利用HAL/LL API实现各种功能模块的具体说明。值得注意的是,如果面临存储空间有限的问题,则考虑切换到更轻量级的LL作为替代方案[^3]。 ```cpp // 示例:初始化SysTick定时器中断服务例程 #include "stm32f0xx_ll_bus.h" #include "stm32f0xx_ll_rcc.h" #include "stm32f0xx_ll_system.h" #include "stm32f0xx_ll_utils.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ // 初始化系统时钟 SystemClock_Config(); // GPIO端口初始化 MX_GPIO_Init(); /* 用户应用程序入口 */ } /** * @brief 配置系统时钟为最高频率 */ void SystemClock_Config(void){ LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); LL_RCC_HSI_Enable(); while(LL_RCC_HSI_IsReady() != 1){} LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1 ); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1 ); LL_RCC_HSIPrescalerConfig(1<<((READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)>>4)&0xF)); LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_NONE, LL_RCC_PLL_MUL_4, LL_RCC_PLLDIV_DIV2); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值