Форум РадиоКот https://radiokot.ru/forum/ |
|
Для профи! STM32F10x MD - CMSIS - тактирование, прерывания https://radiokot.ru/forum/viewtopic.php?f=59&t=147575 |
Страница 1 из 2 |
Автор: | V2oD2o [ Вт авг 15, 2017 15:31:34 ] |
Заголовок сообщения: | Для профи! STM32F10x MD - CMSIS - тактирование, прерывания |
Всем мяу! Решил изучить CMSIS по RefManual.. Подскажите что не так с настройками тактирования и таймером? Код: /* CLOCK */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); while((RCC->CR & RCC_CR_HSERDY) == 0); FLASH->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(((uint32_t)0x00010000) | RCC_CFGR_PLLMULL9); RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0) { } RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } /* TIM2 */ RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = SystemCoreClock / 720 - 1; TIM2->ARR = 10000; TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM2_IRQn); Поидее 72MHz с HSE 8x9, и таймер с 100000 тиками в секунду + прерывание по переполению раз в секунду - но чота нет прерываний.. |
Автор: | Z_h_e [ Вт авг 15, 2017 16:06:30 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Я не профи, извиняйте что залез в данный топик ![]() Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя? |
Автор: | Zhuk72 [ Вт авг 15, 2017 18:38:51 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Я тоже не профессионал, но могу поделиться своей инициализацией. Частота системная 48 МГц, но это вы уже сами поправите при желании. Сравните со своей. СпойлерКод: void init (void) { unsigned long HSEStatus; unsigned int StartUpCounter; // Clock setup RCC->CR |= RCC_CR_HSEON; // HSE clock enable /* Wait till HSE is ready and if Time out is reached exit */ StartUpCounter = 0; do { HSEStatus = (RCC->CR & RCC_CR_HSERDY); // Выделение бита HSEREADY StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); if (RCC->CR & RCC_CR_HSERDY) // if HSE is UP { // USBCLK = 48MHz RCC->CFGR |= RCC_CFGR_USBPRE; // USB prescaler = 1 // PLLCLK = 48MHz RCC->CFGR |= RCC_CFGR_PLLMULL6; // PLL multiplication factor = 6 // HSE = 8 MHz RCC->CFGR |= RCC_CFGR_PLLSRC_HSE; // HSE as PLL input clock // AHB clock = 12 MHz RCC->CFGR |= RCC_CFGR_HPRE_DIV4; // AHB prescaler = /4 RCC->CFGR |= RCC_CFGR_MCO_PLL; // MCO = PLLCLK/2 // APB high-speed prescaler (APB2) not divided (12 MHz). RCC->CFGR &= ~RCC_CFGR_PPRE2; // APB low-speed prescaler (APB1) not divided (12 MHz). RCC->CFGR &= ~RCC_CFGR_PPRE1; // ADC prescaler, ADCCLK = APB2/6 = 2MHz RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // PLL enable RCC->CR |= RCC_CR_PLLON; // Wait for PLL ready while((RCC->CR & RCC_CR_PLLRDY) == 0); // SYSCLK = 48 MHz RCC->CFGR |= RCC_CFGR_SW_PLL; // System clock switch = PLL // Wait PLL as system clock while ((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL); } else { // What to do if HSE failed. RCC->CR &= RCC_CR_HSEON; // HSE oscillator OFF RCC->CR |= RCC_CR_HSION; // Internal 8 MHz RC oscillator ON while((RCC->CR & RCC_CR_HSIRDY) == 0); // Ожидание готовности HSI RCC->CFGR &= RCC_CFGR_PLLSRC_HSI_Div2; // HSI/2 as PLL input clock RCC->CFGR |= RCC_CFGR_PLLMULL12; // PLL multiplication factor = 12 } } |
Автор: | AlanDrakes [ Вт авг 15, 2017 18:39:56 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
1. Между настройкой татового генератора и использованием переменной SystemCoreClock, не вижу вызова SystemCoreClockUpdate(), иначе там будет 8000000 (стандартная константа). 2. Кажется, немного не так должен настраиваться предделитель. (8000000) / 720 - 1 = 11110. ARR = 10000 Переполнение таймера произойдёт через: (10000 * 11110) / 72000000 (тактовая частота) ~ 1,54секунды. Ну это не столь критично. 3. Вроди бы... если правильно помню, лучше явно указывать значение. TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN; А если 72МГц в переменной, то получим уже значительно бОльший интервал. |
Автор: | Zhuk72 [ Вт авг 15, 2017 19:08:55 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Забыл про таймер: СпойлерКод: void t2set (void) { // TIM2 clock enabled (12 MHz) RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Counter used as downcounter: TIM2->CR1 = TIM_CR1_DIR; // Only counter overflow/underflow generates an update interrupt or DMA request if enabled: TIM2->CR1 |= TIM_CR1_URS; // Auto-reload preload enable (ARR) TIM2->CR1 |= TIM_CR1_ARPE; // Timer prescaler TIM2->PSC = 0x2EE0; // 12000 * (1/12)us = 1ms = 1 Tick //TIM2->PSC = 12; // 12 * (1/12)us = 1us = 1 Tick // Autoreload value TIM2->ARR = MS500 - 1; // 500ms with 1ms tick //TIM2->ARR = 999; // 1ms with 1us tick // Counter enabled: TIM2->CR1 |= TIM_CR1_CEN; // Initial value TIM2->DIER = 0; // Update interrupt enable: TIM2->DIER |= TIM_DIER_UIE; // Clear TIM2 flag TIM2->SR &= ~TIM_SR_UIF; // Interrupt enable: NVIC_EnableIRQ(TIM2_IRQn); // To freeze the Timer during debug when program pauses. DBGMCU->CR |= DBGMCU_CR_DBG_TIM2_STOP; } |
Автор: | dosikus [ Ср авг 16, 2017 13:15:36 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
V2oD2o, как и чем проверяете? Покажите хэндлер прерывания. Подключен ли стартап? |
Автор: | V2oD2o [ Чт авг 17, 2017 14:50:05 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Я не профи, извиняйте что залез в данный топик ![]() Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя? Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup.. Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно? Всем большое спасибо что отозвались! |
Автор: | Reflector [ Чт авг 17, 2017 15:00:09 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup.. Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно? Насколько я понимаю проблема в банальном отсутствии extern "C"... Код: extern "C" void SysTick_Handler() { } Хотя если стартап на С++, то это не нужно. |
Автор: | V2oD2o [ Чт авг 17, 2017 15:23:38 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Насколько я понимаю проблема в банальном отсутствии extern "C"... Код: extern "C" void SysTick_Handler() { } Хотя если стартап на С++, то это не нужно. стартап на ассемблере .s пишет: startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler' что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и main -> while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s |
Автор: | Reflector [ Чт авг 17, 2017 15:42:32 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler' что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме ![]() |
Автор: | V2oD2o [ Чт авг 17, 2017 15:45:24 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler' что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме ![]() Блин, затупил, вот же: Код: extern "C" void TIM2_IRQHandler() { TIM2->SR &= ~TIM_SR_UIF; GPIOC->ODR ^= GPIO_ODR_ODR13; } Код собрался, еще в работе не проверял) Спасибо! |
Автор: | afz [ Пн авг 21, 2017 16:48:30 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Reflector писал(а): К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме Для STM32 первая часть стартапа всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта.V2oD2o писал(а): TIM2->ARR = 10000; А в регистр ARR надо помещать число, на единицу меньше требуемого, поскольку счетчик таймера считает от нуля до содержимого ARR включительно. И, если там будет 10000, прерывание произойдет после 10001-го импульса, а не после 10000-го. В руководстве об этом написано несколько невнятно, тем не менее это так. На остальные косяки, вроде-бы, уже указали...
|
Автор: | Reflector [ Пн авг 21, 2017 17:06:07 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Для STM32 первая часть стартапа всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта Прям таки всегда? И что же мешает написать стартап на С или даже С++? |
Автор: | afz [ Вт авг 22, 2017 04:32:55 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Вероятно тот факт, что ни в простом, ни в приплюснутом Си не существует нормальных средств положить в начало флеш-памяти программ таблицу векторов. Этот асмовый стартап, собственно и состоит из таблицы векторов и набора заглушек для тех векторов, которые не будут использоваться, чтобы линкер не обиделся на отсутствующие внешние ссылки. А чтобы он не обиделся на повторное объявление внешней ссылки, заглушки в стартапе объявлены слабыми (WEAK). Кстати, и этой возможности в Си я что-то не припомню... А дальше - вызов SystemInit , переход к __main, и всё! Предложенные MCD Application Team варианты этих программ написаны на простом СИ, для приплюснутого Си в них предусмотрено extern "C" { ... } посредством условной компиляции. SystemInit содержит несколько вариантов тех самых действий, которые V2oD2o показал под комментарием /* CLOCK */, а __main производит необходимую настройку и вызывает main(). Собственно, никто не мешает написать свой вариант этих программ, но зачем? Разве что потренироваться, как это делает топикстартер... |
Автор: | oleg110592 [ Вт авг 22, 2017 06:44:43 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Плагин для Visual Studio VisualGDB из коробки создает проекты где стартап на Си и никаких в проекте асм файлов. положить в начало флеш-памяти программ таблицу векторов делает типа так: Код: void * g_pfnVectors[0x30] __attribute__ ((section (".isr_vector"), used)) = { &_estack, &Reset_Handler, &NMI_Handler, &HardFault_Handler, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &SVC_Handler, NULL, NULL, &PendSV_Handler, &SysTick_Handler, &WWDG_IRQHandler, ........ } размещение секции isr_vector расписано в файле линкера: Код: ENTRY(Reset_Handler) MEMORY { FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 32K SRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 4K } _estack = 0x20001000; SECTIONS { .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > FLASH .......... } заглушки: Код: void NMI_Handler() __attribute__ ((weak, alias ("Default_Handler"))); void HardFault_Handler() __attribute__ ((weak, alias ("Default_Handler"))); void SVC_Handler() __attribute__ ((weak, alias ("Default_Handler"))); ...... https://visualgdb.com/?features=embedded |
Автор: | afz [ Вт авг 22, 2017 07:45:49 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Круто! Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу. |
Автор: | Reflector [ Вт авг 22, 2017 09:31:56 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Плагин для Visual Studio VisualGDB из коробки создает проекты где стартап на Си и никаких в проекте асм файлов. Я VisualGDB и юзаю, причем у меня стартап переписан на С++ и никакие extern "C" я не добавляю. Разницы в размере бинарника относительно С естественно нет. Круто! Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу. Нету там ничего на ассме, можно пройтись пошагово отладчиком и убедиться. Единственная функция __libc_init_array() которая вызывается из прекомпилированной либы написана на С, при отладке автоматически скачиваются ее сорсы и можно заходить и в нее тоже. |
Автор: | dosikus [ Вт авг 22, 2017 10:42:02 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Единственная функция __libc_init_array() Это у тебя на плюсах. В Keil : Код: ******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap в SES в thumb_crt0.s : _start: в которой куча кода |
Автор: | Reflector [ Вт авг 22, 2017 11:01:47 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Это у тебя на плюсах. Понятно, что в Keil и большинстве других сред все на ассме, но мы тут обсуждали саму возможность написания стартапов на С/С++. Это возможно, причем без приложения каких-то сверхусилий. Получается компактный и понятный код который легко модифицировать и именно это должно быть в приоритете, а не желание сэкономить на стартапе 10 байт. |
Автор: | dosikus [ Вт авг 22, 2017 11:37:33 ] |
Заголовок сообщения: | Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван |
Получается компактный и понятный код который легко модифицировать и именно это должно быть в приоритете, а не желание сэкономить на стартапе 10 байт. А если подучить асм ... |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |