datasheet

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

2019-06-13来源: eefocus关键字:STM32  CPU  使用率  裸机

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两个计时器

配置如下

void tim6_init(void)

{

        TIM_TimeBaseInitTypeDef TIM_InitStructure;


        RCC_APB1PeriphClockCmd      (RCC_APB1Periph_TIM6, ENABLE );

        RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM6, DISABLE);

        

        TIM_DeInit(TIM6);

        TIM_InitStructure.TIM_Prescaler         = 180;

        TIM_InitStructure.TIM_CounterMode       = TIM_CounterMode_Up;

        TIM_InitStructure.TIM_Period            = 65535;

        TIM_InitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;

        TIM_InitStructure.TIM_RepetitionCounter = 0;

        TIM_TimeBaseInit(TIM6, &TIM_InitStructure);

        TIM_SetCounter(TIM6, 0);

        TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);

        TIM_Cmd(TIM6, ENABLE);

}

void tim7_init(void)

{

        TIM_TimeBaseInitTypeDef TIM_InitStructure;

        NVIC_InitTypeDef   NVIC_InitStructure;

        

        RCC_APB2PeriphClockCmd      (RCC_APB2Periph_SYSCFG, ENABLE);

        RCC_APB1PeriphClockCmd      (RCC_APB1Periph_TIM7,   ENABLE);

        RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM7,   ENABLE);

        

        TIM_DeInit(TIM7);

        TIM_InitStructure.TIM_Prescaler         = 180;

        TIM_InitStructure.TIM_CounterMode       = TIM_CounterMode_Up;

        TIM_InitStructure.TIM_Period            = 65535;

        TIM_InitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;

        TIM_InitStructure.TIM_RepetitionCounter = 0;

        TIM_TimeBaseInit(TIM7, &TIM_InitStructure);

        TIM_SetCounter(TIM7, 0);

        TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

        

        NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

        

        TIM_Cmd(TIM7, ENABLE);

}




TIM7中断代码如下:

void TIM7_IRQHandler(void)

{

        TIM7->SR           = ~TIM_IT_Update;

        CPU_TICK_USAGE     = TIM6->CNT;

        TIM6->CNT          = 0;

}




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

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  使用率  裸机

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic464502.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32使用MDK开发中的一些常见问题
下一篇:ARM全解析 ARM8/ARM7/A9/A15等区别

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

用于stm32Discovery的图像转代码取模小工具

最近拿着st的官方板子在开发图形界面,看了下代码是直接把整个像素32bit拷贝到控制器中Graphic RAM(就是一块SDRAM)中的,所以以往遇到的生成器都不能用,在内部则又是转换费时费力,占用内存所以针对stm32的discovery lcd显示写了个图像代码生成的程序,可以直接生成32bit的ARGB格式代码等后面发一个成熟点的版本,目前还是有些容易遇到的bug
发表于 2019-06-15
用于stm32Discovery的图像转代码取模小工具

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2019-06-15

STM32CubeMx之串行通信

前言我的板子是:STM32ZGT6配置1.打开STM32CubeMX新建工程,选择STM32ZGT62.配置外部高速时钟RCC设置,选择HSE(外部高速时钟)为Crystal/Ceramic Resonator(晶振/陶瓷谐振器),我的开发板外部时钟是25MHZ。 3.配置串行通信选择Asynchronous异步通信。  串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。 生成报告以及代码,编译程序(最好单独生成.c和.h文件)。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void
发表于 2019-06-15

stm32 不断进入串口中断的bug解决方法

在使用stm32的时候,发现usart会莫名的卡在串口中断里,然而串口初始化只配置了RXNE中断,打断点发现不断进入中断却没不是RXNE中断引起的,经过查找资料发现是ORE的问题,2篇博文解决方案如下:http://bbs.21ic.com/icview-160999-1-1.html及http://blog.csdn.net/origin333/article/details/49992383大致原因为开启了RXNE中断之后 ORE也开启了,但是使用USART_GetITStatus却无法读取到ORE的标志位(未使能ERR时),这样也无法消除中断申请,自然一直进入串口中断,如果要消除ORE需要
发表于 2019-06-15

STM32串口USART用法的进阶(HAL库版本)

句话是绑定DMA,来源数USART1,目的是数组,定义好的。第二句是打开空闲中断it.c里面找到void USART1_IRQHandler(void){ UsartReceive_IDLE(&huart1);//自己添加一个函数,这就是中断,搬完以后,空闲中断 自己完成它  HAL_UART_IRQHandler(&huart1);}void UsartReceive_IDLE(UART_HandleTypeDef *huart)  {      uint32_t temp;      if
发表于 2019-06-15

STM32CubeMX学习教程之五:PWM实现呼吸灯效果

软件:STM32CubeMX V4.25.0  System Workbench V2.4固件库版本:STM32Cube FW_F1 V1.6.1硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号 首先设置RCC和SYS,如下图 然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图设置PC7 管脚为TIM3_CH2, 即定时器TIM3的Channel2然后设置TIM3的Channel2为PWM Generation CH2 从上一篇博文我们知道TIM3是挂在APB1总线上的,看时钟树我们知道
发表于 2019-06-15
STM32CubeMX学习教程之五:PWM实现呼吸灯效果

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved