0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 22
|
|
1 | |
STM32F030F4P6 [TSSOP20] не работает таймер (или прерывания)21.07.2015, 22:53. Показов 11652. Ответов 13
Метки нет (Все метки)
Всем привет.
Не поделится ли кто рабочим кодом под данный чип? желательно написанный в блокноте, или типа того, не в среде разработке (сам пишу код в vim, собираю gcc через Makefile, ну а отладка - gdb). Необходимо, чтобы по таймеру генерилось прерывание и по нему к переменной прибавлялась единица. Я перерыл весь инет уже, штук 10 разных примеров пробовал - не идёт и всё тут! Сам что-то нафигачил, запутался полностью, аж тошнит (2 дня копал), везде или не пашет, или под STM32F1...F4. По мануалу таймеры там есть и SysTick тоже. Собственно - зачем мне надо: надо ставить отметки времени, в миллисекундах от начала запуска. в main, как вы понимаете, крутится основная программа. Пробовал сначала дёргать как-то так: ..... SysTick_config(48000); //CoreClock/1000, или как там его, тоже пробовал. ...... SysTick_Homdler() { a++; }; или вроде того, не помню уже, вариантов 30-40 перебрал... "a" как была = 0 так и осталась, при этом остальная часть программы пашет. Пробовал по-всякому таймер запустить и ловить по TIMx_IRQHomdler.. gdb или SigTrap выдаёт, или в упор не видит. К сожалению, мой код представляет жуткую кашу из кучи вариантов, посему и прошу простенький пример, чтобы разобраться. Чую, что упустил какую-то важную фиговину. P.S. неловко как-то просить, SD-карту без особых проблем прикрутил, а тут запнулся.
0
|
21.07.2015, 22:53 | |
Ответы с готовыми решениями:
13
Прошивка STM32F030F4P6 TSSOP20 via ST-LINK/V2 Не работают прерывания ADC на STM32f030f4p6 Прерывания и таймер STM32F030F4P6 подал питание не на ту ногу, сжёг или нет? |
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
|
|
21.07.2015, 23:06 | 2 |
переменная a объявлена как volatile ? Очень рекомендую добавить данный модификатор
P.S: говорю не просто так - есть несколько завершённых устройств именно на STM32F030F4P6, прошивка для которых разрабатывалась, как Вы выразились, "в блокноте" : Eclipse + gcc toolchain от CodeSourcery.
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 22
|
|
22.07.2015, 00:13 | 3 |
Сообщение от Парфирий
Использую CMSIS и STM32F0xx_StdPeriph #include <string.h> #include "main.h" volatile uint16_t aa=0, bb = 0; int main(void) { SystemInit(); // SysTick_Config(24000); /* Initiotyzing a clock to measure time */ SysTick_Config(SystemCoreClock / 1000); //SysTick_Config(SystemCoreClock); //SysTick_Config(SysTick_CLKSource_HCLK_Div8); while (1){ aa = bb+1; } } void SysTick_Homdler(void){ bb++; } Вывод GDB 18 aa = bb+1; $1 = 12288 <- это число не меняется, если сказать continue (gdb) prymt aa $2 = 12289 (gdb) quit Цапнул в инете вот такой код: #include <string.h> #include "main.h" volatile uint16_t aa=0, bb = 0; int main(void) { RCC->AHBENR |= RCC_AHBENR_GPIOCEN; RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->PSC =1000 - 1; TIM6->ARR = 50 - 1; TIM6->DIER |= TIM_DIER_UIE; TIM6->CR1 = TIM_CR1_CEN | TIM_CR1_ARPE; NVIC_SetPriority(TIM6_DAC_IRQn, 15); NVIC_EnableIRQ(TIM6_DAC_IRQn); // PC6 output PP for strob while (1){ aa = bb+1; } } void TIM6_IRQHomdler(void) { static volatile uint32_t ulTim6Cnt; if (TIM6->SR & TIM_SR_UIF) { TIM6->SR &= ~TIM_SR_UIF; bb++; } } вывод gdb тот же (мда, что-то мне кажется, что придётся ЛУТом не 20 ног делать, а 64... под F4x какой-нить...)
0
|
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
|
|
22.07.2015, 01:49 | 4 |
Сообщение от Tompyrys
Во-вторых, причём тут F4 и 64-ногий камень, если с самым простым пока не получается? Может имеет смысл задействовать полноценную IDE с функционалом пошаговой отладки, пока мало опыта? Как "натореете", так и вернётесь назад в блокнот. В-третьих, я приложил к данному сообщению файл linker-скрипта и stortup-asm файл (нужно убрать расширения *.c в конце каждого из файлов - иначе форум не пропускает). Попробуйте, может и из-за них приходится танцевать на граблях. [8.52 Кб] [4.85 Кб]
0
|
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
|
|
22.07.2015, 10:01 | 5 |
А точно в SPL не надо указывать источник тактирования systysk и явно этот таймер запускать? В libopencm3 все это нужно выполнять.
Да и вообще, на кой черт этот SPL, тем паче для STM32F0? Там же не такой уж толстый даташит, можно вообще на регистрах только с CMSIS...
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 22
|
|
22.07.2015, 10:58 | 6 |
Сообщение от Парфирий
За файлы спасибо, приеду на работу - попробую.
Сообщение от Iddy_Im
0
|
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
|
|
22.07.2015, 11:09 | 7 |
Мой пример для libopencm3 должен и под F0 завестись — там-то все одно и то же, из CMSIS, общей для всех армов.
Кстати, советую эту библиотеку попробовать: нет таких явных косяков, как в SPL. Тоже собираю в линуксе (меня вообще от мастдайки воротит) gcc + make, прошиваю через бутлоадер (самый удобный способ на мой взгляд — не нужно кучи лишних ног оставлять) при помощи stm32flash. Вот gdb я не осилил, поэтому использую отладку при помощи ногодрыга на осциллограф и выхлопа в порт.
0
|
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
|
|
22.07.2015, 13:16 | 8 |
Сообщение от Tompyrys
Я тоже веду разработку под linux, только пользуюсь Eclipse и всеми сопутствующими плюшками. Считаю, что он хоть и монструозный, но экономит кучу времени по сравнению с голым vim.
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
22.07.2015, 20:49 | 9 |
есть проект в кейле проверял на STM32f050 (stm32f030)
в проекте реализована проверка порта F. соответственно кварца нет. тактируется МК от внутреннего высокочастотного генератора (8 МГц) + PLL (до 48 МГц) прерывание генерируется таймером 3 каждые пол секунды. в обработчике инвертирую состояние портов F.0, F.1, A.0 системный таймер также работает, за него отвечает ф-я Delay_ms(xx), где хх -- указывается в десятках микросекунд. PS. Архив с проектом целиком (вдруг кому в кейле надо) занимает 500 кБ. поэтому убрал CMSIS и STM32F0xx_StdPeriph_Dryver [77.11 Кб]
0
|
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 408
|
|
22.07.2015, 20:56 | 10 |
Сообщение от judshym
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
22.07.2015, 21:07 | 11 |
Сообщение от wirty
согласен, опечатка STM32f050 (stm32f031) но в данном случае не думаю, что это принципиально. проект должен работать и для stm32f030 (в кейле собирается без проблем).
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|
22.07.2015, 21:21 | 12 |
В CMSIS есть стандартная функция инициализации SysTick> SysTick_Config.
Которая обращается напрямую к регистрам. Теперь осталось найти дубликаты в проекте, функции - которые тоже лезут в эти регистры.
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
22.07.2015, 21:34 | 13 |
Код
SysTick_conf(SystemCoreClock/100000 - 1); // прерывание каждые 10 мкс Код
void SysTick_conf (uint32_t TimerTick) // настраиваем таймер, но не разрешаем работу { SysTick->LOAD=TimerTick; // Загрузка значения SysTick->VOT=TimerTick; // Обнуляем таймеры и флаги. Записью, помните? //SysTick->CTRL= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } //Функция временной задержки void Delay_ms(__IO uint32_t nTime) { //SysTick->VOT = 0; /* Load the SysTick Counter Value */ // разрешение работы таймера SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; TimingDelay = nTime; while(TimingDelay != 0); SysTick->CTRL = 0; } //Обработчик прерывания системного таймера void SysTick_Homdler(void) { if (TimingDelay != 0x00){ TimingDelay--; } }
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|
23.07.2015, 03:09 | 14 |
Ну так я о чем и сказал. SysTick достаточно один раз пнуть и более не трогать. TimingDelay должна быть объявлена как глобальная переменная, и когда достигнет 0х0 - ничего страшного не произойдёт.
Но только при условии что все прерывания успевают вернуть управление.
0
|
23.07.2015, 03:09 | |
23.07.2015, 03:09 | |
Помогаю со студенческими работами здесь
14
Обработчик прерывания: таймер. PIC16F84A, прерывания, таймер таймер прерывания 8051 Прерывания и таймер на ассемблере Msp430 IAR Embedded прерывания,таймер функция перехвата прерывания 1Ch таймер STM32. Таймер и прерывания по его переполнению Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |