0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32任务调度和管理

汽车玩家 来源:CSDN 作者:CSDN 2021-07-23 09:22 次阅读

STM32F103ZE的AHB时钟为72MHz,通过HSE的8M倍频到72M,然后APB1预分频系数为2,所以TIM2-7时钟为2*36M。由于定时器是16位,PSC寄存器最大为65536,不支持71999,所以只能以0.1ms计数。

整个系统在获取时间的累增时,定义64位变量,即可运行很久的时间,不用担心溢出或者死机。定义64位变量有2个方法,一就是用long long 直接定义,通过sizeof测试为8个字节;二就是利用”stdint.h”,typedef uint64_t u64。

一般情况下,定时器计时结果算法公式为:Tout = (ARR+1)(PSC+1)/Tclk。Tclk即为时钟频率。

准备工作

  • 1)建立一个struct

typedef struct{

void (*fTask)(void);

u32 uNextTick;

u32 uLenTick;

}sTask;

1

2

3

4

5

  • 2)任务列表

static sTask mTaskTab[] =

{

{Task_SysTick, 0, 0} ,

{Task1, 0, 100} , // 10ms执行一次

{Task2, 0, 200} // 200ms执行一次

};

1

2

3

4

5

6

  • 3)初始化定时器

void TaskTimer_Init()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = 65535;

TIM_TimeBaseStructure.TIM_Prescaler = 7199;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_SetCounter(TIM2, 0);

/* TIM enable counter */

TIM_Cmd(TIM2, ENABLE);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

  • 4)获取启动后时间

u64 GetTimingTick()

{

return TimingTick;

}

1

2

3

4

  • 5)任务执行期间获取系统时间

在这里插入void Task_SysTick()

{

u32 temp = TIM_GetCounter(TIM2);

if(temp > 10000)

{

TIM_SetCounter(TIM2,0);

TimingTickHold = TimingTickHold + temp;

temp = 0;

}

TimingTick = temp + TimingTickHold;

}

1

2

3

4

5

6

7

8

9

10

11

运行实例

#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))

static sTask mTaskTab[] =

{

{Task_SysTick, 0, 0},

{DATA_HANDLE, 0, 500},//50ms

{Key_Scan, 0, 500}

};

while(1)

{

for(int i = 0;i < ARRAYSIZE(mTaskTab);i++ )

{

if(mTaskTab[i].uNextTick <= GetTimingTick() )

{

mTaskTab[i].uNextTick += mTaskTab[i].uLenTick;

mTaskTab[i].fTask();

}

}

}

文章整合自:CSDN

编辑:ymf

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114432
  • 时钟频率
    +关注

    关注

    0

    文章

    49

    浏览量

    20320
  • HSE
    HSE
    +关注

    关注

    0

    文章

    17

    浏览量

    9441
