Перейти к содержанию

STM32. Таймер отстаёт от реального времени


supercelt

Рекомендуемые сообщения

Добрый вечер!

У меня есть 2 вопроса, которые я хочу задать в одной теме. Потому что один вытекает из другого.

1. У меня есть самодельная отладка с stm32f405. Кварцы установлены на 32,768 кгц для часов и 8 мгц для тактирования МК. Лежала на полке где-то пол года. Тут решил достать, подключил. И как видно из видео, отсчёт секунд на дисплее отстает от красного светодиода. Светодиод горит ровно 1 сек и гаснет на 1 сек. Он подвязан в прерывании RTC. А отсчёт времени на дисплее сделан на TIM12. Пол года назад что самое интересное, работало все синхронно. Что поменялось: я переустановил винду и поставил новый Keil. Уточню: длительность между отсчётами на дисплее больше одной сек, хотя таймер настроен на 1 сек. Может в настройках что не так?

Вопрос 2. Таймер отсчитывает 1000 тиков, то есть каждую сек уходит в прерывание. Помогите настроить таймер12, что бы он считал до 20 сек и выдал прерывание И попутно еще каждую секунду давал тоже прерывание. То есть первое - по достижении числа в ARR. А ежесекундное - наверное как то по регистру сравнения.

589bde86e6f9.jpg

Мой код:

uint8_t load_sec_flag = 0;
void gsm_ini(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM12EN;	//Включаем тактирование TIM12
	TIM12->CR1 &= ~TIM_CR1_CEN;		    //На всякий случай принудительно останавливаем таймер, если он был включён
	TIM12->CNT = 0;						//Обнуляем счётный регистр тамера
	TIM12->PSC |= (24000000/1000) - 1; //F = 1 kHz);//Задаём частоту таймера = 1000 Hz.
	TIM12->EGR |= TIM_EGR_UG;			//Повторно инициализирует счетчик и генерирует обновление регистров
	TIM12->ARR = 1000;				//Прерывания будут срабатывать каждую секунду
	TIM12->DIER |= TIM_DIER_UIE;
	NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
	__NOP();
	__NOP();
	TIM12->SR &= ~(TIM_SR_UIF);	
}
void gsm_handler(void){	
  	char buffer_timer[3] = "";
	static uint8_t load_timer = 0;
    if(load_sec_flag){
		load_sec_flag = 0;
		sprintf(buffer_timer,"%02d",load_timer); 
		lcd_send_string_xy(0, 1, buffer_timer);
		if(load_timer < 20){
			load_timer++;
		}else{
			
		}
	}
}
void TIM8_BRK_TIM12_IRQHandler(void){
	if(TIM12->SR & TIM_SR_UIF){
		TIM12->SR &= ~TIM_SR_UIF;
		load_sec_flag = 1;
	}
}

 

Изменено пользователем supercelt
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

10 минут назад, supercelt сказал:

длительность между отсчётами на дисплее больше одной сек, хотя таймер настроен на 1 сек.

А камень на какой частоте запущен?

 

11 минут назад, supercelt сказал:

Может в настройках что не так?

Код у вас перед глазами.

 

11 минут назад, supercelt сказал:

считал до 20 сек и выдал прерывание И попутно еще каждую секунду давал тоже прерывание.

Такого не бывает. Либо каждую секунду, либо каждые 20 секунд. Либо делать в таймере счетчик, что логично, либо использовать два таймера.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Цитата

А камень на какой частоте запущен?

В файле stm32f4xx.h прописано:

  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

 в файле system_stm32f4xx.c


#include "stm32f4xx.h"

#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
#endif /* HSE_VALUE */

#if !defined  (HSI_VALUE)
  #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */

uint32_t SystemCoreClock = 16000000;

 

Изменено пользователем supercelt
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Всё смешалось - люди, кони...
Вас спрашивают - на какой частоте работает камень реально, а не то что у вас там понаписано. В одном месте 8МГц, в другом 25, в третьем 16.
При этом, при запуске таймера вы делите 24Мгц на 1000.

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, supercelt сказал:

В файле stm32f4xx.h прописано:


  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

 в файле system_stm32f4xx.c

И какое отношение это имеет к частоте камня? Где настойка PLL?

Ссылка на комментарий
Поделиться на другие сайты

