FreeRTOS之软件定时器

2023-11-14

FreeRTOS之软件定时器

声明:本人按照正点原子的FreeRTOS例程进行学习的,欢迎各位大佬指责和批评,谢谢!

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"
#include "string.h"
#include "malloc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
/************************************************
 ALIENTEK 探索者STM32F407开发板 FreeRTOS实验14-4
 FreeRTOS互斥信号量操作实验-库函数版本
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

//任务优先级
#define START_TASK_PRIO			1
//任务堆栈大小	
#define START_STK_SIZE 			256  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define TIMER_TASK_PRIO			2
//任务堆栈大小	
#define TIMER_STK_SIZE 			256  
//任务句柄
TaskHandle_t TimerTask_Handler;
//任务函数
void timer_task(void *pvParameters);

TimerHandle_t AutoReloadTimer_Handle;//周期定时器句柄

TimerHandle_t OneShotTimer_Handle;//单次定时器
void AutoReloadCallback( TimerHandle_t xTimer );
void OneShotCallback( TimerHandle_t xTimer );

//LCD刷屏时使用的颜色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      
						GRED,  GBLUE, RED,   MAGENTA,       	 
						GREEN, CYAN,  YELLOW,BROWN, 			
						BRRED, GRAY };

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);					//初始化延时函数
	uart_init(115200);     				//初始化串口
	LED_Init();		        			//初始化LED端口
	KEY_Init();							//初始化按键
	BEEP_Init();						//初始化蜂鸣器
	LCD_Init();							//初始化LCD
	my_mem_init(SRAMIN);            	//初始化内部内存池
    
    POINT_COLOR = RED;
	LCD_ShowString(30,10,200,16,16,"ATK STM32F103/407");	
	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 14-4");
	LCD_ShowString(30,50,200,16,16,"Mutex Semaphore");
	LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,90,200,16,16,"2016/11/25");
	
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
	
    //创建周期性定时器
    AutoReloadTimer_Handle = xTimerCreate((const char * )   "AutoReloadTimer",
                                          (TickType_t   )   1000,       //1s
                                          (UBaseType_t  )   pdTRUE,     //周期
                                          (void * )   1,
                                          (TimerCallbackFunction_t) AutoReloadCallback );
    //创建单次定时器
    OneShotTimer_Handle = xTimerCreate(   (const char * )   "OneShotTimer",
                                          (TickType_t   )   2000,//2s
                                          (UBaseType_t  )   pdFALSE,//单次
                                          (void * )   2,
                                          (TimerCallbackFunction_t) OneShotCallback );                                      
    //创建定时器任务
    xTaskCreate((TaskFunction_t )timer_task,             
                (const char*    )"timer_task",           
                (uint16_t       )TIMER_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TIMER_TASK_PRIO,        
                (TaskHandle_t*  )&TimerTask_Handler);   
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

void timer_task(void *pvParameters)
{
    u8 key;
    BaseType_t err;
	while(1)
	{
        key = KEY_Scan(0);
        switch(key)
        {
            case WKUP_PRES://开启周期定时器
                err = xTimerStart(AutoReloadTimer_Handle,0);
                if(err == pdFAIL)
                {
                    printf("周期性定时器开启失败\r\n");
                }else
                    printf("周期性定时器开启成功\r\n");
                break;
            case KEY1_PRES://关闭周期定时器
                err = xTimerStop(AutoReloadTimer_Handle,0);
                if(err == pdFAIL)
                {
                    printf("周期性定时器关闭失败\r\n");
                }else
                    printf("周期性定时器关闭成功\r\n");
                break;
            case KEY0_PRES://开启周期定时器
                err = xTimerStart(OneShotTimer_Handle,0);
                if(err == pdFAIL)
                {
                    printf("单次定时器开启失败\r\n");
                }else
                    printf("单次定时器开启成功\r\n");
                break;
            case KEY2_PRES://关闭周期定时器
                err = xTimerStop(OneShotTimer_Handle,0);
                if(err == pdFAIL)
                {
                    printf("单次定时器关闭失败\r\n");
                }else
                    printf("单次定时器关闭成功\r\n");
                break;
                
        }

        vTaskDelay(10);
	}
}
//周期定时器回调函数
void AutoReloadCallback( TimerHandle_t xTimer )
{
    static u8 timers=0;//当加到255的时候会清零
    
    printf("周期定时器回调函数=%d\r\n",timers++);
}
//单次定时器回调函数
void OneShotCallback( TimerHandle_t xTimer )
{
    static u8 timers=0;//当加到255的时候会清零
    
    printf("单次定时器回调函数=%d\r\n",timers++);
}

最后在串口调试助手上查看打印输出的内容:
在这里插入图片描述
结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS之软件定时器 的相关文章

  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 初入HTML

    1 HTML语言用来做什么 html语言专门用来描述网页 它属于一种标记语言 它是由一组标签构成 2 HTML元素 一个HTML元素是包含了开始标签和结束标签 当然 还有一些是单标签 例如 p 段落标签 p 双标签 br 换行标签 单标签
  • openlayers地图坐标coordinate转换为屏幕像素坐标pixel

    openlayers地图坐标coordinate转换为屏幕像素坐标pixel 网上查资料试了很多人的方法 需要各种转换但没成功 后来发现openlayers的map对象自带该方法 记录下来 希望帮助到大家 方法说明 获取坐标的像素坐标 这将
  • 随机森林补充缺失值

    导入必要的库 import numpy as np import pandas as pd from sklearn ensemble import RandomForestRegressor 读取数据 data data all1 找出所
  • 3D数学基础——向量与矩阵变换

    向量相乘 1 点乘 两个向量的点乘等于他们的数乘结果乘以两个向量之间家教的余弦值 v k v k cos cos v k v k 通过点乘的结果计算两个非单位向量的夹角 2 叉乘 叉乘只在3d空间中有定义 他需要两个不平行向量作为输入 生成
  • nvm install node没反应_LINUX使用nvm安装node,nrm的使用

    为什么要使用nvm来安装node 我们在开发过程中 特别是协作开发时 通常会对具体的node的版本有限制 我们使用nvm可以轻松解决这个问题 nvm安装node的好处就是可以切换node版本 用起来方便 所以介绍下如何使用nvm安装node
  • 【Vs Code 学习笔记】

    Vs Code 远程连接服务器 详细教程 默认你已经安装好了Vs Code 1 如果没有请参考官网链接 https code visualstudio com 直接安装就可以了 2 打开VsCode 你可以看到如下界面 然后在按照如下操作下
  • Java的Properties属性集、获取项目路径的3种方式(干货满满)

    属性集介绍 集合家族中有个成员java util Properties 它继承于Hashtable Properties是使用键值结构存储数据的 但它最大的特点是具有持久化功能 持久化 内存 gt 硬盘 持久化的过程必须依赖于IO流 对IO
  • MyBatis执行器与新增返回主键问题

    前提 在写需求时碰到一个问题 在新增加一条数据时需要返回主键并进行后续操作 发现当前项目并不能返回主键 正常返回主键代码 1
  • PTA C 7-3 计算职工工资

    给定N个职员的信息 包括姓名 基本工资 浮动工资和支出 要求编写程序顺序输出每位职员的姓名和实发工资 实发工资 基本工资 浮动工资 支出 输入格式 输入在一行中给出正整数N 随后N行 每行给出一位职员的信息 格式为 姓名 基本工资 浮动工资
  • C++继承

    继承的概念 继承 inheritance 机制是面向对象程序设计使代码可以复用的重要的手段 它允许程序员在保持原有类特性的基础上进行扩展 增加功能 这样产生新的类 称为派生类 继承呈现了面向对象程序设计的层次结构 体现了由简单到复杂的认知过
  • maven 报错Failed to execute goal org.apache.maven.pluginsmaven-archetype-plugin3.2

    新手走过各种各样的坑 idea中maven基础配置中总是出现各种各样的错误 在网上找了一些资料 发现并没有找到切入主题的解决方法 走过的坑总是记忆尤新 idea第一次配置maven 提示如下所示错误 仔细检查了一个maven的配置文件 发现
  • 正态分布函数_从微积分角度证明“正态分布密度函数”

    本篇我们来证明一个常见的优美的积分等式 聪明你是否看出如下等式曾在哪里出现过呢 没错如下和正态分布中概率密度函数很像 但我们仅从积分学的角度来分析正面它 证明它灵活的数学技巧 你准备好了吗 因为e x 2是关于x的偶函数 所以我们明显可以想
  • 安装SAS可能遇到的各种问题

    近日 为了提升数据分析的效率 准备开始学习SAS相关内容 结合自身已经掌握的Python 希望在数据分析 挖掘方向走的越来越远 下面 来分享下我安装SAS过程中遇到的各种问题 真是一个一个坑走过来的 系统环境 Windows 10 安装版本
  • 在对话框中实现预览图形文件的功能

    一 使用 acdbDisplayPreviewFromDwg 函数 1 引用说明 此功能获取由指定的图形的预览图像 如果有 pszDwgfilename 将其显示在由HWND参数pPreviewWnd标识的窗口中 图像尺寸最大变化不超过25
  • Anaconda3最新换国内源教程,中科大源或者清华源

    环境 ubuntu16 04 anaconda python 3 7 中科大源 conda config add channels https mirrors ustc edu cn anaconda pkgs main conda con
  • esp32 完整开发指南_【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯

    本博客学习由 安信可开源团队 潜心编写 做ESP32 A1S离线语音初步入门技术交流分享 如有不完善之处 请留言 本团队及时更改 一 前言 离线语音 顾名思义 在不连网络的状态下 产品能识别语音指令并执行相应的控制输出 安信可基于乐鑫ESP
  • @SpringQueryMap注解 feign的get传参方式

    SpringQueryMap注解 feign的get传参方式 问题 启动服务 传入参数测试 发现feign远程调用的方法入参失败 排查发现是feign接口调用controller方法的时候就没进来参 原因 spring cloud项目使用f
  • armeabi-v7a、arm64-v8a、armeabi、x86、x86_64的区别

    1 armeabi v7a 第七代及以上的ARM处理器 2011年以后生产的大部分Android设备都使用 2 arm64 v8a 第8代 64位ARM处理器 很少设备 三星GalaxyS6是其中之一 3 armeabi 第5代 第6代的A
  • go-zero 基础 -- 进阶指南

    版本 1 4 0 1 目录拆分 1 1 系统结构分析 在上文提到的商城系统中 每个系统在对外 http 提供服务的同时 也会提供数据给其他子系统进行数据访问的接口 rpc 因此每个子系统可以拆分成一个服务 而且对外提供了两种访问该系统的方式
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in