Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.10.2021
Сообщений: 44

Не понимаю как сделать более точный счетчик таймера(маленькая частота)

09.03.2022, 15:19. Показов 603. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
int main(void)      //Главный метод, который запускается по умолчанию
{
    __disable_irq();  //Глобальное запрещение прерывания
    GPIOB1();        //Инициализация порта B
    InitTimer6();   //Инициализация таймера TIM6
    InitTimer7(); //Инициализация таймера TIM17
    
    __enable_irq(); //Глобальное разрешение прерываний
    
    TIM6->CR1 |= 1<<0;   //Разрешаем модулю таймера генерировать прерывания
    TIM7->CR1 |= 1<<0; //Разрешаем модулю таймера генерировать прерывания
    
    while(1)
        {
            if(GPIOB->IDR & (1<<13)) //проверяет есть 1 в 13 бите - sw3
            {
                //GPIOB->BSRR=1<<(6+16)|1<<(4+16); 1 помещает в 20 бит(для отключения) - L5 и 1 помещает в 21 бит (для отключения)
                NVIC_DisableIRQ(TIM6_IRQn);  //выключение таймера у прерывания L7
                NVIC_DisableIRQ(TIM7_IRQn); //выключение таймера у прерывания L5
            }
            else if(GPIOB->IDR & (1<<12)) //проверяет есть 1 в 12 бите - sw4
            {
                //GPIOB->BSRR=1<<6|1<<(4+16); 1 помешает в 6 бит (для включения) - L5 и 0 помещает в 20 бит (для отключения) L7
                NVIC_DisableIRQ(TIM6_IRQn);   //выключение таймера у прерывания L7
                NVIC_EnableIRQ(TIM7_IRQn); //включение таймера у прерывания L5
            }
            else if(!(GPIOB->IDR & (1<<12))) //проверяет есть 1 в 12 бите - sw4 и потом делает в ноль
            {
                //GPIOB->BSRR=1<<(6+16)|1<<4; 1 помещает в 20 порт(для отключения) - L5 и 1 помешает в 4 бит (для включения) L7
                NVIC_EnableIRQ(TIM6_IRQn); //включение таймера у прерывания L7
                NVIC_DisableIRQ(TIM7_IRQn); //выключение таймера у прерывания L5
            }   
        }
}
 
void GPIOB1(void)
    {
        //Включение тактирования порта B
        RCC->AHBENR|=RCC_AHBENR_GPIOBEN;
        
        //Переключение линий 4 и 6 порта B в режим "Output":
        GPIOB->MODER|=GPIO_MODER_MODER4_0 | GPIO_MODER_MODER6_0;
        //Переключение линий 12(SW4) и 13(SW3) порта B в режим "Input"
        GPIOB->MODER&=~(GPIO_MODER_MODER12 | GPIO_MODER_MODER13);
        //разрешаем работу светодиодам
        GPIOB->BSRR=0x1ff;
    }   
        
void InitTimer6()
    {
        RCC->APB1ENR|=RCC_APB1ENR_TIM6EN; //Включение тактирования модуля TIM6
        TIM6->PSC=7999;    //Установка коэффициента предделителя равного 8000
        TIM6->ARR=200;      //Установка полупериода 2,5  в секундах 0,4 
        TIM6->DIER|=TIM_CR1_CEN; //Разрешаем модулю таймера генерировать прерывание при возникновении события обновления
    }
    
void InitTimer7()
    {
        RCC->APB1ENR|=RCC_APB1ENR_TIM7EN; //Включение тактирования модуля TIM7
        TIM7->PSC=7;        //Установка коэффициента предделителя равного 8, чтобы сделать более точным
        TIM7->ARR=86206;     //Установка полупериода 5,8 в секундах 
        TIM7->DIER|=TIM_CR1_CEN; //Разрешаем модулю таймера генерировать прерывание при возникновении события обновления
    }
    
    void TIM6_DAC_IRQHandler(void) //обработчик прерываний на L7
    {
        if(GPIOB -> IDR & 1<<6) // L7 проверяет включён ли он
            {
                GPIOB -> BSRR |= 1 << (6 + 16); // L7 выключает
            }
        else
            {
                GPIOB -> BSRR |= 1<<6; // L7 включаем
            }
        TIM6->SR=0; //Флаг прерывания или регистр состояния
    }
 
void TIM7_IRQHandler(void) // обработчик прерываний на L5
    {
        if(GPIOB -> IDR & 1<<4) // L5 проверяет включён ли он
            {
                GPIOB -> BSRR |= 1 << (4 + 16); // L5 выключаем
            }
        else
            {
                GPIOB -> BSRR |= 1<<4; //L5 включаем
            }
        TIM7->SR=0; //Флаг прерывания или регистр состояния
    }
Добавлено через 1 минуту
Таймер у меня на шине APB - 8 Мгц, я не могу подобрать PSC и ARR для работы таймера на частоте 5,8(регистра автоперезагрузки), ещё заметил, что ARR выходит за 65535(16 битный таймер)

Добавлено через 31 минуту
Впринципе, я понимаю, что это тупой перебор всех возможных комбинаций с вычислением ошибки и выбором пары PSC и ARR с наименьшей из них, но хочется узнать более "спокойный" метод

Может существует формула для расчета? Или на крайний случай таблица значений регистров для каждой частоты с минимальной погрешностью?

Добавлено через 25 минут
Всё я ркшил проблему, путем подключения таймера на 32 бита
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2022, 15:19
Ответы с готовыми решениями:

Как сделать точный счетчик времени?
Серверный скрипт (ASP) формирует тест с картинками, по окончанию загрузки сформированной страницы клиенту необходимо запустить счетчик...

Как сделать более-менее точный секундомер?
Здравствуйте, Питонисты. Подскажите, как реализовать более-менее точный секундомер (желательно до 0.001 сек, но не критично). ...

Не понимаю как это сделать. Цвет таймера нужно изменить
Нужно сделать так, чтобы цвет таймера поменялся на красный, когда на нем остается всего лишь пять секунд. private void...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2022, 15:19
Помогаю со студенческими работами здесь

Для чего такая маленькая частота процессора
http://www.ulmart.ru/goods/684766#properties_full Проц всего 1ггц, но 2 ядерный. Там что, половину вычислений север делает чтоли?

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

Более точный подсчёт FPS
count++; if(clock() &gt; start){ start = clock() + 500; write = count * 2; count = 0; } Ребята, подскажите,...

Ошибка в неточном поиске и как сделать точный поиск
База сделана в databasedesktop paradox Здравствуйте вот ошибка 'Invalid use of key word.Token:Института Line Number:2' Вот код: ...

Частота таймера
Имеется мега8, хочу снеё получить тики с частотой 1 МГц(при тактовой частоте 8 или 10 или 12МГц), думал сделать через таймер по совпадению....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru