1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取; 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章; 博主分享不易,请给三连哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。
STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX 。 本教程是 STM32CubeMX 实战教程中的第六篇,主要通过 定时器中断实验,将 STM32CubeMX TIM2 定时中断 的配置方法讲述清楚。
系统版本:Windows 10 专业版 64 位 软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程 ) 硬件平台:正点原子 STM32F1 精英板 编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程 ) 调试工具:ST-LINK/V2
本节教程使用的硬件资源分配:
序号引脚引脚功能硬件连接备注01PB5OutputLED 灯(DS0)低电平亮02PE5OutputLED 灯(DS1)低电平亮将第三篇的 USART_Test 的项目另存作为 Timer_Test 的项目初始模板。 工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
Clock 不需要配置,可直接继续使用。可参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程、STM32CubeMX 实战教程:SysTick 实验。
TIM2 时钟分配 外设描述时钟来源备注TIM2通用定时器 2APB172MHz项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程、STM32CubeMX 项目配置窗口介绍(一)、STM32CubeMX 项目配置窗口介绍(二)。 点击 GENERATE CODE 生成代码。
打开 MDK_ARM 工程;
查看 MX_TIM2_Init() 函数源码; 分析 MX_TIM2_Init() 函数: a. 开启时钟,开启中断及分配中断优先级; b. 设置定时器参数:分频系数、计数模式、自动重装载值、时钟分频因子(时钟分割); c. 关闭自动重装载值缓存器; d. 相比于标准库配置,未开启更新中断:TIM_DIER_UIE = 1; 标准库函数语句:TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); e. 相比于标准库配置,未使能定时器计数器:TIM_CR1_CEN = 1; 标准库函数语句:TIM_Cmd(TIM2, ENABLE);
在 main 函数的用户代码区域 2 使能更新中断并开启 TIM2 计数器; (PS:后面有 main 函数完整代码)
在 tim.c 文件的用户代码区域 0 加入中断处理回调函数 TIM2_IRQ() 源码;(请自行在头文件中进行函数声明) TIM2_IRQ() 函数代码如下:
/* USER CODE BEGIN 0 */ void TIM2_IRQ(void) { if(LL_TIM_IsActiveFlag_UPDATE(TIM2) == SET) { LL_TIM_ClearFlag_UPDATE(TIM2); LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); } } /* USER CODE END 0 */ 在 stm32f1xx_it.c 文件的中断处理函数 TIM2_IRQHandler 用户代码区域 0 加入中断处理回调函数 TIM2_IRQ();(请自行在头文件 main.h 中包含头文件 tim.h) 在 main 函数中 while 循环中加入程序运行指示灯代码; main 函数代码如下: /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); /* System interrupt init*/ /** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST */ LL_GPIO_AF_Remap_SWJ_NONJTRST(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz) SysTick_CTRL_TICKINT_Msk; // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ LL_RCC_GetSystemClocksFreq(&get_rcc_clock); LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin); LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin); LL_USART_EnableIT_RXNE(USART1); // ENABLE USART1 RXNE Interrupt LL_USART_EnableIT_IDLE(USART1); // ENABLE USART1 IDLE Interrupt LL_TIM_EnableIT_UPDATE(TIM2); // ENABLE TIM2 IT Update Interrupt <=> TIM_DIER_UIE = 1 LL_TIM_EnableCounter(TIM2); // ENABLE TIM2 Counter <=> TIM_CR1_CEN = 1 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { LL_mDelay(400); LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 编译工程; 使用 ST-LINK/V2 下载程序,按下复位按键,若按照下面操作看到正常现象,则说明程序正常运行,定时器中断配置成功。 Steps操作正常现象备注1按下 复位 按键,松开程序运行指示灯 DS0 每 0.8s 亮 0.4s,定时器中断指示灯 DS1 每 0.4s 亮 0.2s-本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。 此教程由本人独立整理,如有不当之处,欢迎指正。
STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总 。 该文章还提供:
STM32Cube 生态系统相关文章STM32Cube 生态系统相关软件更新介绍STM32Cube 生态系统相关教程汇总STM32Cube 生态系统相关网站汇总该文章会不定期修改更新,更多信息请进入文章查看