0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 22
1

STM32F030F4P6 [TSSOP20] не работает таймер (или прерывания)

21.07.2015, 22:53. Показов 11652. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Не поделится ли кто рабочим кодом под данный чип? желательно написанный в блокноте, или типа того, не в среде разработке (сам пишу код в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2015, 22:53
Ответы с готовыми решениями:

Прошивка STM32F030F4P6 TSSOP20 via ST-LINK/V2
Помогите пожалуйста понять природу такого поведении - ST-LINK-ом с дискавери программирую целевой...

Не работают прерывания ADC на STM32f030f4p6
Здравствуйте, такая проблема - не получается включить прерывания по завершению преобразования ADC....

Прерывания и таймер
подскажите ,а прерывания срабатывают без таймера ? на втором проекте выключаю все таймеры и...

STM32F030F4P6 подал питание не на ту ногу, сжёг или нет?
Доброго всем времени суток! Решил ознакомится с мк STM32. Ждать из Китая отладочные платки нужно...

13
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
Цитата Сообщение от Парфирий
переменная a объявлена как volatile ? Очень рекомендую добавить данный модификатор
Пришёл домой, попробовал.
Использую 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
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;
}
}

вывод gdb тот же
(мда, что-то мне кажется, что придётся ЛУТом не 20 ног делать, а 64... под F4x какой-нить...)
Во-первых, если Вы используете CMSIS + SPL, то, подозреваю, вызов SystemInit() в main - лишний, т.к. эта функция вызывается ещё до usir-main (см. *.S файл, приложенный к посту).
Во-вторых, причём тут 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
Цитата Сообщение от Парфирий
Во-вторых, причём тут F4 и 64-ногий камень, если с самым простым пока не получается? Может имеет смысл задействовать полноценную IDE с функционалом пошаговой отладки, пока мало опыта?
На F4 у меня с таймерами проблем не было. IDE - пробовал, однако винды нету, а в линуксе привычнее оказалась связка vim+gcc. Впрочем - попробую.
За файлы спасибо, приеду на работу - попробую.

Цитата Сообщение от Iddy_Im
А точно в SPL не надо указывать источник тактирования systysk и явно этот таймер запускать? В libopencm3 все это нужно выполнять.
Да и вообще, на кой черт этот SPL, тем паче для STM32F0? Там же не такой уж толстый даташит, можно вообще на регистрах только с CMSIS...
Я не нашёл где и как указывать, у меня тоже такая мысль была. На регистрах пробовал - не сработало. Собственно, почему и прошу пример. Много чего перебрал уже...
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
Цитата Сообщение от Парфирий
Во-вторых, причём тут F4 и 64-ногий камень, если с самым простым пока не получается? Может имеет смысл задействовать полноценную IDE с функционалом пошаговой отладки, пока мало опыта?
На F4 у меня с таймерами проблем не было. IDE - пробовал, однако винды нету, а в линуксе привычнее оказалась связка vim+gcc. Впрочем - попробую.

Я тоже веду разработку под 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
STM32f050 (stm32f030)
С каких это пор?
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
22.07.2015, 21:07 11
Цитата Сообщение от wirty
Цитата Сообщение от judshym
STM32f050 (stm32f030)
С каких это пор?
согласен, опечатка 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
Теперь осталось найти дубликаты в проекте, функции - которые тоже лезут в эти регистры.
main.c в функции init()
Код
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 03:09
Помогаю со студенческими работами здесь

Обработчик прерывания: таймер.
ПОМОГИТЕ! Написать программу, которая за определенный интервал времени показывает фамилию заданное...

PIC16F84A, прерывания, таймер
Есть задание: &quot;Разработать программу на ассемблер для PIC16F84A, которая бы обеспечивала постоянное...

таймер прерывания 8051
Здравствуйте такой вопрос #загрузка указателя 0006 0200: 90 03 00 p: MOV ...

Прерывания и таймер на ассемблере
Добрый день. Только вливаюсь в тему программирования микроконтроллеров. Возник вопрос: можно ли...

Msp430 IAR Embedded прерывания,таймер
Реализация прерывающей подпрограммы, реализующей таймер. Выдержка времени (в мс) задается в ячейке...

функция перехвата прерывания 1Ch таймер
.286 ASKII_code_key_check equ 'A' ASKII_code_key equ 'B' number_handler_int21_02h equ 02h...

STM32. Таймер и прерывания по его переполнению
Есть код: /* System Clocks Confikurotion */ RCC_Confikurotion(); /* GPIO Confikurotion */...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru