FreeRTOS之软件定时器

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++);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值