Skip to content
Snippets Groups Projects
Commit 34e43c7e authored by Damien George's avatar Damien George
Browse files

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.
parent 3475b041
Branches
No related tags found
No related merge requests found
...@@ -93,7 +93,7 @@ ...@@ -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) { ...@@ -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 @@ ...@@ -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;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment