14.05.2014, 12:44
|
|
Частый гость
Регистрация: 14.05.2014
Адрес: Новосибирск
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Нужна функция delay на таймере для stm32f303
Здравствуйте. Нужна функция delay на таймере для stm32f303. Спасибо!
|
|
|
|
14.05.2014, 12:56
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Я делаю так
Код:
|
/************************************************** **********************
* *
* Драйвер базового таймера STM32F4xx (TIM6 & TIM7). *
* Универсальный вариант. *
* Версия: 0.1. *
* *
* Файл: drvTimerBase.с Дата создания: 11.09.2012г. *
* Последние изменения: 11.09.2012г. *
* Сапего Александр Леонидович. (sapegoal@mail.ru) *
* *
* *
************************************************** **********************/
#include "stm32f4xx.h"
#include "stdint.h"
#include "drvTimerBase.h"
#include "main.h"
// Инициализировать используемый таймер
void InitTimerBase(TIM_TypeDef *TIM)
{
TIM-›CR1 = 1; // Разрешить работу таймера
TIM-›PSC = 0; // На основной частоте
}
// Ждать tact тактов процессора
void DelayTacts(TIM_TypeDef *TIM, uint32_t tact)
{
int32_t tmp, wt;
tmp = TIM-›CNT;
for(;;)
{
wt = TIM-›CNT - tmp;
if(wt‹0) wt += 0x10000;
if(wt›tact) break;
}
}
// Ждать mks микросекунд
void DelayMks(TIM_TypeDef *TIM, uint32_t mks)
{
do
{
DelayTacts(TIM,NANOSEC(1000));
}while(mks--);
}
// Ждать ms милисекунд
void DelayMs(TIM_TypeDef *TIM, uint32_t ms)
{
do
{
DelayMks(TIM,1000);
}while(ms--);
} |
|
|
|
|
14.05.2014, 13:51
|
|
Частый гость
Регистрация: 14.05.2014
Адрес: Новосибирск
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
SasaVitebsk, А можете выложить полный код? не совсем понятно что такое NANOSEC(1000).
|
|
|
|
14.05.2014, 15:02
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
пикосекундные задержки не забудьте
|
|
|
|
14.05.2014, 19:17
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Код:
|
// Макросы для задержек
#define NANOSEC(DATA) ((uint32_t)((DATA-20)/TCLK_SMALLWAIT)) // Ориентировочная задержка в нсек
// Ждать s01*0.1 секунд
#define Delay01(TIM,s01) DelayMs(TIM,s01*100) |
Код:
|
// Базовый таймер, используемый для микрозадержек
#define TIM_SMALLWAIT TIM6 |
пример
Код:
|
ADC_CS_OFF; // отключить выборку АЦП
DelayMs(TIM_SMALLWAIT,1);
ADC_CS_ON; // Выбрать АЦП
vSetCh1UniAD7192();
ADC_CS_OFF; // отключить выборку АЦП
DelayTacts(TIM_SMALLWAIT,NANOSEC(130));
ADC_CS_ON; // Выбрать АЦП
vSetCh1UniAD7192();
ADCPIN_RDY; // Переключить пин на готовность
ADCPIN_RDY_INTCLR; // сбросить флаги
ADCPIN_RDY_INTEN; // Разрешить прерывание по RDY |
|
|
|
|
14.05.2014, 19:27
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
И для кого ARM таймер SysTick делала - непонятно.
кста: для подсчета тактов у камня есть спец фича, незачем таймер гробить
Код:
|
// включение выдачи счетчика тактов процессора
void InitDwt (void)
{
SCB_DEMCR |= 0x01000000;
DWT_CYCCNT = 0;
DWT_CONTROL |= 1;
}
//================================================== ==============================
// сброс счетчика тактов процессора
void ClearDwt (void)
{
DWT_CYCCNT = 0;
}
//================================================== ==============================
// считывание счетчика тактов процессора
u32 GetDwt (void)
{
return DWT_CYCCNT;
}
//================================================== ============================== |
Последний раз редактировалось Hives; 14.05.2014 в 19:36.
|
|
|
|
15.05.2014, 02:18
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от Hives
|
кста: для подсчета тактов у камня есть спец фича, незачем таймер гробить
|
Приучайся писать по-человечески!
Код:
|
void InitDwt (void)
{
CoreDebug-›DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT-›CYCCNT = 0;
DWT-›CTRL |= DWT_CTRL_CYCCNTENA_Msk;
} |
Что это ещё за хрень SCB_DEMCR, DWT_CYCCNT и DWT_CONTROL ? Чему соответствует?
|
|
|
|
15.05.2014, 07:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от Hives
|
И для кого ARM таймер SysTick делала - непонятно.
|
Лично мне пока не понятно, для кого проектировщики ещё первых 80хх-процессоров придумали прерывания
|
|
|
|
15.05.2014, 08:45
|
|
Частый гость
Регистрация: 14.05.2014
Адрес: Новосибирск
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Разобрался. Огромное всем спасибо за помощь!
|
|
|
|
15.05.2014, 09:46
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Прерывания, для того чтобы отмерить задержку ненужны. Таймеров у меня в камне 17 штук. С SysTick, если честно, не разбирался. У меня там FreeRTOS его использует, поэтому не стал ковыряться. Как всегда времени не хватает.
Hives, спасибо за инфу. Буду использовать.
Переписывание драйверов несложная штука.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:41.
|
|