Точносчть от тактирования.У вас настроен скорей всего на HSI(внутренне тактирование.А оно не стабильно.Спецы могут мне ещё один минус поставить.И  мне кажется я не берусь говорить что я прав но TIM2->PSC =0 ; //  TIM2->ARR=24000-1 ; при частоте тактирования 24 000 000 Гц . раняется 1 кГц

Ссылка на комментарий
Поделиться на другие сайты

Спасибо всем, что настроили на правильные мысли

#define PLL_M 4
#define PLL_N 168
#define PLL_P 2
#define PLL_Q 7
  
  void System_init(void){
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
	RCC->CR|= RCC_CR_HSEON;
	while (!(RCC->CR &RCC_CR_HSERDY)){};
	RCC->CFGR |=	RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV2 |RCC_CFGR_PPRE1_DIV4;
	RCC->PLLCFGR = PLL_M|(PLL_N<<6)|(((PLL_P>>1)-1)<<16)|RCC_PLLCFGR_PLLSRC_HSE|(PLL_Q<<24);
	RCC->CR |= RCC_CR_PLLON;
	while (!(RCC->CR &RCC_CR_PLLRDY)){};
  FLASH->ACR|=FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS | FLASH_ACR_PRFTEN;
	RCC->CFGR &= ~RCC_CFGR_SW;
  RCC->CFGR |= RCC_CFGR_SW_PLL;
  while (!(RCC->CFGR & RCC_CFGR_SWS ) ){};
}

RCC->APB1ENR |= RCC_APB1ENR_TIM12EN;																																		//Включаем тактирование TIM12
	TIM12->CR1 &= ~TIM_CR1_CEN;																																											//На всякий случай принудительно останавливаем таймер, если он был включён
	TIM12->CNT = 0;																																																							//Обнуляем счётный регистр тамера
	TIM12->PSC |= 42000 - 1; //F = 2 kHz);														//Задаём частоту таймера = 1000 Hz. (24000000/1000) - 1; (за 1 сек таймер тикает 2000 раз, т.е. с частотой 2 KHz)
	TIM12->EGR |= TIM_EGR_UG;																																													//Повторно инициализирует счетчик и генерирует обновление регистров
	TIM12->ARR = 2000;																																																//Прерывания будут срабатывать каждую секунду
	TIM12->DIER |= TIM_DIER_UIE;
	NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
	__NOP();
	__NOP();
	TIM12->SR &= ~(TIM_SR_UIF);

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Ivan Rusev сказал:

но TIM2->PSC =0 ; //  TIM2->ARR=24000-1

Разницы никакой. Что тактовую поделить и считать до 1000, что считать на большой тактовой и не до 1000.

Ссылка на комментарий
Поделиться на другие сайты

51 минуту назад, supercelt сказал:

__NOP(); __NOP();

А зачем это?

58 минут назад, supercelt сказал:

TIM12->CR1 &= ~TIM_CR1_CEN

Бит отключён.Таймер  нужно включить.Сначало настроить потом включить.

TIM12->SR &= ~(TIM_SR_UIF);Этот бит мне кажется в прерываниях устанавливается и сбрасываеться.

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Ivan Rusev сказал:

А зачем это?

Где-тона сайте прочитал что не помешает. Типа от залипания

1 час назад, Ivan Rusev сказал:

Бит отключён.Таймер  нужно включить.Сначало настроить потом включить.

Так я его настроил и мне не надо пока его запускать, а только в определённый момент

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, supercelt сказал:

Где-тона сайте прочитал что не помешает. Типа от залипания

Так я его настроил и мне не надо пока его запускать, а только в определённый момент

Залипания чего контакта?

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, supercelt сказал:

Где-тона сайте прочитал что не помешает

А надо было в даташите.

 

9 часов назад, supercelt сказал:

Типа от залипания

Залипает тут только мозг того, кто это написал. И смысл сбрасывать TIM_SR_UIF, когда он выставляется только при наличии события?

RCC->APB1ENR        |=  RCC_APB1ENR_TIM2EN;    //подаем тактирование TIM7

TIM2->PSC = 60000;         //настроить делитель для формирования миллисекунд
TIM2->ARR = 1000; // 500 mS
TIM2->DIER |= TIM_DIER_UIE;   //разрешить событие от таймера
TIM2->CR1 |= TIM_CR1_CEN;     //разрешить перезагрузку и включить таймер

NVIC_EnableIRQ(TIM2_IRQn);

Вот вся настройка.

Ссылка на комментарий
Поделиться на другие сайты

BARS_ - ну вот зачем спешил? Твой готовый кусок кода - очередная причина отложить изучение доков. А между прочим эти два гаврика двигались в нужном направлении, и даже каким-то мистическим образом понимали друг друга.

Нужно только узнать, откуда они столь корявые примеры берут, и зачистить там всё напалмом.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, AVI-crak Home сказал:

BARS_ - ну вот зачем спешил? Твой готовый кусок кода - очередная причина отложить изучение доков. А между прочим эти два гаврика двигались в нужном направлении, и даже каким-то мистическим образом понимали друг друга.

Нужно только узнать, откуда они столь корявые примеры берут, и зачистить там всё напалмом.

CC->APB1ENR |= RCC_APB1ENR_TIM2EN; //подаем тактирование TIM7 TIM2->PSC = 60000; //настроить делитель для формирования миллисекунд TIM2->ARR = 1000; // 500 mS TIM2->DIER |= TIM_DIER_UIE; //разрешить событие от таймера TIM2->CR1 |= TIM_CR1_CEN; //разрешить перезагрузку и включить таймер NVIC_EnableIRQ(TIM2_IRQn);

Это вы мне?Эсли вы посмотрите мой код от этого ничем не отличается.Тактирование настроенно не по примерам.А методом тыка.Примеры толлько на F1 серии есть.

Куда нам до вас .Вы доценты.А мы абитуриенты.Всё что написано мной.Немного отличается от вашего.Простинько и понятно.Может 1 или 2 бита лишних.Но то что я смотрел и у вас и в нете страх и ужас.Человек может не понял.Что програмированние(самообучение)методом проб  и ошибок.Вам вобщето спасибо.Я тежело но двигаюсь к своей цели.Проект самодельный частотник.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Ivan Rusev сказал:

Это вы мне?Эсли вы посмотрите мой код от этого ничем не отличается.Тактирование настроенно не по примерам.А методом тыка.

Не могу смотреть, обезболивающее закончилось. Обычно метод тыка требует многократно большее время, чем чтение документации. Но вот конкретно с тактированием это время можно значительно сократить - достаточно скачать куб от st, и таки выбрать именно свой мк, чтобы все буквы и цифры совпадали. Вот там можно использовать метод тыка, куб именно для этого и предназначен. Когда у вас будет набор всех магических чисел - пора изучать доку. Для stm32f4 - это буквально несколько регистров. Изучать - потому как магические числа из кубика не всегда совпадают с тем что нужно ввести в поля регистров. А вот то что там нужно и можно вводить - очень подробно описано.

Ну и главное, основной макрос _VAL2FLD(имя поля, значение поля) - вам уже известен, осталось научиться его применять.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, AVI-crak Home сказал:

Ну и главное, основной макрос _VAL2FLD(имя поля, значение поля) - вам уже известен, осталось научиться его применять.

Этот макрос ни везде работает.Даже в тактировании.Я много чего не знаю.Вот по этому спрашиваю.RM читаю с переводом.Сей час иногда фразы понимаю без перевода.

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Ivan Rusev сказал:

Тактирование настроенно не по примерам.А методом тыка.Примеры толлько на F1 серии есть.

Примеры на все серии есть. И есть даташит. Например http://w.qwes.org/art/?src=stm32f2xx_taktirovaniye У 2/3/4 серии настройки одинаковые. Надо только латентность флеша в даташите смотреть. Множители/делители куб покажет.

 

13 часов назад, supercelt сказал:

на английском)))

