3 / 3 / 0
Регистрация: 10.12.2018
Сообщений: 60
1

Системный + программный таймер

27.10.2023, 05:36. Показов 482. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Системный таймер тактируется величиной в 168МГц.
Инициализирую таймер со значением перезагрузки в каждые 1мс
Системный + программный таймер

В обработчике считаю программный таймер на пол секунды, при каждом срабатывании выставляю флаг.
Название: image_2023-10-27_092842864.png
Просмотров: 131

Размер: 3.5 Кб
Далее в теле основной программы проверяю наличии флага и мигаю светодиодом, пол секунды горит, пол секунды не горит (мигание каждую секунду)
Название: image_2023-10-27_093020286.png
Просмотров: 131

Размер: 5.6 Кб

На деле же я вижу как светодиод моргает примерно каждые 3 секунды, т.е. ~1.5 сек горит и ~1.5 сек не горит. С чем это может быть связано? Проект пустой, других прерываний и сложных механизмов нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2023, 05:36
Ответы с готовыми решениями:

Программный ШИМ, таймер
Здравствуйте! Объясните, пожалуйста, что я сделал не так. Собственно задача: имеется плата с...

Системный таймер
Здравствуйте! Мне нужно получить текущее значение системного таймера (пишу на nasm) При попытке...

системный таймер
Разработать программу редактирования значений системного времени и системной даты с помощью...

Системный таймер
Мне необходимо определить коэффициент деления системного таймера(любого канала). Я так понимаю, что...

8
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
01.11.2023, 17:05 2
1. Пользуйтесь пожалуйста вставкой кода (на панельке рядом со смайликом
2. А для чего у Вас NVIC_SystemReset(); ???

C
1
2
3
4
5
/**
  \brief   System Reset
  \details Initiates a system reset request to reset the MCU.
 */
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
По сути дела вы отправляете контроллер в резет каждые 500 мс ))
0
3 / 3 / 0
Регистрация: 10.12.2018
Сообщений: 60
07.11.2023, 05:21  [ТС] 3
NVIC_SystemReset() поставил для рестарта при возникновении фоновых зависаний на будущее. Ресет не срабатывает, т.к. переменная SecFlag зануляется каждый раз, проблема не в этом
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
07.11.2023, 09:19 4
ferrero_li, кстати, а переменные которые используются в обработчике прерываний, объявлены как volatile ? И глобальные прерывания включены? По тем обрывкам которые Вы влепили вроде все ок.
Цитата Сообщение от ferrero_li Посмотреть сообщение
поставил для рестарта при возникновении фоновых зависаний на будущее
если хотите защитится от глобальных зависонов, то нужно использовать IWDG или WWDG, а использовать системный таймер, при том что инициализация была сделана в Кубе - бесполезное занятие, т.к. куб, понижает приоритет системного таймера ниже плинтуса и если зависон произойдет в прерывании выше то таймер не спасет
0
3 / 3 / 0
Регистрация: 10.12.2018
Сообщений: 60
07.11.2023, 12:08  [ТС] 5
Переменные объявлены как volatile, прерывания работают. Тоже не понимаю в чем проблема.
Да, для исключения аппаратных зависонов потом использую IWDG(мб даже внешний), пока просто от тупых программных зависаний сделал по таймеру. Приоритет надо бы повысить согласен.
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
07.11.2023, 17:57 6
Значит что-то не то с тактированием, посмотрите какой кварц стоит на плате и какой Вы написали в кубе. Если написано 12Мгц а установлен на 8 то и частота ниже... теоретически внешний кварц может и не работать и работает кристалл весело от HSI MSI... все зависит от камня ))
0
Заблокирован
07.11.2023, 22:24 7
обращение к регистрам в основном цикле тоже занимает время и операторы if else тоже кушают время. Запись в переменные тоже занимает время. Задача у тебя так себе скажу не из лёгких.
0
3 / 3 / 0
Регистрация: 10.12.2018
Сообщений: 60
08.11.2023, 05:11  [ТС] 8
Кубом не пользуюсь, считываю тактирование, получаю RCC_Clocks->SYSCLK_Frequency равной в 168МГц, ее же дальше и использую. Камень точно запускается
C
1
2
3
4
5
6
7
8
9
10
void boot(void)
{
  U_LEDs_init();
  LED_dance();
  SystemInit(); //Установить частоту для ядра
  RCC_ClocksTypeDef RCC_ClocksStatus;
  RCC_GetClocksFreq(&RCC_ClocksStatus);
  SysTick_Config(RCC_ClocksStatus.HCLK_Frequency /1000);
  NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 3));
}
В SystemInit(); как раз запускается от HSE, по факту можно функцию эту не писать потому что она в стартапе прописана
Assembler
1
2
3
        EXTERN  __iar_program_start
        EXTERN  SystemInit
        PUBLIC  __vector_table
Добавлено через 1 минуту
Да с таким тактированием все эти операции должны доли долей секунды занимать, явно не половину
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
08.11.2023, 09:03 9
VladimirU, ТС утверждает, что в основном цикле только код моргания, и этот код выполниться за несколько десятков тактов.

ferrero_li, По умолчанию все кристаллы стартуют на внутреннем генераторе, а потом уже начинают после ваших команд пытаться запустить внешний. А частота внешнего кварца правильно указана? (по умолчанию она 8 МГц)
вот функция из стартапа по умолчанию для моего камня, никакого старта от HSE и уж тем более настройки, запуска и выбора PLL
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void SystemInit(void)
{
#if defined(USER_VECT_TAB_ADDRESS)
  /* Configure the Vector Table location -------------------------------------*/
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
#endif
 
  /* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  SCB->CPACR |= ((3UL << 20U)|(3UL << 22U));  /* set CP10 and CP11 Full Access */
#endif
 
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set MSION bit */
  RCC->CR |= RCC_CR_MSION;
 
  /* Reset CFGR register */
  RCC->CFGR = 0x00000000U;
 
  /* Reset HSEON, CSSON , HSION, and PLLON bits */
  RCC->CR &= 0xEAF6FFFFU;
 
  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x00001000U;
 
  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;
 
  /* Disable all interrupts */
  RCC->CIER = 0x00000000U;
}
и если вы эту функцию не переписывали то....

зайдите в дебаг и посмотрите щелкает ли системный таймер
поставьте точку остановки в прерывании и проверьте все ли там нормально выполняется.
если есть ослик активируйте выход MCO и проверьте реальную частоту (у меня мысли идут в этом направлении потому как 168Мгц/12МГц = 14 14*8 = 112; 168/112 = 1,5 )
И кстати что у вас за камень то F407V ?
0
08.11.2023, 09:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2023, 09:03
Помогаю со студенческими работами здесь

Системный таймер
Как присвоить переменной значение системного таймера?

Системный таймер
Ребят , помогите дописать код таймера! На экране должно выводиться время, к примеру 4:30 и его...

Системный таймер
Нужно измерить время между пакетами, которые передаются по rs-232!!! Нужно использовать системный...

Системный таймер
Здравствуйте. Возникло несколько вопросов: 1) Если я хочу переустановить время таймера,...

Дописать системный таймер
Необходимо разработать и реализовать в оо-классе интерфейс, т.е. использовать понятие интерфейса...

Нужно разработать системный таймер
Доброго времени суток!!! Нужна помощь в решении вот такой задачи: Разработать и реализовать в...

Как затормозить системный таймер?
Как затормозить системный таймер? Он в обычно 18 раз в секунду срабатывает, а мне например надо 9.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru