【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习

前言

本教程将对应外设原理,HAL库、STM32CubeMX和FreeRTOS结合在一起讲解,分析学习过程中遇到的问题和一些注意事项。

知识概括:

SMT32定时器原理
STM32CubeMX创建定时器例程
HAL库TIM定时器函数库
定时器中断的创建与使用
FreeRTOS中断级临界代码段理解

定时器简介

SMT32F1系列共有8个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

SMT32F4系列共有15个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。

基本定时器功能(TIM6、TIM7):

1. 16位向上、向下、向上/下自动装载计数器
2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
3. 触发DAC的同步电路 注:此项是TIM6/7独有功能.
4. 位于APB1总线上
**

通用定时器(TIM2~TIM5)的主要功能:

  1. 16位向上、向下、向上/下自动装载计数器

  2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值

  3. 4 个独立通道(TIMx_CH1~4)可以用作:
    测量输入信号的脉冲长度( 输入捕获)
    输出比较
    单脉冲模式输出
    PWM输出(边缘或中间对齐模式)

  4. 支持针对定位的增量(正交)编码器和霍尔传感器电路

  5. 如下事件发生时产生中断/DMA:
    更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    输入捕获
    输出比较

  6. 位于APB1总线上

CubeMX创建freertos工程

CubeMX工程中我选的芯片为STM32F103C8T6

1、设置RCC

设置高速外部时钟HSE 选择外部时钟源

2、设置时钟

选择外部时钟为8MHz,在HCLK中直接输入72,CubeMX会自动配置好。

设置时钟后,需要选择系统时钟来源,当使用了FreeRtos的时候,强烈建议HAL库使用除了Systick以外的时钟源。也就是说当不使用FreeRtos的时候,HAL使用的是systick作为时钟源,现在使用了rtos,不建议hal库和rtos一起使用systick作为时钟源。在这里我选择了TIM1作为HAL库时钟。

3、设置定时器

定时器选择内部时钟
Prtscaler (定时器分频系数) : 7199
Counter Mode(计数模式) Up(向上计数模式)
Counter Period(自动重装载值) : 4999
CKD(时钟分频因子) : No Division 不分频
auto-reload-preload(自动重装载) : Enable 使能

在这里定时器溢出时间公式,根据公式溢出时间为500ms

在NVIC Settings中使能定时器中断

4、配置freeRTOS

在Middleware中选中FREERTOS

根据自己需要裁剪freertos,我一般选中系统默认配置。

编写定时器中断代码

在这里使用了两个定时器,定时器3每1s触发一次,优先级为4(优先级分组4),定时器4每0.5s触发一次,优先级为5,在FreeRTOS中优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断在临界代码段开启时会被屏蔽(这里优先级越高,数字越低)。如果使用FreeRTOS默认配置的话configMAX_SYSCALL_INTERRUPT_PRIORITY为5。在任务中会开启临界代码段观察定时器情况。

任务代码

在这里使用的HAL_Delay(5000);会用到TIM定时器1,他的优先级等于0,优先级最高!

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){printf("close\r\n");portDISABLE_INTERRUPTS();HAL_Delay(5000);printf("open\r\n");portENABLE_INTERRUPTS();osDelay(2000);}/* USER CODE END StartDefaultTask */
}

定时器回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* USER CODE BEGIN Callback 0 *//* USER CODE END Callback 0 */if (htim->Instance == TIM1) {HAL_IncTick();}/* USER CODE BEGIN Callback 1 */if (htim->Instance == TIM3){printf("time3\r\n");}if (htim->Instance == TIM4){printf("time4\r\n");}/* USER CODE END Callback 1 */
}

定时器相关函数讲解:

  /* USER CODE BEGIN 2 *//*使能定时器3、4中断*/HAL_TIM_Base_Start_IT(&htim3);HAL_TIM_Base_Start_IT(&htim4);/* USER CODE END 2 */

打开定时器

HAL_TIM_IRQHandler(&htim2);

定时器中断处理函数在stm32f4xx_it.c中 ,定时器中断服务函数中这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断…),然后进入相应的中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,这里我们是使用定时器溢出中断回调函数
void TIM3_IRQHandler(void) 首先进入中断函数HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数(此处为溢出中断)
在中断回调函数中添加用户代码你也可以在在stm32f1xx_it.c中找到中断回调函数

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

现象