О ужас. Там ведь художественный текст и перевести его невероятно трудно.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Ivan Rusev сказал:

Сей час иногда фразы понимаю без перевода.

А я вот не понимаю, и не собираюсь понимать - вместо этого использую переводчик встроенный в хром. У меня нет яндекса, спутника, ускорителя интернета, 100500 баров на экране, и прочей фигни. Есть хром, со панелью закладок. А в самом хроме - 2-4 открытых страницы. 

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, AVI-crak Home сказал:

вместо этого использую переводчик встроенный в хром

Глупый подход, очень глупый. Во-первых, это медленно, во-вторых, перед безумно кривой. Это я уже не говорю о том, что читать pdf из браузера не сильно удобно в принципе. Да и хром гамно редкостное. Если уж такое отвращение к английскому, то есть тот же QTranslate, который переводит любой выделенный текст в любом документе.

Ссылка на комментарий
Поделиться на другие сайты

33 минуты назад, BARS_ сказал:

перед безумно кривой

Перевод всегда будет безумно кривым, потому как нет бесплатных трансляторов технического английского. Платные есть, почти на все языки, но платные. Правильный корректный перевод мало поможет пользователю, если он не умеет читать и вчитываться. Потому как отличие технического от литературного - в дословности и последовательности. В техническом нельзя игнорировать часть текста, там просто нет воды!!!

Вот, а теперь открываем яндекс - обилие совершенно бесполезной информации на весь экран. Начинаем поиск - обилие бесполезных ссылок. При работе с яндексом нужен совершенно иной скил - игнорирование бесполезной части информации. Два разных скила, с полностью противоположным действием - не дадут положительного эффекта. Нужно прокачивать что-то одно.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, AVI-crak Home сказал:

