Изучаване на STM32
В STM32 обикновено има три вида таймери 1) основни (основни таймери) 2) с общо предназначение (таймери с общо предназначение) 3) разширени (таймери с разширено управление)
Advanced таймерите са най-готините и комбинират възможностите на двете предишни групи, плюс още много допълнителни функции като работа с трифазни двигатели и т.н. и така нататък. Все още сме далеч от тях, така че в тази част ще разгледаме работата с основни (основни таймери).
Първо, нека да разгледаме какви таймери има на нашия процесор STM32F407VG (вие гледате вашите процесори, с които работите)). В моя процесор има 14 таймера - 12 - 16 битови и 2 32 битови
Както виждаме на снимките, таймерите TIM2, TIM3, TIM4, TIM5, TIM6, TIM7, TIM12 са свързани към шината ARV1, а към шината ARV2 - TIM1, TIM8, TIM9, TIM10, TIM11
Сега нека да разгледаме снимката на нашите настройки на часовника в програмата CubeMX. Ще опиша системата за тактоване отделно, тъй като без нея не мога да направя нищо, но засега просто ще покажа как можем да синхронизираме нашите таймери, като използваме вътрешния източник на часовник HSI. Ето нашата стандартна настройка за тактоване без никакви умножители на честотата и т.н. Ще го използваме.
И ето вариант за ускоряване на работата)) Но ви съветвам да не се катерите там с игриви малки ръчички, в противен случай може да постави процесора на остриетата)) Ще проучим и разгледаме всичко това по-късно.
Да продължим... Така че таймери 6 и 7 са основни таймери. Те седят на шината ARV1, както виждаме на снимката от справочното ръководство.
Основните таймери 6 и 7 са 16-битови, имат регулируем прескалер от 0 до 65535. За тези таймериима такива регистри, достъпни за четене/запис.
Регистър на брояча (TIMx_CNT) - брояч Регистър на преразмер (TIMx_PSC) - Предварителен разпределител Регистър за автоматично презареждане (TIMx_ARR)
Няма да навлизаме в детайли на работата, тъй като има 10 страници описания на регистрите, достъпни за нас и т.н., три са ни достатъчни - написано по-горе
И така, какви са тези регистри и защо са ни необходими. Да, ето какво. Решихме спешно да мига светодиода тук, за да изненадаме нашите колеги AVR, например, и казваме - да видим кой бързо настрои мигане на един светодиод с период от половин секунда, а вторият с период от секунда, той спечели. (между другото, можете да направите подобен експеримент))))
За да приложим това, се нуждаем само 5 стъпки - 1 1) Изпълнение на Cubemx и създаване на проект за нашия контролер. 2) Задайте работата на таймерите в Cubemx 3) генериране на проект и го отворете в keil Uvision 4) инициализират таймерите (един ред на таймера) 5) Напишете в преследването на всеки време на времето за постоянно променящ се държавния щат до край на краищата в краищата в краищата на всеки път.
Така че, нека разгледаме това по-подробно. Първо, стартираме нашата програма CubeMX и конфигурираме нашите 2 пина PD12 и PD13 към изхода (краката, където са свързани светодиодите). Задаваме режима GPIO_Output за тях и режима Output Push_Pull.
След това, отляво, активираме нашите основни таймери 6 и 7.
сега отидете в раздела за конфигурация. Както си спомняме, не сме променили нищо в честотните настройки на нашия процесор, така че имаме всички шини с тактова честота -16 MHz. Сега, въз основа на това и въз основа на това, което трябва да получим, нека да настроим стойностите на нашия преразмер и регистър за автоматично презареждане.
Както си спомняме, ниетрябва един светодиод да мига с честота 1Hz (период 1000ms), а вторият с честота 2Hz (период 500ms). Как да го получим - да, много е просто. Тъй като можете да зададете всеки прескалер на STM32, ние просто изчисляваме неговата стойност И така, имаме честота от 16 000 000 такта в секунда, но се нуждаем от 1000 такта в секунда. Това означава 16 000 000 \ 1 000 \u003d 16 000. Това число е минус 1 и го въвеждаме в стойността на предскалера. Тоест числото, което получаваме е 15999.
Сега нашият таймер тиктака 1000 пъти в секунда. След това трябва да посочим кога имаме нужда от прекъсване при препълване. За да направите това, ние записваме номера, от който се нуждаем, в периода на брояча (регистър за автоматично презареждане).
Тоест, трябва да получим едно прекъсване на секунда и както си спомняме, нашият таймер тиктака 1 път на милисекунда. За една секунда - 1000 ms - това означава тази стойност и я въведете в регистъра за автоматично презареждане За да получите прекъсване на всеки половин секунда - пишем съответно - 500.
Както виждате, не може да бъде по-лесно...
освен това не забравяйте да активирате прекъсванията за тези таймери в раздела NVIC Settings, като поставите отметка в квадратчето. Правим целия този бизнес за втори път.
Така че – настройка, сега можете безопасно да генерирате нашия проект. Генерирано добро. Въпрос на време е светодиодите да мигат.
Отворихме нашия проект. По принцип всичко е настроено и готово за нас, само трябва да стартираме нашите таймери, тъй като въпреки че CubeMX прави всичко вместо нас, той вече не прави това. И така, ние инициализираме нашите таймери с тези редовеHAL_TIM_Base_Start_IT(&htim6); HAL_TIM_Base_Start_IT(&htim7);
След това отидете на файлаstm32f4xx_it.c
в него са нашите програми за обработка на прекъсванияот нашите таймери Ето манипулатора на прекъсване за таймер 7
void TIM7_IRQHandler(void) /* ПОТРЕБИТЕЛСКИ КОД НАЧАЛО TIM7_IRQn 0 */
/* ПОТРЕБИТЕЛСКИ КОД END TIM7_IRQn 0 */ HAL_TIM_IRQHandler(&htim7); /* ПОТРЕБИТЕЛСКИ КОД НАЧАЛО TIM7_IRQn 1 */
/* ПОТРЕБИТЕЛСКИ КОД КРАЙ TIM7_IRQn 1 */ >
Въвеждаме в манипулатора на прекъсвания това, което искаме да направим - и искаме да променим състоянието на нашите крака, към които са свързани светодиодите при всяко прекъсване Използваме тази конструкция - HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_13);
Всъщност всичко. Натискаме F7, проверяваме дали няма грешки - и можем да попълним всички тези случаи в нашия експериментален процесор.
Е, вече можем да се насладим на интересното мигане на светодиодите Ще добавя видеото малко по-късно, но засега, както обикновено, картината е правилна. И не забравяйте да сте благодарни :)
Коментари 25
Благодаря ти ! Всичко е печелившо!
Благодаря за статията! Знаете ли дали е възможно да напишете нула в TIMx_CNT, преди да се препълни, така че да започне да брои отначало? Или има някаква команда за рестартиране?
Сега пиша с помощта на HAL - можете да го направите там със сигурност. Така че мисля, че това също може да се направи
Можете ли да ми кажете как става това в HAL?
Благодаря отново, ще опитам
Направих го на DISCOVERY STM32F0. Само "лапите" са различни. Програмирах с Keil - работи с F0 безплатно. Авторът - много благодаря!
Да, има много таймери))
Опитайте удоволствията на прока само за 6,5 пиндофантика
Характеристики на 32-битовия ARM микроконтролер STM32F407VGT6 от семейството Cortex-M4:
Корпус LQFP100 (100 фута) I/O (макс.) 82 Захранващо напрежение: 1.8 - 3.6 V Честота: до 168 MHz Програмна памет (Flash): 1 MB RAM: 196 KB 4 KB архивиране SRAM (подобно наEEPROM) DSP instruction and floating point support 16-bit timers: 2 basic timers, 8 general purpose timers, 2 advanced timers, 2 watchdog 2 32-bit general purpose timers USB 2.0 full-speed device/host/OTG with its own PHY on board USB 2.0 high-speed/full-speed device/host/OTG with separate DMA, with its own full- speed PHY onboard, support for ULPI 10/100 Ethernet MAC with separate DMA, support for PHY chips with interfaces IEEE 1588v2, MII/RMII 3x SPI (37.5 Mbps), 2 of them with multiplexed full duplex I2S for high-quality audio transmission 3x I2C with support for SMBus/PMBus 4x USART, 2x UART: 10.5 Mbit/s, ISO 7816 interface, LIN, IrDA, modem control 2x CAN (2.0B Active) SDIO (for SD card) DCMI - [8 to 14]-bit parallel camera interface (up to 54 MB/s) O) RTC (Real-Time Clock) 3 12-bit ADCs, 2.4 MS/s, 16 channels, 7.2 MS/s in tri-interleaved mode 2 12-bit D/A converters 16-channel DMA controller with FIFO and burst support Parallel LCD interface, 8080/6800 modes FSMC - sta controller support for Compact Flash, SRAM, PSRAM, NOR and NAND JTAG or SWD debugging capability
1728 страници - това е само РЪКОВОДСТВО за справка за тази серия от прот. аааааааааааааааааааааааааааааааааааааааааааа...
Не изпадайте в паника! Просто задайте задача за себе си, например, покажете картина на дисплея ili9341 и няма да научите много информация сама по себе си в процеса на работа. След това завийте SD към същия дисплей, не много повече информация. След това работи с външна опера в режим на директен достъп и т.н. Показването е ЗАДЪЛЖИТЕЛНО ili9341:-)))
Преди да направите това, просто трябва да се справите с половината периферия и там няма нищо сложно)))
Целта е поставена, желанието е налице))
Опитайте удоволствията на прока само за 6,5 пиндофантика
Характеристики на 32-битовия ARM микроконтролер STM32F407VGT6 от семейството Cortex-M4:
Корпус LQFP100 (100 фута) I/O (макс.) 82 Напрежение: 1,8 - 3,6 V Честота: до 168 MHz Програмна памет (Flash): 1 MB RAM (RAM): 196 KB 4 KB архивиране SRAM (подобно на EEPROM) Поддържа DSP инструкции и числа с плаваща запетая 16-битови таймери: 2 основни таймера, 8 таймера с общо предназначение, 2 усъвършенствани таймера, 2 наблюдателни устройства 2 32-битови таймера с общо предназначение USB 2.0 пълноскоростно устройство/хост/OTG със собствен PHY на борда USB 2.0 високоскоростно/пълноскоростно устройство/хост/OTG с отделен DMA, със собствен пълноскоростен PHY на борда, ULPI 10/100 Ethernet MAC поддръжка с отделен DMA, поддръжка за PHY чипове с интерфейси IEEE 1588v2, MII/RMII 3x SPI (37,5 Mbps), 2 от тях с мултиплексиран пълен дуплекс I2S за висококачествено аудио предаване за SD карти) DCMI - [8 до 14]-битов паралелен интерфейс на камерата (до 54 MB/s) Аналогов генератор на случайни числа Вграден CRC калкулатор 82x GPIO (I/O пина) RTC (Часовник в реално време) 3 12-битови ADC, 2,4 Ms/s, 16 канала, 7,2 M проби в секунда в режим с tri-interleaved 2 12-битови ЦАП 16-канален DMA контролер с FIFO и поддръжка на пакети Паралелен LCD интерфейс, 8080/6 800 режима FSMC - Статичен контролер на паметта, поддържащ Compact Flash, SRAM, PSRAM, NOR и NAND Възможностотстраняване на грешки чрез JTAG или SWD
Да))) Просто е лошо на главата))) Само съществата, които харесвате! Не си отказвайте нищо!
Сигурно е. Честно казано, дори не мога да си представя устройство, където всичко това може да се използва.
Цветен дисплей + SD + MP3 плейър с модна кожа + радиво + бордови компютър + шо той харесва)))