收藏 人收藏

    评论

    相关推荐

    负载管理器的主要功能

    负载管理器(Load Manager)是计算机系统中的一个关键组件,它负责分配和管理计算资源,以确保系统运行的效率和稳定性。负载管理器的主要功能包括任务
    的头像 发表于 10-10 11:26 274次阅读

    ESP32C3任务执行一段时间,会出现任务不运行的问题,为什么?

    ESP32C3任务执行一段时间,会出现任务不运行的问题, 不运行的任务优先级低,并且任务的延时时间为vTaskDelay(100/ portTICK_PERIOD_MS);
    发表于 06-05 07:23

    鸿蒙开发接口资源调度:【@ohos.workScheduler (延迟任务调度)】

    开发者在开发应用时,通过调用延迟任务注册接口,注册对实时性要求不高的延迟任务,该任务默认由系统安排,在系统空闲时根据性能、功耗、热等情况进行调度执行。
    的头像 发表于 06-04 10:01 854次阅读
    鸿蒙开发接口资源<b class='flag-5'>调度</b>:【@ohos.workScheduler (延迟<b class='flag-5'>任务</b><b class='flag-5'>调度</b>)】

    请问CMSIS-RTOS RTX的任务调度锁在哪里?

    请问一下,CMSIS-RTOS RTX的任务调度锁在哪里?谢谢!
    发表于 05-13 08:28

    浅析FreeRTOS任务调度器的三种调度算法和应用

    FreeRTOS在MCU领域应用非常广泛,今天就给大家讲解一下FreeRTOS调度器中的三种调度算法,以及在瑞萨RZ/T2L MPU中的应用。
    的头像 发表于 05-10 14:02 6915次阅读
    浅析FreeRTOS<b class='flag-5'>任务</b><b class='flag-5'>调度</b>器的三种<b class='flag-5'>调度</b>算法和应用

    STM32CubeMX中的FreeRTOS创建3任务无法运行的原因?

    STM32CubeMX中的FreeRTOS 创建3任务 Task Priority =osPrioirityNoral 等级的任务,无法运行。 如果创建2个任务就可以。2个以上都不行
    发表于 05-09 07:02

    Windows 11任务管理器将CPU性能单位调整为MT/s

    以前,电脑内存的传输速度通常用MHz(兆赫兹)来衡量,即每秒能进行的循环次数,如3200MHz表示每秒可进行32亿次循环。然而,随着新技术的发展,DDR内存能够在不提升时钟频率(MHz)的前提下提高数据传输速率,这使得传统的计算方式不再准确。
    的头像 发表于 05-07 15:08 1633次阅读

    智慧园区:构建安全调度和预警管理系统

    随着科技的快速发展,智慧园区逐渐成为现代城市发展的热门话题。智慧园区以其先进的技术和创新的管理模式,为企业和居民提供更高效、便捷的服务。在智慧园区中,安全调度和预警管理是一项至关重要的任务
    的头像 发表于 05-06 16:40 473次阅读
    智慧园区:构建安全<b class='flag-5'>调度</b>和预警<b class='flag-5'>管理</b>系统

    智慧园区安全调度管理都有哪些

    园区当中极为重要的一点,安全调度也格外的受大家重视。 今天,古河云科技小编就来给大家说一说智慧园区安全调度管理都有哪些: 指挥调度平台涵盖了设备告警、快速定位、人员
    的头像 发表于 04-28 15:13 278次阅读
    智慧园区安全<b class='flag-5'>调度</b><b class='flag-5'>管理</b>都有哪些

    STM32F103VE运行的STM32CubeMX生成的freertos工程,FreeRTOS堆栈设置导致任务不执行切换怎么解决?

    TASK1任务堆栈更改为128的话,就不执行任务切换,只有TASK1的任务在运行 代码如下 #define START_TASK_PRIO 1 #define START_STK_SIZE128
    发表于 04-26 07:51

    STM32F103 FreeRTOS任务调度异常的原因?

    ) { vTaskDelay(500); //延时函数(任务调度) printf(\"Task1rn\");//串口打印 } } void Task2_Task(void
    发表于 04-16 06:24

    FreeRTOS任务调度器的三种调度算法讲解(下)

    配置如下时,调度算法就会变成不带时间片的抢占式调度
    的头像 发表于 03-21 13:46 2444次阅读
    FreeRTOS<b class='flag-5'>任务</b><b class='flag-5'>调度</b>器的三种<b class='flag-5'>调度</b>算法讲解(下)

    鸿蒙OS 分布式任务调度

    鸿蒙OS 分布式任务调度概述 在 HarmonyO S中,分布式任务调度平台对搭载 HarmonyOS 的多设备构筑的“超级虚拟终端”提供统一的组件
    的头像 发表于 01-29 16:50 453次阅读

    鸿蒙原生应用/元服务开发-延迟任务说明(一)

    添加到执行队列,系统会根据内存、功耗、设备温度、用户使用习惯等统一调度拉起应用。 二、运行原理 图1 延迟任务实现原理 应用调用延迟任务接口添加、删除、查询延迟任务,延迟
    发表于 01-16 14:57

    FreeRTOS中的任务管理

    任务是 FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 941次阅读