Перевод всегда будет безумно кривым, потому как нет бесплатных трансляторов технического английского.

Поэтому и надо учиться переводить самому.

 

1 час назад, AVI-crak Home сказал:

а теперь открываем яндекс

А при чем тут яндекс? Это про их браузер? Это ж тот же хром, только с мусором от яндекса. Виндовый EDGE и то лучше работает. А что мешает использовать ту же оперу? Да и в принципе не читать pdf через браузер? Скачал, открыл в pdf ридере хоть десяток документов и спокойно работаешь. И желательно чтобы это был не адоб, а хотя бы та же sumatra. Работает на порядок шустрее. Но что-то мы ушли от темы автора....

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
14.05.2021 в 10:35, BARS_ сказал:

Примеры на все серии есть. И есть даташит. Например http://w.qwes.org/art/?src=stm32f2xx_taktirovaniye У 2/3/4

Спасибо за ссылку. Я так понял что для 4 тоже подходит. Про акселератор и не знал:D

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Шота дохрена. Это если мультик может на килогерце. Обычно нет, предел 400 Гц.
    • Да, сначала был написан бутлодер для тини 24. Там нет выделенной памяти под бутлодер и заморочек с областями откуда можно записывать и перезаписывать флеш из программы, там все просто! Также там нет УАРТА, пришлось написать. Ну и самое главное: перезаписывай любые страницы флеш из любого места! В тини 24 под бутлодер ушло 48% памяти. В проекте технологи выделили слишком мало физического места под схему. Потом развел плату, оказалось, что места не так уж и мало. Потом выяснилось, что пинов впритык, и если будет дальнейшее расширение, их может не хватить. И после долгих (ну очень долгих) изысканий (цена, доступность, размеры) остановился на 88 (очень низкая цена, корпус чуть больше чем у 24, датчик температуры, а это важно, но не критически). Да, и сейчас все программируют на С и др. языках высокого уровня, что занимает очень (ну очень) много места, и чипы с небольшой памятью остаются не востребованы, и как следствие низкий спрос, и низкая цена!!! И при тупом переносе программы перезаписи страниц флеш программа не заработала... Ну и пошли изыскания, и я набрел на ВАШ проект, самый полный и законченный на то время. Нужно было выяснить чип который был у меня битый или я что-то упустил при программировании? (в бутлодерах я новичек) Недостаток 88 на сегодня, то что из пользовательской памяти нельзя перепрограммировать флеш, хотя страница стирается.   По поводу ВАШЕЙ программы: выяснилось, что при включенном фьюзе WDT в конфигурации, соединение не устанавливается, а в хелпе это не отражено. В некоторых ситуациях соединение можно восстановить лишь отключив / включив питание, сброс через ножку ресет не помагает. Будем копать дальше,... и глубже....!   Иногда при "установить соединение" выдается сообщение, "соединение не установлено", а на осциллографе виден ответ с чипа?
    • Сейчас по входу стоит керамика 0,1 мкФ + электролит 220 мкФ, иголок вроде нет, ну во всяком случае старичек С1-93 их не показывает.
    • Платы материнки и УВ пока в брак.  - Семён Семёныч... (с) Вы ничего не забыли, сэр? Как вы собрались регулировать УВ по уровню выходного сигнала??? Решение уже есть, пока в процессе. Вот так оно лучше работает.
    • Ну в идеале каптоновым скотчем как вам сказали,но можно обмотать чем угодно лижбе диалектриком было и хотябы немного высокотемпературное,я бы термо усадку взял,поидеи хорошо пойдет  Ещё видел где трансформатор медно алюминиевой жилой был на ампер 10 если не больше на вид аж,и там алюминиевая обмотка сечением пол сантиметра была замотана в бумагу пропитанную в воске,слоем миллиметр примерно эта изоляция была 
    • Всем привет. Собрал мх50, запустился с первого раза, когда делал замеры, соскочил щуп, спалил выходники и пред, заменил, все ок. Питание тор 250 ватт 30х2 выход, после выпрямителя 44В 20000мкф в плечо  увеличил входные емкости на оконечниках, добавил шунтирующую пленку  плата софт старта присутсвует цепь буше взял из ОМ2.7 ТП выставил 100мА добавлена термозащита на каждый канал( но как оказалось, с таким корпусом хрен перегреешь) АС kef q150 dac Aiyima a5 max получилось снять 81 ватт с канала при 8ом нагрузке (на фото самое точное измерение на левом мультиметре) без сигнала если прислонится к ас еле уловимое шипение  при наличии сигнала все ок, играет отлично, мне очень понравилось. в планах ОМ2.7
    • Уже 52 скачивания. Значит актуальна.
×
×
  • Создать...