1. 如果你不跑操作系统,CPU肯定一直都是100%使用的,哪怕你里面是延时等待,CPU也是一直在执行空语句nop,因为STM32里面是有一个CPU。

2.对于stm32总是百分百。只是有多少时间空闲,多少时间干活!

3.

楼主的意思是实际CPU用来干正事的时间,在整个时间里的比例,打个比方,如果工作50mS,再等待200mS,完成一个大循环,那么CPU的使用率就是20%。

如果楼主的程序是以大循环方式做的,那么在进入等待前把一个IO口拉低,等待结束,开始工作,把IO口拉高,那么占空比就是使用率,当然这是在各种中断不是很频繁,而且中断里处理的事情很少的情况下有用,我经常这么估算MCU的速率富余度的,然后据此设置一个合适的MCU工作频率,降低不仅仅是CPU的功耗那一点点电能,如果是线性降压,整个功耗下降很多的,发热就低了,而且工作频率下降,CPU稳定性也会增强。

4. 首先,我们知道Cortex有几种内核的低功耗工作状态,Sleep, Stop, Standby
这里我用到的是Sleep状态,即设计程序时,当程序的任务处理完后,使单片机进入WFE或WFI的Sleep状态:

使用操作系统时,直接在空闲任务中添加__WFI();或__WFE();即可
裸机程序时,设计程序结构为大main循环为中断或事件触发的形式,即main循环等待队列中的任务,当队列为空时,执行__WFI();或__WFE();。添加队列的操作在串口、按键、计时器中断中进行,等等。

然后,我们采用的是外设的低功耗状态,即STM32的外设可以在内核进入低功耗状态后,手动或自动停止外设的时钟,当退出低功耗状态时手动或自动恢复外设始终。
由于我这方法是在F4上面实现的,采用F1实现时,会显得臃肿一些,大家理解啥意思就行了,采用F4时会方便很多。
这是F1的外设低功耗特性,可见,外设在内核进入低功耗状态时,外设时钟只能手动打开和关闭。

这是F4的外设低功耗特性,可见,外设在内核进入低功耗状态时,外设时钟可以自动关闭。

在使用F4时,我们就可以采用如TIM6和TIM7两个计时器
配置如下

  1. void tim6_init(void)
  2. {
  3. TIM_TimeBaseInitTypeDef TIM_InitStructure;
  4. RCC_APB1PeriphClockCmd      (RCC_APB1Periph_TIM6, ENABLE );
  5. RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM6, DISABLE);
  6. TIM_DeInit(TIM6);
  7. TIM_InitStructure.TIM_Prescaler         = 180;
  8. TIM_InitStructure.TIM_CounterMode       = TIM_CounterMode_Up;
  9. TIM_InitStructure.TIM_Period            = 65535;
  10. TIM_InitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;
  11. TIM_InitStructure.TIM_RepetitionCounter = 0;
  12. TIM_TimeBaseInit(TIM6, &TIM_InitStructure);
  13. TIM_SetCounter(TIM6, 0);
  14. TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);
  15. TIM_Cmd(TIM6, ENABLE);
  16. }
  17. void tim7_init(void)
  18. {
  19. TIM_TimeBaseInitTypeDef TIM_InitStructure;
  20. NVIC_InitTypeDef   NVIC_InitStructure;
  21. RCC_APB2PeriphClockCmd      (RCC_APB2Periph_SYSCFG, ENABLE);
  22. RCC_APB1PeriphClockCmd      (RCC_APB1Periph_TIM7,   ENABLE);
  23. RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM7,   ENABLE);
  24. TIM_DeInit(TIM7);
  25. TIM_InitStructure.TIM_Prescaler         = 180;
  26. TIM_InitStructure.TIM_CounterMode       = TIM_CounterMode_Up;
  27. TIM_InitStructure.TIM_Period            = 65535;
  28. TIM_InitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;
  29. TIM_InitStructure.TIM_RepetitionCounter = 0;
  30. TIM_TimeBaseInit(TIM7, &TIM_InitStructure);
  31. TIM_SetCounter(TIM7, 0);
  32. TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
  33. NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
  34. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
  35. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  36. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37. NVIC_Init(&NVIC_InitStructure);
  38. TIM_Cmd(TIM7, ENABLE);
  39. }

复制代码

TIM7中断代码如下:

  1. void TIM7_IRQHandler(void)
  2. {
  3. TIM7->SR           = ~TIM_IT_Update;
  4. CPU_TICK_USAGE     = TIM6->CNT;
  5. TIM6->CNT          = 0;
  6. }

复制代码

计算CPU使用率(%)如下:

  1. CPULoad   = (float)CPU_TICK_USAGE*100.0f/65535.0f

复制代码

当采用F1时,那就需要在每个中断的入口处,手动添加代码,使能TIM6时钟
并在每个__WFE();或__WFI();前手动添加代码,关闭TIM6时钟
在每个__WFE();或__WFI();后手动添加代码,使能TIM6时钟

当然,采用F1时,不用__WFE();或__WFI();而只用while循环也是一样的。

5.

