ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
311024
Chum_A (28.02.2012 18:09, просмотров: 8375)
Организация задержки на Cortex-овском SysTick без использования прерывания. Чесал репу, чего-то красиво не получается, как-то вот так: http://code.google.com/p/lpc1343codebase/source/browse/branches/v0.92/core/systick/systick.c?spec=svn187&r=187
// delay - собственно сколько ждать, 0 не пользуем // LOAD - содержимое SysTick->LOAD, SysTick работает в режиме перезагрузки cur_val = SysTick->VAL; if(cur_val <= delay) { stop = LOAD - delay + cur_val; while( !(SysTick->CTRL & COUNTFLAG) ); } else stop = cur_val - delay; while( (SysTick->VAL > stop) && !(SysTick->CTRL & COUNTFLAG) ); По ссылке нашёл: /**************************************************************************/ /*! @brief Causes a blocking delay for 'delayTicks' ticks on the systick timer. For example: systickDelay(100) would cause a blocking delay for 100 ticks of the systick timer. @param[in] delayTicks The number of systick ticks to cause a blocking delay for @Note This function takes into account the fact that the tick counter may eventually roll over to 0 once it reaches 0xFFFFFFFF. */ /**************************************************************************/ void systickDelay (uint32_t delayTicks) { uint32_t curTicks; curTicks = systickTicks; // Make sure delay is at least 1 tick in case of division, etc. if (delayTicks == 0) delayTicks = 1; if (curTicks > 0xFFFFFFFF - delayTicks) { // Rollover will occur during delay while (systickTicks >= curTicks) { while (systickTicks < (delayTicks - (0xFFFFFFFF - curTicks))); } } else { while ((systickTicks - curTicks) < delayTicks); } } От найденого есть смутное ощущение, что не смотря на @Note в момент автоперезагрузки SysTick-а можно и "пролететь". Я дурак или параноик?