pkm
|
|
1 | |
Функции задержки времени25.09.2011, 23:37. Показов 8794. Ответов 9
Метки нет Все метки)
(
Какие функции задержки времени вы используете? Мои потуги в использовании задержек какието неудачные, к примеру использую код:
Код
void Delay_ms(uint32_t ms) { volatile uint32_t nCount; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq (&RCC_Clocks); nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms; for (; nCount!=0; nCount--); } Покажите адекватный код на микросекундные задержки, принципе частоты мк в 2 МГц должно хватать на обработку вычисления столь малой задержки, или я ошибаюсь?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь |
|
25.09.2011, 23:37 | |
Ответы с готовыми решениями:
9
Какие есть функции для задержки времени? Функция задержки времени
|
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
|
|
26.09.2011, 00:47 | 2 |
![]()
0
|
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
|
|
26.09.2011, 00:53 | 3 |
Код
inline void DelayLoop(uint32_t delayLoops) { __asm__ __volatile__ ( "1: \n" " CBZ %[delayLoops], 2f \n" " SUB %[delayLoops], %[delayLoops], #1 \n" " B 1b \n" "2: \n" : [delayLoops] "+r"(delayLoops) ); }
0
|
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
|
|
26.09.2011, 01:07 | 4 |
![]()
0
|
pkm
|
|
26.09.2011, 16:32 | 5 |
![]() |
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 534
|
|
27.09.2011, 03:03 | 6 |
у меня работает такое (цикл проходит за 3 такта):
Код
inline void _delay_loops(U32 loops) __attribute__ ((always_inline)); inline void _delay_loops(U32 loops) { asm volatile ( "1: \n" " SUBS %[loops], %[loops], #1 \n" " BNE 1b \n" : [loops] "+r"(loops) ); } #define _delay_us( US ) _delay_loops( (U32)((double)US * F_CPU / 3000000.0) ) #define _delay_ms( MS ) _delay_loops( (U32)((double)MS * F_CPU / 3000.0) ) #define _delay_s( S ) _delay_loops( (U32)((double)S * F_CPU / 3.0) )
0
|
0 / 0 / 0
Регистрация: 06.09.2011
Сообщений: 35
|
|
28.09.2011, 15:35 | 7 |
А я использую SysTick.
Код
(в инициализациях) SysTick_Config(SystemCoreClock / SYSTICK_PRESCALE / 1000); (в обработчиках) uint16_t systysk_prescale_count = 0; void SysTick_Homdler(void) { systysk_prescale_count++; if(systysk_prescale_count < SYSTICK_PRESCALE) return; systysk_prescale_count = 0; ... Delay_SysTickHomdler(); } (ну и сама задержка) volatile uint16_t delay_counter = 0; void Delay(uint16_t time) { delay_counter = time; while(delay_counter != 0); } void Delay_SysTickHomdler() // вызывается из SysTick_Homdler { if(delay_counter > 0) { delay_counter--; } }
0
|
0 / 0 / 0
Регистрация: 29.01.2012
Сообщений: 22
|
|
22.02.2012, 00:31 | 8 |
![]() { __asm__ __volatile__ ( "1: \n" " CBZ %[delayLoops], 2f \n" " SUB %[delayLoops], %[delayLoops], #1 \n" " B 1b \n" "2: \n" : [delayLoops] "+r"(delayLoops) ); } Для arm-gcc. Гарантировано 3 такта на один цикл. А для кейла такое можно сделать?
0
|
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
|
|
22.02.2012, 11:03 | 9 |
![]()
0
|
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
|
|
22.02.2012, 12:31 | 10 |
![]() Философ, однако.
0
|
22.02.2012, 12:31 | |
Помогаю со студенческими работами здесь
10
Программа с введением времени задержки с клавиатуры 5 СПОСОБОВ задержки времени: Что скажете?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |