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使用MDK開發中的一些常見問題
下一篇:最后一頁
推薦閱讀
史海拾趣