diff options
author | Damien George <damien.p.george@gmail.com> | 2014-03-14 00:33:07 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-03-14 00:33:07 +0000 |
commit | 33bdd2119d9ca28404acc2b0891d5a74997a0d05 (patch) | |
tree | 0738cc145c8fb8779c104c250b5aec44c259b5ae | |
parent | b30c02afa078f7713faa14087ae28433dee49027 (diff) | |
parent | deb413e8baf96a4638c73f26fbe4de99380abaf9 (diff) | |
download | micropython-33bdd2119d9ca28404acc2b0891d5a74997a0d05.tar.gz micropython-33bdd2119d9ca28404acc2b0891d5a74997a0d05.zip |
Merge branch 'master' of github.com:micropython/micropython
Conflicts:
stmhal/main.c
-rw-r--r-- | stmhal/hal/src/stm32f4xx_hal.c | 12 | ||||
-rw-r--r-- | stmhal/main.c | 25 | ||||
-rw-r--r-- | stmhal/pybmodule.c | 2 | ||||
-rw-r--r-- | stmhal/pyexec.c | 4 | ||||
-rw-r--r-- | stmhal/systick.c | 48 | ||||
-rw-r--r-- | stmhal/systick.h | 3 |
6 files changed, 30 insertions, 64 deletions
diff --git a/stmhal/hal/src/stm32f4xx_hal.c b/stmhal/hal/src/stm32f4xx_hal.c index 6df59f9f9a..672422553e 100644 --- a/stmhal/hal/src/stm32f4xx_hal.c +++ b/stmhal/hal/src/stm32f4xx_hal.c @@ -281,11 +281,13 @@ uint32_t HAL_GetTick(void) */
void HAL_Delay(__IO uint32_t Delay)
{
- uint32_t timingdelay;
-
- timingdelay = HAL_GetTick() + Delay;
- while(HAL_GetTick() < timingdelay)
- {
+ uint32_t start = HAL_GetTick();
+
+ // Note that the following works (due to the magic of 2's complement numbers)
+ // even when Delay causes wraparound.
+
+ while (HAL_GetTick() - start <= Delay) {
+ __WFI(); // enter sleep mode, waiting for interrupt
}
}
diff --git a/stmhal/main.c b/stmhal/main.c index 4b502fcf24..865b4fa59c 100644 --- a/stmhal/main.c +++ b/stmhal/main.c @@ -72,10 +72,10 @@ void flash_error(int n) { for (int i = 0; i < n; i++) { led_state(PYB_LED_R1, 1); led_state(PYB_LED_R2, 0); - sys_tick_delay_ms(250); + HAL_Delay(250); led_state(PYB_LED_R1, 0); led_state(PYB_LED_R2, 1); - sys_tick_delay_ms(250); + HAL_Delay(250); } led_state(PYB_LED_R2, 0); } @@ -248,7 +248,6 @@ int main(void) { #endif // basic sub-system init - sys_tick_init(); pendsv_init(); led_init(); @@ -278,16 +277,16 @@ int main(void) { while (1) { led_state(led, 1); usart_tx_strn_cooked(pyb_usart_global_debug, "on\n", 3); - sys_tick_delay_ms(100); + HAL_Delay(100); led_state(led, 0); usart_tx_strn_cooked(pyb_usart_global_debug, "off\n", 4); - sys_tick_delay_ms(100); + HAL_Delay(100); led_state(led, 1); usart_tx_strn_cooked(pyb_usart_global_debug, "on\n", 3); - sys_tick_delay_ms(100); + HAL_Delay(100); led_state(led, 0); usart_tx_strn_cooked(pyb_usart_global_debug, "off\n", 4); - sys_tick_delay_ms(700); + HAL_Delay(700); led = (led % 4) + 1; } @@ -362,7 +361,7 @@ soft_reset: reset_filesystem = false; break; } - sys_tick_delay_ms(10); + HAL_Delay(10); } } #endif @@ -378,7 +377,7 @@ soft_reset: // LED on to indicate creation of LFS led_state(PYB_LED_R2, 1); - uint32_t stc = sys_tick_counter; + uint32_t start_tick = HAL_GetTick(); res = f_mkfs("0:", 0, 0); if (res == FR_OK) { @@ -400,7 +399,7 @@ soft_reset: f_close(&fp); // keep LED on for at least 200ms - sys_tick_wait_at_least(stc, 200); + sys_tick_wait_at_least(start_tick, 200); led_state(PYB_LED_R2, 0); } else { __fatal_error("could not access LFS"); @@ -424,7 +423,7 @@ soft_reset: // LED on to indicate creation of boot.py led_state(PYB_LED_R2, 1); - uint32_t stc = sys_tick_counter; + uint32_t start_tick = HAL_GetTick(); FIL fp; f_open(&fp, "0:/boot.py", FA_WRITE | FA_CREATE_ALWAYS); @@ -434,7 +433,7 @@ soft_reset: f_close(&fp); // keep LED on for at least 200ms - sys_tick_wait_at_least(stc, 200); + sys_tick_wait_at_least(start_tick, 200); led_state(PYB_LED_R2, 0); } } @@ -550,7 +549,7 @@ soft_reset: } accel_read_nack(); usb_hid_send_report(data); - sys_tick_delay_ms(15); + HAL_Delay(15); } } #endif diff --git a/stmhal/pybmodule.c b/stmhal/pybmodule.c index f0a7ebb6dc..b039514394 100644 --- a/stmhal/pybmodule.c +++ b/stmhal/pybmodule.c @@ -116,7 +116,7 @@ STATIC mp_obj_t pyb_millis(void) { STATIC MP_DEFINE_CONST_FUN_OBJ_0(pyb_millis_obj, pyb_millis); STATIC mp_obj_t pyb_delay(mp_obj_t count) { - sys_tick_delay_ms(mp_obj_get_int(count)); + HAL_Delay(mp_obj_get_int(count)); return mp_const_none; } diff --git a/stmhal/pyexec.c b/stmhal/pyexec.c index 2eca892a90..4f2e3dd9d5 100644 --- a/stmhal/pyexec.c +++ b/stmhal/pyexec.c @@ -59,7 +59,7 @@ int stdin_rx_chr(void) { if (pyb_usart_global_debug != PYB_USART_NONE && usart_rx_any(pyb_usart_global_debug)) { return usart_rx_char(pyb_usart_global_debug); } - sys_tick_delay_ms(1); + HAL_Delay(1); #if 0 if (storage_needs_flush()) { storage_flush(); @@ -142,7 +142,7 @@ int readline(vstr_t *line, const char *prompt) { } else { escape = 0; } - sys_tick_delay_ms(1); + HAL_Delay(1); } } diff --git a/stmhal/systick.c b/stmhal/systick.c index eda39c7888..d6c914886a 100644 --- a/stmhal/systick.c +++ b/stmhal/systick.c @@ -2,47 +2,15 @@ #include "misc.h" #include "systick.h" -void sys_tick_init(void) { - // SysTick_Config is now called from HAL_RCC_ClockConfig, which is called - // from SystemClock_Config - - // SysTick_Config sets the SysTick_IRQn to be the lowest priority, but - // we want it to be the highest priority, so fix things here. - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -void sys_tick_delay_ms(uint32_t delay_ms) { - sys_tick_wait_at_least(HAL_GetTick(), delay_ms); -} - -// waits until at least delay_ms milliseconds have passed from the sampling of stc -// handles overflow properl -// assumes stc was taken from HAL_GetTick() some time before calling this function -// eg stc <= HAL_GetTick() for the case of no wrap around of HAL_GetTick() -void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms) { - // stc_wait is the value of HAL_GetTick() that we wait for - uint32_t stc_wait = stc + delay_ms; - if (stc_wait < stc) { - // stc_wait wrapped around - while (stc <= HAL_GetTick() || HAL_GetTick() < stc_wait) { - __WFI(); // enter sleep mode, waiting for interrupt - } - } else { - // stc_wait did not wrap around - while (stc <= HAL_GetTick() && HAL_GetTick() < stc_wait) { - __WFI(); // enter sleep mode, waiting for interrupt - } - } +bool sys_tick_has_passed(uint32_t start_tick, uint32_t delay_ms) { + return HAL_GetTick() - start_tick >= delay_ms; } -bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { - // stc_wait is the value of HAL_GetTick() that we wait for - uint32_t stc_wait = stc + delay_ms; - if (stc_wait < stc) { - // stc_wait wrapped around - return !(stc <= HAL_GetTick() || HAL_GetTick() < stc_wait); - } else { - // stc_wait did not wrap around - return !(stc <= HAL_GetTick() && HAL_GetTick() < stc_wait); +// waits until at least delay_ms milliseconds have passed from the sampling of +// startTick. Handles overflow properly. Assumes stc was taken from +// HAL_GetTick() some time before calling this function. +void sys_tick_wait_at_least(uint32_t start_tick, uint32_t delay_ms) { + while (!sys_tick_has_passed(start_tick, delay_ms)) { + __WFI(); // enter sleep mode, waiting for interrupt } } diff --git a/stmhal/systick.h b/stmhal/systick.h index ce33e849b8..4df45cb9a7 100644 --- a/stmhal/systick.h +++ b/stmhal/systick.h @@ -1,5 +1,2 @@ -void sys_tick_init(void); -void SysTick_Handler(void); -void sys_tick_delay_ms(uint32_t delay_ms); void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms); bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms); |