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++);
}
最后在串口调试助手上查看打印输出的内容:
结束