围观,个人觉得既然是裸机,就没必要考虑CPU的使用率了

6.

dwiller_ARM 发表于 2014-2-20 13:58
围观,个人觉得既然是裸机,就没必要考虑CPU的使用率了

在一般的应用中还是可以采用的,如现在我做的变频器项目,可以通过查看CPU的使用率考虑算法的复杂性,并根据CPU使用率确定最高的采样频率和PWM周期,同时确定CPU主频选取的是否合适。按我的感觉是,CPU使用率为75~85%时最合适。

关于STM32的CPU的使用率~裸机不带系统相关推荐

  1. 芯片,SOC和MCU区别;裸机和带系统

    结论: (以上这是一个典型的soc包括进去的东西) (这是常见的soc,一般很多外面都有一个壳子,这个就是个壳子,东西都在里面,就是上图的那些东西,等于一个完整的单片机,当然也可以增或者减少) 注意邮 ...

  2. c# 获取进程cpu的使用率 简单试验

    1.概要 想了解程序的效率,和运行的风险,准备观察一个CPU和内存的占用率. 2.代码 using System; using System.Diagnostics; using System.Thr ...

  3. 迅为RK3568开发板Linux_NVR_SDK系统开发-查看NPU/GPU/CPU频率使用率

    iTOP-RK3568 开发板烧写 Linux_NVR_SDK 镜像,在串口终端输入以下命 令查看 NPU/GPU/CPU 频率使用率. 1 输入以下命令挂载 debug,只有挂载 debug 才可以 ...

  4. Linux环境下用Java获取CPU的使用率

    在Java编程过程中希望知道CPU的使用率,以便决定是否加载任务.首先用google搜了一下,Windows环境可以用JNI通过API函数 getProcessCPUTime()来得到,并有人给出了源 ...

  5. Linux | Centos下几种CPU查看使用率的常用命令

    文章目录 一.top 1.1 常用参数 二.free 三.vmstat 3.1 常用参数 3.2 获取信息 四.mpstat 4.1 安装 4.2 获取信息 一.top top命令是Linux下常用的 ...

  6. 【cpu_loading】/proc/stat统计cpu的使用率

    参考:http://www.blogjava.net/fjzag/articles/317773.html 基于目前正在开发的手机 proc伪文件系统 /proc文件系统是一个伪文件系统,它只存在内存 ...

  7. python电脑配置要求cpu-Python限制内存和CPU使用量的方法(Unix系统适用)

    问题 你想对在Unix系统上面运行的程序设置内存或CPU的使用限制. 解决方案 resource 模块能同时执行这两个任务.例如,要限制CPU时间,可以像下面这样做: import signal im ...

  8. 基于STM32+华为云IOT设计的酒驾监控系统

    1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交通事故也引起了人们的重视,为了减少和杜绝酒后驾车导致事故发生,当前设计了一种安装在驾驶室内,能根据具体功能进行鉴别酒精浓度 ...

  9. 毕业设计 STM32单片机的畜牧养殖场管理与检测系统 - 物联网

    基于STM32单片机的畜牧养殖场管理与检测系统 由 STM32F103C8T6单片机最小系统+定时模块+DHT11温湿度感应模块+OLED显示模块+键盘模块+气味传感器模块+继电器*4. 采用STM3 ...

最新文章

  1. Uva1627 Team them up!
  2. js原生选项卡(自动播放无缝滚动轮播图)二
  3. html语言把字变大,css怎么让字体变大?
  4. LeetCode 1298. 你能从盒子里获得的最大糖果数(BFS)
  5. 【数据库系统】大学模式
  6. Linux驱动(7)--最简单的驱动HelloWorld
  7. SpringBoot实战(十):统一异常处理
  8. POJ 1751 Highways (kruskal)
  9. 程序员面试 IT 公司,这些地方你要注意!
  10. Android应用程序开发以及背后的设计思想深度剖析(2)
  11. 根据excel生成mysql数据库,根据excel生成数据库脚本
  12. Win7+MATLAB2017a+虚拟光驱
  13. JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
  14. mysql 关键字 desc_mysql数据库表字段使用DESC等关键字报错及解决方法
  15. (日常)Dell R740 XD 服务器安装GPU显卡记录
  16. 祖冲之究竟是如何算出圆周率的?
  17. web前端简介 | 什么是前端
  18. 阿里巴巴Java开发手册github地址
  19. 【C语言】函数递归(详解)
  20. 4.vue常见指令v-for的基本使用

热门文章

  1. C语言课程设计——学生信息管理系统
  2. 一些可以查询IP地理位置、身份证所在地、手机归属地的接口
  3. 树状数组 + 二分 - Query HDU - 4339
  4. 「Flask入门」让它跑起来
  5. 《计算机程序设计艺术》作者高德纳
  6. 谈谈JavaScript中常见的数据类型
  7. java postgresql插件_PostgreSQL HLL插件介绍
  8. 输入中包含非法html,京东自定义视频代码安装不了,提示输入中包含非法外部HTML5引用怎么解决?...
  9. 关于 axios 取消重复请求的分析
  10. 京城、京味、京韵:从一台服务器看数字北京