按照评测计划,最后一项的评测任务是开发板各种工作模式下的功耗测试,本次测试参照了C70EH和北方两位老师的测试过程及代码,电流检测是利用了开发板上的JP5接口,为了方便测试,还特地做了一根杜邦线加香蕉插头的连接,用于连接数字万用表。本次测试使用的万用表型号是BS476830,精度不算高,但作为定性分析还是能胜任的。
测试的步骤是通过启用长短按键,根据按下的时间长短来选择执行何种工作模式。
在正常工作模式下,蓝绿两颗LED交替按1秒的频率闪烁,在进入其他模式前,蓝色LED闪烁1~4下,分别对应四种工作模式,然后绿色LED也闪烁同样次数,这样循环5次,最后进入选定的工作模式。
除Shutdown模式外,sleep,stop和standby三种模式都可以通过用户按键的中断来唤醒,唤醒后恢复了run模式,可以继续通过按键按下的时间长短选择其它模式的测试,shutdown模式则必须通过复位按键来唤醒。
下面是本次测试的主要代码:
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Initialize leds */
BSP_LED_Init(LED_GREEN);
BSP_LED_Init(LED_BLUE);
/* Initialize USER push-button, will be used to trigger an interrupt each time it's pressed.*/
BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
printf("NUCLEO-C71RB Board Powr Test.\n\r");
while (1)
{
switch (Mode){
case 0: //Run Mode
BSP_LED_On(LED_GREEN);
BSP_LED_Off(LED_BLUE);
delay_ms(500);
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_BLUE);
delay_ms(500);
break;
case 1: //Sleep Mode
for(i=0; i<6; i++){
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_BLUE);
delay_ms(500);
BSP_LED_Off(LED_BLUE);
delay_ms(500);
BSP_LED_On(LED_GREEN);
delay_ms(500);
BSP_LED_Off(LED_GREEN);
delay_ms(1500);
}
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode (PWR_MAINREGULATOR_ON ,PWR_SLEEPENTRY_WFI );
HAL_ResumeTick ();
break;
case 2: //Stop Mode
for(i=0; i<6; i++){
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(300);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(300);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(300);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(1000);
}
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode (PWR_MAINREGULATOR_ON ,PWR_STOPENTRY_WFI );
//���Ѻ���Ҫ��������RCCʱ��
SystemClock_Config();
HAL_ResumeTick ();
break;
case 3: //Standby Mode
for(i=0; i<6; i++){
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(200);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(200);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(200);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(200);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(1000);
}
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2 );
__HAL_PWR_CLEAR_FLAG (PWR_FLAG_WUF2);
HAL_PWR_EnterSTANDBYMode ();
break;
case 4: //Shutdown Mode
for(i=0; i<6; i++){
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(200);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(200);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
delay_ms(200);
BSP_LED_On(LED_BLUE);
delay_ms(200);
BSP_LED_Off(LED_BLUE);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(200);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(200);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(200);
BSP_LED_On(LED_GREEN);
delay_ms(200);
BSP_LED_Off(LED_GREEN);
delay_ms(1000);
}
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2 );
__HAL_PWR_CLEAR_FLAG (PWR_FLAG_WUF2);
HAL_PWREx_EnterSHUTDOWNMode();
break;
}
if(Keys>0){ //Keys Handler
printf("Keys=%d\n\r",Keys);
if(Keys<20){ //Run Mode
Mode = 0;
printf("Run Mode.\n\r");
}else if(Keys<40){ //Sleep Mode
Mode = 1;
printf("Sleep Mode.\n\r");
}else if(Keys<80){
Mode = 2; //Stop Mode
printf("Stop Mode.\n\r");
}else if(Keys<140){
Mode = 3; //Standby Mode
printf("Standby Mode.\n\r");
}else{
Mode = 4;
printf("Shutdown Mode.\n\r");
}
Keys = 0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这是按键中断回调函数,用于获得按下时间的长短:
``
/*****
- 按键中断回调函数
*****/
void BSP_PB_Callback(Button_TypeDef Button)
{
if(HAL_GPIO_ReadPin(BUTTON_USER_GPIO_PORT,BUTTON_USER_PIN) == RESET){
while(HAL_GPIO_ReadPin(BUTTON_USER_GPIO_PORT,BUTTON_USER_PIN) == RESET){
if(Keys<250){
Keys++;
delay_ms(20);
}
}
}
}
经过测试,stop模式下的工作电流最低,约0.65mA:

standby模式和shutdown模式的工作电流基本相同,约0.82mA左右:

sleep模式下的工作电流约1.96mA,大约是standby模式的一倍:
开发板在正常工作模式下,仅轮流驱动两颗LED闪烁时,工作电流大约是sleep模式的一倍,为3.9mA左右。
至此,开发板的功耗测试圆满完成。 |