一、配置过程

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设置的为单次定时器。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