-
准备工程,在此链接的例程上增加SYSTICK功能
https://blog.csdn.net/mygod2008ok/article/details/106748615
-
配置系统时钟
/* Private function prototypes -----------------------------------------------*/
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = PLL (HSI/2)
* SYSCLK(Hz) = 48000000
* HCLK(Hz) = 48000000
* AHB Prescaler = 1
* APB1 Prescaler = 1
* HSI Frequency(Hz) = 8000000
* PREDIV = 1
* PLLMUL = 12
* Flash Latency(WS) = 1
* @param None
* @retval None
*/
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* No HSE Oscillator on Nucleo, Activate PLL with HSI/2 as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
HAL_StatusTypeDef err_code = HAL_RCC_OscConfig(&RCC_OscInitStruct);
APP_ERROR_CHECK(err_code);
/* Select PLL as system clock source and configure the HCLK, PCLK1 clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
err_code = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
APP_ERROR_CHECK(err_code);
}
-
在sdk_config.h中加入SYS_TICK_COUNTER宏,这里将SYSTICK配置成25Hz
#ifndef SDK_CONFIG_H
#define SDK_CONFIG_H
#define STM_MODULE_ENABLED(module) \
((defined(module ## _ENABLED) && (module ## _ENABLED)) ? 1 : 0)
// <<< Use Configuration Wizard in Context Menu >>>\n
//==================================================================================================
//系统嘀嗒配置
//系统嘀嗒时间
#ifndef SYS_TICK_COUNTER
#define SYS_TICK_COUNTER 25
#endif
////==========================================================
//DEBUG配置
//DEBUG使能
#ifndef DEBUG_ENABLED
#define DEBUG_ENABLED 1
#endif
//ASSERT参数检查使能
#ifndef IS_USE_FULL_ASSERT
#define IS_USE_FULL_ASSERT 1
#endif
#if IS_USE_FULL_ASSERT
#define USE_FULL_ASSERT
#endif
//// <<< end of configuration section >>>
#endif //SDK_CONFIG_H
-
重写__weak弱编译HAL_InitTick函数,这样就将SYSTICK频率配置成SYS_TICK_COUNTER,即25Hz,也就是每个tick时间为40毫秒
/**
* @brief overload system tick
*
*/
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/SYS_TICK_COUNTER);
/*Configure the SysTick IRQ priority */
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);
/* Return function status */
return HAL_OK;
}
-
在main.C文件中定义变量
volatile uint16_t s_wakeup_flag; // 唤醒事件标志
-
在main.h中声明变量及定义事件标志宏
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.h * @brief : Header for main.c file. * This file contains the common defines of the application. ****************************************************************************** * @attention * *© Copyright (c) 2020 STMicroelectronics. * All rights reserved.
* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __MAIN_H #define __MAIN_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "stm32f0xx_hal.h" #define TICK_FOR_25HZ 0x02 //!< 40ms事件标志 #define CLEAR_TICK_FOR_25HZ (~TICK_FOR_25HZ) //!< 清除40ms事件标志 extern volatile uint16_t s_wakeup_flag; #ifdef __cplusplus } #endif #endif /* __MAIN_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
-
在stm32f0xx_it.c中包含头文件,并在SysTick_Handler中断处理函数中加入以下代码
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
s_wakeup_flag |= TICK_FOR_25HZ;
/* USER CODE END SysTick_IRQn 1 */
}
-
在main.c中实现25Hz处理函数
/**
* @brief 25Hz handler
*
*/
void tick_25hz_handler(void)
{
if(s_wakeup_flag & TICK_FOR_25HZ)
{
s_wakeup_flag &= CLEAR_TICK_FOR_25HZ;
//####################################################################################
//---------TODO this to add 25hz event handler-----------
NRF_LOG_INFO("tick_25hz_and_1hz_handler");
}
}
-
在循环中调用tick_25hz_handler函数
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
RTT_INIT();
HAL_Init();
SystemClock_Config();
NRF_LOG_INFO("program is reset!");
BSP_wdt_init(5000);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
BSP_wdt_feed();
tick_25hz_handler();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
-
运行结果如下:
例程下载链接:
https://download.csdn.net/download/mygod2008ok/12522570
