stmhal: Improve efficiency of SysTick IRQ and HAL_Delay.
SysTick IRQ now increases millisecond counter directly (ie without calling HAL_IncTick). Provide our own version of HAL_Delay that does a wfi while waiting. This more than halves power consumption when running a loop containing a pyb.delay call. It used to be like this, but new version of HAL library regressed this feature.nlr-macros
parent
3475b04101
commit
34e43c7ee9
|
@ -93,7 +93,7 @@
|
||||||
#define CMPCR_CMP_PD_BB (PERIPH_BB_BASE + (CMPCR_OFFSET * 32) + (CMP_PD_BitNumber * 4))
|
#define CMPCR_CMP_PD_BB (PERIPH_BB_BASE + (CMPCR_OFFSET * 32) + (CMP_PD_BitNumber * 4))
|
||||||
/* Private macro -------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
||||||
/* Private variables ---------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
||||||
static __IO uint32_t uwTick;
|
__IO uint32_t uwTick;
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
/* Private functions ---------------------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
|
@ -173,7 +173,11 @@ void PendSV_Handler(void) {
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void SysTick_Handler(void) {
|
void SysTick_Handler(void) {
|
||||||
HAL_IncTick();
|
// Instead of calling HAL_IncTick we do the increment here of the counter.
|
||||||
|
// This is purely for efficiency, since SysTick is called 1000 times per
|
||||||
|
// second at the highest interrupt priority.
|
||||||
|
extern __IO uint32_t uwTick;
|
||||||
|
uwTick += 1;
|
||||||
|
|
||||||
// Read the systick control regster. This has the side effect of clearing
|
// Read the systick control regster. This has the side effect of clearing
|
||||||
// the COUNTFLAG bit, which makes the logic in sys_tick_get_microseconds
|
// the COUNTFLAG bit, which makes the logic in sys_tick_get_microseconds
|
||||||
|
|
|
@ -33,6 +33,18 @@
|
||||||
#include "irq.h"
|
#include "irq.h"
|
||||||
#include "systick.h"
|
#include "systick.h"
|
||||||
|
|
||||||
|
// We provide our own version of HAL_Delay that calls __WFI while waiting, in
|
||||||
|
// order to reduce power consumption.
|
||||||
|
void HAL_Delay(uint32_t Delay) {
|
||||||
|
extern __IO uint32_t uwTick;
|
||||||
|
uint32_t start = uwTick;
|
||||||
|
// Wraparound of tick is taken care of by 2's complement arithmetic.
|
||||||
|
while (uwTick - start < Delay) {
|
||||||
|
// Enter sleep mode, waiting for (at least) the SysTick interrupt.
|
||||||
|
__WFI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool sys_tick_has_passed(uint32_t start_tick, uint32_t delay_ms) {
|
bool sys_tick_has_passed(uint32_t start_tick, uint32_t delay_ms) {
|
||||||
return HAL_GetTick() - start_tick >= delay_ms;
|
return HAL_GetTick() - start_tick >= delay_ms;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue