一、配置过程
1、配置RCC、USART1、时钟84M
2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。
3、初始化LED的两个引脚、两个按键引脚
4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可
5、打开定时器选项
6、创建两个定时器,一个周期定时器,一个单次定时器
Timer Name: 定时器名称
Callback: 回调函数名称
Type: 定时器类型,osTimerPeriodic周期定时器,osTimerOnce单次定时器
Code Generation Option: 代码生成选项
Parameter: 回调函数形参,不用的时候配置为0或NULL即可
Allocation: 分配方式:Dynamic 动态内存创建
Conrol Block Name: 控制块名称
7、生成代码
二、API
1、创建软件定时器:osTimerCreate
osTimerId timer01_stackHandle;
osTimerDef(timer01_stack, timer01_thread_entry);
timer01_stackHandle = osTimerCreate(osTimer(timer01_stack), osTimerPeriodic, NULL);
2、启动定时器:osTimerStart,可以在中断中使用,单位为ms
osTimerStart(timer01_stackHandle,1000);
3、停止定时器:osTimerStop,可以在中断中使用
osTimerStop(timer01_stackHandle);
4、删除定时器
osTimerDelete(timer01_stackHandle)
三、代码使用
1、在函数void StartDefaultTask(void const * argument)中开启定时器
void StartDefaultTask(void const * argument)
{
osTimerStart(timer01_stackHandle,1000);
osTimerStart(timer02_stackHandle,2000);
for(;;)
{
osDelay(1);
}
}
2、在定时器1和定时器2中添加代码来验证定时器是否工作,定时器1设置的为循环定时器,定时器2设置的为单次定时器
TickType_t tick_num;
uint32_t a;
void timer01_thread_entry(void const * argument)
{
tick_num=osKernelSysTick();
a++;
}
TickType_t tick_num1;
uint32_t a1;
void timer02_thread_entry(void const * argument)
{
tick_num1=osKernelSysTick();
a1++;
}
进行debug后发现,开始执行后a的数值每秒增加1,tick_num每秒增加1000。a1在开始执行两秒后+1,tick_num=2000,且之后不再进行工作,因为timer2设置的为单次定时器。