Страница 1 из 2
Для профи! STM32F10x MD - CMSIS - тактирование, прерывания
Добавлено: Вт авг 15, 2017 15:31:34
V2oD2o
Всем мяу!
Решил изучить 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 тиками в секунду + прерывание по переполению раз в секунду - но чота нет прерываний..
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 15, 2017 16:06:30
Z_h_e
Я не профи, извиняйте что залез в данный топик

.
Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя?
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 15, 2017 18:38:51
Zhuk72
Я тоже не профессионал, но могу поделиться своей инициализацией. Частота системная 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
}
}
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 15, 2017 18:39:56
AlanDrakes
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МГц в переменной, то получим уже значительно бОльший интервал.
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 15, 2017 19:08:55
Zhuk72
Забыл про таймер:
Спойлер
Код: Выделить всё
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;
}
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Ср авг 16, 2017 13:15:36
dosikus
V2oD2o,
как и чем проверяете?
Покажите хэндлер прерывания.
Подключен ли стартап?
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Чт авг 17, 2017 14:50:05
V2oD2o
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3163114#p3163114"]Я не профи, извиняйте что залез в данный топик

.
Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя?[/uquote]
Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup..
Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно?
Всем большое спасибо что отозвались!
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Чт авг 17, 2017 15:00:09
Reflector
[uquote="V2oD2o",url="/forum/viewtopic.php?p=3164509#p3164509"]Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup..
Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно?[/uquote]
Насколько я понимаю проблема в банальном отсутствии extern "C"...
Хотя если стартап на С++, то это не нужно.
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Чт авг 17, 2017 15:23:38
V2oD2o
[uquote="Reflector",url="/forum/viewtopic.php?p=3164523#p3164523"]Насколько я понимаю проблема в банальном отсутствии extern "C"...
Хотя если стартап на С++, то это не нужно.[/uquote]
стартап на ассемблере .s
пишет:
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и main -> while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Чт авг 17, 2017 15:42:32
Reflector
[uquote="V2oD2o",url="/forum/viewtopic.php?p=3164552#p3164552"]
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s[/uquote]
К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме

Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Чт авг 17, 2017 15:45:24
V2oD2o
[uquote="Reflector",url="/forum/viewtopic.php?p=3164568#p3164568"][uquote="V2oD2o",url="/forum/viewtopic.php?p=3164552#p3164552"]
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s[/uquote]
К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме

[/uquote]
Блин, затупил, вот же:
Код: Выделить всё
extern "C" void TIM2_IRQHandler() {
TIM2->SR &= ~TIM_SR_UIF;
GPIOC->ODR ^= GPIO_ODR_ODR13;
}
Код собрался, еще в работе не проверял)
Спасибо!
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Пн авг 21, 2017 16:48:30
afz
Reflector писал(а):К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме
Для STM32 первая часть стартапа
всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта.
V2oD2o писал(а):TIM2->ARR = 10000;
А в регистр ARR надо помещать число, на единицу меньше требуемого, поскольку счетчик таймера считает от нуля до содержимого ARR
включительно. И, если там будет 10000, прерывание произойдет после 10001-го импульса, а не после 10000-го. В руководстве об этом написано несколько невнятно, тем не менее это так. На остальные косяки, вроде-бы, уже указали...
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Пн авг 21, 2017 17:06:07
Reflector
[uquote="afz",url="/forum/viewtopic.php?p=3167004#p3167004"]Для STM32 первая часть стартапа всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта[/uquote]
Прям таки всегда? И что же мешает написать стартап на С или даже С++?
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 04:32:55
afz
Вероятно тот факт, что ни в простом, ни в приплюснутом Си не существует нормальных средств положить в начало флеш-памяти программ таблицу векторов. Этот асмовый стартап, собственно и состоит из таблицы векторов и набора заглушек для тех векторов, которые не будут использоваться, чтобы линкер не обиделся на отсутствующие внешние ссылки. А чтобы он не обиделся на повторное объявление внешней ссылки, заглушки в стартапе объявлены слабыми (WEAK). Кстати, и этой возможности в Си я что-то не припомню...
А дальше - вызов SystemInit , переход к __main, и всё! Предложенные MCD Application Team варианты этих программ написаны на простом СИ, для приплюснутого Си в них предусмотрено extern "C" { ... } посредством условной компиляции. SystemInit содержит несколько вариантов тех самых действий, которые V2oD2o показал под комментарием /* CLOCK */, а __main производит необходимую настройку и вызывает main(). Собственно, никто не мешает написать свой вариант этих программ, но зачем? Разве что потренироваться, как это делает топикстартер...
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 06:44:43
oleg110592
Плагин для 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
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 07:45:49
afz
Круто!
Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу.
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 09:31:56
Reflector
[uquote="oleg110592",url="/forum/viewtopic.php?p=3167459#p3167459"]Плагин для Visual Studio VisualGDB из коробки создает проекты где стартап на Си и никаких в проекте асм файлов.[/uquote]
Я VisualGDB и юзаю, причем у меня стартап переписан на С++ и никакие extern "C" я не добавляю. Разницы в размере бинарника относительно С естественно нет.
[uquote="afz",url="/forum/viewtopic.php?p=3167488#p3167488"]Круто!
Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу.[/uquote]
Нету там ничего на ассме, можно пройтись пошагово отладчиком и убедиться. Единственная функция __libc_init_array() которая вызывается из прекомпилированной либы написана на С, при отладке автоматически скачиваются ее сорсы и можно заходить и в нее тоже.
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 10:42:02
dosikus
[uquote="Reflector",url="/forum/viewtopic.php?p=3167536#p3167536"]Единственная функция __libc_init_array()[/uquote]
Это у тебя на плюсах.
В 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:
в которой куча кода
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 11:01:47
Reflector
[uquote="dosikus",url="/forum/viewtopic.php?p=3167591#p3167591"]Это у тебя на плюсах.[/uquote]
Понятно, что в Keil и большинстве других сред все на ассме, но мы тут обсуждали саму возможность написания стартапов на С/С++. Это возможно, причем без приложения каких-то сверхусилий. Получается компактный и понятный код который легко модифицировать и именно это должно быть в приоритете, а не желание сэкономить на стартапе 10 байт.
Re: Для профи! STM32F10x MD - CMSIS - тактирование, прерыван
Добавлено: Вт авг 22, 2017 11:37:33
dosikus
[uquote="Reflector",url="/forum/viewtopic.php?p=3167605#p3167605"]Получается компактный и понятный код который легко модифицировать и именно это должно быть в приоритете, а не желание сэкономить на стартапе 10 байт.[/uquote]
А если подучить асм ...