当nrf52832使用浮点运算后,再做低功耗。功耗再怎么调,都比较高。这是因为,nrf52832使用FPU后,不会自动关闭,所以我们要解决这个功耗问题,需要在nrf52832不使用浮点运算时关闭FPU.实现方式是在FPU的中断中关闭FPU.如下:
/***********************************************************************************
* FPU IRQ
* 2020/11/3 add
* *********************************************************************************/
#define FPU_EXCEPTION_MASK 0x0000009F //!< FPU exception mask used to clear exceptions in FPSCR register.
#define FPU_FPSCR_REG_STACK_OFF 0x40 //!< Offset of FPSCR register stacked during interrupt handling in FPU part stack
/**
* @brief FPU Interrupt handler. Clearing exception flag at the stack.
*
* Function clears exception flag in FPSCR register and at the stack. During interrupt handler
* execution FPU registers might be copied to the stack (see lazy stacking option) and
* it is necessary to clear data at the stack which will be recovered in the return from
* interrupt handling.
*/
void FPU_IRQHandler(void)
{
// Prepare pointer to stack address with pushed FPSCR register.
uint32_t * fpscr = (uint32_t * )(FPU->FPCAR + FPU_FPSCR_REG_STACK_OFF);
// Execute FPU instruction to activate lazy stacking.
(void)__get_FPSCR();
// Clear flags in stacked FPSCR register.
*fpscr = *fpscr & ~(FPU_EXCEPTION_MASK);
}
在代码中添加以上代码即可,在不使用FPU的时候关闭FPU.