相关文章推荐
有爱心的杯子  ·  WebSocket.ReceiveAsync ...·  11 月前    · 
帅呆的苦咖啡  ·  对象存储 COSCMD ...·  1 年前    · 
RCC_ClkInitTypeDef RCC_ClkInitStruct ; RCC_OscInitStruct . OscillatorType = RCC_OSCILLATORTYPE_HSE ; // 外部晶振,8MHz RCC_OscInitStruct . HSEState = RCC_HSE_ON ; RCC_OscInitStruct . HSEPredivValue = RCC_HSE_PREDIV_DIV1 ; RCC_OscInitStruct . PLL . PLLState = RCC_PLL_ON ; RCC_OscInitStruct . PLL . PLLSource = RCC_PLLSOURCE_HSE ; RCC_OscInitStruct . PLL . PLLMUL = RCC_PLL_MUL9 ; // 9倍频,得到72MHz主时钟 HAL_RCC_OscConfig ( & RCC_OscInitStruct ) ; RCC_ClkInitStruct . ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 ; RCC_ClkInitStruct . SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ; // 系统时钟:72MHz RCC_ClkInitStruct . AHBCLKDivider = RCC_SYSCLK_DIV1 ; // AHB时钟:72MHz RCC_ClkInitStruct . APB1CLKDivider = RCC_HCLK_DIV2 ; // APB1时钟:36MHz RCC_ClkInitStruct . APB2CLKDivider = RCC_HCLK_DIV1 ; // APB2时钟:72MHz HAL_RCC_ClockConfig ( & RCC_ClkInitStruct , FLASH_LATENCY_2 ) ; // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次 // HAL_RCC_GetHCLKFreq()/100000 10us中断一次 // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次 HAL_SYSTICK_Config ( HAL_RCC_GetHCLKFreq ( ) / 1000 ) ; // 配置并启动系统滴答定时器 /* 系统滴答定时器时钟源 */ HAL_SYSTICK_CLKSourceConfig ( SYSTICK_CLKSOURCE_HCLK ) ; /* 系统滴答定时器中断优先级配置 */ HAL_NVIC_SetPriority ( SysTick_IRQn , 0 , 0 ) ;

以上代码中,设置了系统滴答定时器1ms进行中断处理。

2、进行系统滴答定时器的中断函数添加

1)在启动文件中,有关于中断向量表的定义

在这里插入图片描述
系统滴答定时器的中断函数名称为:SysTick_Handler

2)在工程中全局搜索,寻找HAL库中SysTick_Handler的回调函数

// An highlighted block
void SysTick_Handler(void)
  /* USER CODE BEGIN SysTick_IRQn 0 */
  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  /* USER CODE END SysTick_IRQn 1 */

进一步定位到以下函数:

* @brief This function handles SYSTICK interrupt request. * @retval None void HAL_SYSTICK_IRQHandler(void) HAL_SYSTICK_Callback(); * @brief SYSTICK callback. * @retval None __weak void HAL_SYSTICK_Callback(void) /* NOTE : This function Should not be modified, when the callback is needed, the HAL_SYSTICK_Callback could be implemented in the user file

说明我们只需要重新定义HAL_SYSTICK_Callback这个虚函数,并添加相应的功能,我们就可以实现系统滴答定时器中断函数的编写

3)编写中断回调函数

/*__weak */void HAL_SYSTICK_Callback(void)
	SysTickCallBack();	
void SysTickCallBack(void)
	APP_Timer_10ms_Falg++;
	if(APP_Timer_10ms_Falg >= 10)
		Task_For_10ms();
		APP_Timer_10ms_Falg = 0;
	APP_Timer_100ms_Falg++;
	if(APP_Timer_100ms_Falg >= 100)
		Task_For_100ms();
		APP_Timer_100ms_Falg = 0;
	APP_Timer_1000ms_Falg++;
	if(APP_Timer_1000ms_Falg >= 1000)
		Task_For_1000ms();
		APP_Timer_1000ms_Falg = 0;

以上即可实现简单的时间基准处理。

以上,仅为本人自用。

利用stm32系统滴答滴来获取系统时间基准,以此应用到接收串口数据的超时退出。具体如下:current_sys_time = SysTick->VAL;(获取当前时间基准)。while (com_available(&rx_buffer1) < 1){//超时退出接收串口数据if((SysTick->VAL - current_sys_time) > Delay... SysTick_Handler(void)这个定时器中断处理函数是怎么定义的?根据以往的经验,我感觉在底层应该会有一个类似于函数声明的东西的存在,但是往下跟程序的话,一直都没有找到相应的定义或者声明,那么究竟SysTick_Handler这个函数怎么来的呢?是不是可以人为的做修改呢?以及Systick的详细介绍 一、SysTick系统定时器简介 SysTick系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。 因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,使得软件在CM3单片机中可以很容易的移植。 系统定时器一般用于操作系统,用于产生时基,维持操作 @[TOC](STM32 HAL_SYSTICK_Callback() 失效) STM32 HAL_SYSTICK_Callback() 失效、无效、未执行 在调试某块开发板时,出现了HAL_SYSTICK_Callback()失效的情况。 运行环境1,无效 STM32CubeIDE 1.3.1 内置STM32CubeMX 5.6.1 STM32Cube FW_F4 V1.25.0 运行环境2,无效 Keil MDK 5.30 STM32CubeMX 5.6.1 STM32Cube FW_F4 V1. k中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在。中断函数定义好后,直接初始化中断时间,主函数中不需要对中断进行其他处理,这样就能实现SysTick中断让LED灯闪烁了。文件就是start-upxxxxx_md.s那个。文件中已经给出定义,直接到文件中查找即可。配置的方法,直接在操作。 SysTick定时器系统滴答定时器是一个非常基本倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。 它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了,不用考虑最基本的时钟不一致的问题。 总结一下:SysTick_Handler()函数每1ms运行一次,运行时就调用TimingDelay_Decrement()函数,... 学习SysTick可以参考: 《Cortex-M3 内核编程手册》-4.5 章节 SysTick Timer(STK),和 4.48 章节 SHPRx,其中 STK 这个章节有 SysTick 的简介和寄存器的详细描述。因为 SysTick 是属于 CM3 内核的外设,有关寄存器的定义和部分库函数都在 core_CM3.h 这个头文件中实现。 所以学习 SysTick 的时候可以参考这两个资料,一个是文档,一个是源码。 SysTick 简介 SysTick系统定时器是属于 CM3 内核中的 SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。 SysTick系统定时器有4个寄存器,在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。 SysTick 属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件 core_cm3.h 中。 中断优先级是将置位的数转换为2进制,如Systick默认为15.