在开启临界保护时,优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断不会被触发,而time3定时器为4,所有可以一直触发。当关闭临界保护后,time4中断才能被触发。

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习相关推荐

  1. STM32CubeMX 实战教程:定时器中断实验(LL 库)

    1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取: 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章:   博主分享不易,请给三连哦(关注 + 点赞 + 收藏 ...

  2. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  3. 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲

    [STM32]STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 前言 本教程文章是我在学习STM32标准库和HAL库后写的,想通过标准库与HAL库的对照学习加强我对STM32的 ...

  4. 基于在STM32下完成FreeRTOS的多任务程序开发,多任务串口以及AHT20封装库,原理图,PCB图以及AHT20(实际用到的是LMT70)及采集一次温度数据的模块实战

    基于在STM32下完成FreeRTOS的多任务程序开发,多任务串口以及AHT20封装库,原理图,PCB图以及AHT20(实际用到的是LMT70)及采集一次温度数据的模块实战 序 言 1)FreeRTO ...

  5. STM32CubeMX Nucleo F767ZI 教程(2)

    STM32CubeMX Nucleo F767ZI 教程(2) STM32CubeMX Nucleo F767ZI 教程(1) STM32CubeMX Nucleo F767ZI 教程(2) 文章目录 ...

  6. STM32 | STM32CubeMX基础之TIM

    一.定时器分类 定时器主要分为三类定时器: 基本定时器(TIM6,TIM7),通用定时器(TIM2~TIM5),高级定时器(TIM1,TIM8). 基本定时器(TIM6,TIM7) 可以看到,基本定时 ...

  7. FreeRTOS之软件定时器详解

    关注.星标公众号,直达精彩内容 来源:网络素材 整理:技术让梦想更伟大 | 李肖遥 定时器可以说是每个 MCU 都有的外设,有的 MCU 其定时器功能异常强大,比如提供 PWM.输入捕获等功能.但是最 ...

  8. STM32单片机基础12——使用通用定时器产生PWM驱动蜂鸣器

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的通用定时器外设,产生PWM驱动无源蜂鸣器. 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM ...

  9. STM32CubeMX配置freertos配置任务(一)

    使用STM32CubeMX 配置Freertos 生成一个任务点亮LED stm32cubemx STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具, 允许用 ...

  10. 基于STM32滴答时钟的多任务定时器

    基于STM32滴答时钟的多任务定时器 基于STM32滴答时钟的多任务定时器 概述 声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责. API说明 滴答时钟初始化并创建 ...

最新文章

  1. 系统分析与仿真1-单输入单输出质量块+阻尼器系统
  2. 正则东西类,简化正则匹配
  3. System.Xml名称空间下的支持DOM的类型
  4. Mybatis3 源码解析系列
  5. 轻飘飘的旧时光就这么溜走
  6. Ora-12505 故障
  7. 暴风影音- C++研发工程师(windows方向-在线视频)
  8. 惠达卫浴引入USB服务器远程管控网银U盾
  9. flash关闭硬件加速 关闭自动升级
  10. 变上限积分求导的原理
  11. 可见首发《模式识别与智能计算:MATLAB技术实现(第2版)》 百度网盘 下载 分享
  12. [JS]HTML中把图片划分成多个作用区域的区域标记
  13. Git配置本地分支、远程分支、合并分支、撤销合并分支
  14. python编程技术解决英语单词测试(包括添加英文单词、查询英文单词和查询英文单词)以及绘制雷达图功能
  15. springboot奥运会志愿者管理系统
  16. 软件测试用户场景分析写什么,用户研究 | 研究人员必备的52个用研名词
  17. 假设检验中原假设和备择假设的选取问题
  18. 熬夜学Java语言-内部类种类解读
  19. 离线环境安装python第三方库
  20. 一份网站seo优化整体解决方案

热门文章

  1. webstorm破解之jar包破解(2018)
  2. Linux系统编程——进程间通信概述
  3. oracle ocp考题,Oracle OCP认证考试题库更新,052新考题整理(带答案)-72
  4. 网易云音乐虚化图片html,网易云音乐怎么换背景 背景图片设置方法
  5. 智能家居(1)行业发展分析
  6. python怎么过滤停用词_第6天:文本处理流程——停用词的过滤、正则化操作
  7. 在Windows下安装GmSSL
  8. 【知识点总结】大数据技术原理与应用
  9. STM32学习笔记(正点原子STM32Mini版)
  10. Win7 便签设置字体方法