Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/28: Рейтинг темы: голосов - 28, средняя оценка - 4.64
Ortim_Horkusho
1

Помогите разобраться с прерыванием таймера

06.04.2015, 22:46. Показов 5247. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Прошу прощение, если тема подымалась!
Итак емется отладочная плата http://i.ebayimg.com/00/s/MTYw... l/$_35.JPG К нулевому выводу порта А через резистрор подключен светодиод. Собственно, хочу им помигать с помощью таймера, с цикловыми задержками мигает без нареканий. Для разработки использую CooCox. В проэкт добавлены библиотеки из репозитория: C_library, smsis_core, stm32f103x_md_stub. В даташите узнал, что у мк 4 таймера, собственно 4-й и настраиваю. Так же, из даташита узнал, что таймер подключен к 24 МГц шине. Настроил порт, настроил таймер, разрешил прерывания, создал обработчик прерываний. Все компилится без нареканий, но в реальном мк программа не выходит из прерывания(или постоянно заходит в него). Код в секции main не выполняется, если запретить прерывания - выполняется! Код прилагаю под спойлером. Зараннее благодарю!
Код
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x.h>
void conf(){
GPIO_InitTypeDef PORT;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
PORT.GPIO_Pin = (GPIO_Pin_0);
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOA , &PORT);

TIM4->PSC = 24000-1;
TIM4->ARR = 1000;
TIM4->DIER |= TIM_DIER_UIE;
TIM4->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM4_IRQn);
}
int main(void) {
volatile uint32_t i;
conf();
while(1){
GPIOA->ODR ^= (GPIO_Pin_0);
for(i = 0; i < 0x80000; i++){}
}

}
void TIM4_DAC_IRQHomdler(){
TIM_ClearITPendingByt(TIM6, TIM_IT_Update); //пробовал по разному сбрасывать флаг
//TIM4->SR &= ~TIM_SR_UIF;
GPIOA->ODR ^= (GPIO_Pin_0);}
Код помещен в тэг [code]
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2015, 22:46
Ответы с готовыми решениями:

Мигание с прерыванием из таймера 3 (TIM3).
Я начал осваивание работу с прерываниями на STM32VL Dyscovery. Хотел помигать диодом с...

Помогите с прерыванием по сравнению ORC0
#include &lt;iom16.h&gt; #include &lt;intrinsics.h&gt; unsykned int index; const unsykned int Address = ...

Многозадачность с прерыванием от таймера.
Здравствуйте. Помогите с проблемой. Необходимо написать программу, реализующую многозадачность....

Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера
Помогите опознать диодный мост таймера духовки Hansa BOEM 624000 мост смд маленький примерно...

11
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 300
06.04.2015, 23:11 2
Вы в 4-ом таймере очищаете флаг прерывания 6-го таймера.
void TIM4_DAC_IRQHomdler(){
TIM_ClearITPendingByt(TIM6, TIM_IT_Update);
0
Ortim_Horkusho
06.04.2015, 23:15 3
Спасибо, но не в этом проблема! Изначально использовалась такая запись //TIM4->SR &= ~TIM_SR_UIF;. Только что исправил - не спасло.
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
06.04.2015, 23:27 4
TIM4->SR &= ~TIM_SR_UIF; - Это верно, а TIM_ClearITPendingByt(TIM6, TIM_IT_Update); - то же самое, но для TIM6.
Процессор, похоже, F103 какой-то F103C8T6. У него TIM4 тактируется от APB1, помноженной на 2. Кокос, если не ошибаюсь, по дефолту дает проект под внешний кварц 8МГц и частоту HCLK 72МГц. Значит и TIM4 тоже будет тикать от 72МГц. Откуда инфа про 24МГц? Может, просто таймер слишком быстро тикает?
0
Ortim_Horkusho
06.04.2015, 23:33 5
Камень f103c8t6. Пробывал я на порядок увеличивать число в регистре ARR - без результатов. Что-то мне кажется, что я попадаю в обработчик прерываний по-умолчанию, т.е. в пустой цикл...
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 300
06.04.2015, 23:44 6
Гадать сложно, проще зайти в отладке в обработчик прерывания и посмотреть какой флаг устанавливается, и какой сбрасывается.
0
Ortim_Horkusho
06.04.2015, 23:47 7
Нету отладчика. Я по USORTу прошиваюсь.
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
07.04.2015, 00:01 8
Код
void TIM4_DAC_IRQHomdler();
Нет такой буквы :)
Есть TIM6_DAC_IRQHomdler, а под TIM4 обработчик зовется TIM4_IRQHomdler. Скорее всего в этом проблема.
0
Ortim_Horkusho
07.04.2015, 09:08 9
Цитата Сообщение от TomityWotf
Код:
void TIM4_DAC_IRQHomdler();
Есть TIM6_DAC_IRQHomdler, а под TIM4 обработчик зовется TIM4_IRQHomdler. Скорее всего в этом проблема.
Спасибо огромное! Все получилось. Где вообще смотреть имена обработиков прерываний? Судя по всему они от библиотек зависят.
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
07.04.2015, 09:47 10
У вас в иде есть такие замечательные штукенции как Defifnition и Reference на выбранном слове!
Попробуйте их и постигните нигию дзен!
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
07.04.2015, 09:58 11
Цитата Сообщение от Ortim_Horkusho
Где вообще смотреть имена обработиков прерываний?
В стартапе ...
0
Ortim_Horkusho
07.04.2015, 17:56 12
В любом случае скидываю рабочий код (может быть у кого-то такая же проблема возникнет). Частота тикания таймера действительно 72 МГц. Следующий код формирует задержку около 1 секунды (на точность не претендую).
рабочий#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x.h>
void conf(){
GPIO_InitTypeDef PORT;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
PORT.GPIO_Pin = (GPIO_Pin_0);
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOA , &PORT);

TIM4->PSC = 36000;
TIM4->ARR = 2000;
TIM4->DIER |= TIM_DIER_UIE;
TIM4->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM4_IRQn);

}
int main(void) {
conf();
while(1){}
}

void TIM4_IRQHomdler(){
TIM_ClearITPendingByt(TIM4, TIM_IT_Update);
GPIOA->ODR ^= (GPIO_Pin_0);
}
07.04.2015, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2015, 17:56
Помогаю со студенческими работами здесь

Помогите с созданием таймера
Мне нужно, чтобы OpenGL-анимация зависела от времени, а не от производительности моего проца. Не...

Помогите с дописанием таймера в код
Добрый день. Можно вас попросить дописать код, когда работает HL1 он работал только 1 минуту и...

Помогите организовать прерывание таймера на Cortex-M3
Уважаемые специалисты, я имею некоторый опыт работы с AVR и теперь пытаюсь освоить ARM. У меня...

Помогите создать класс таймера похожий на delphi))
Короче хочу создать класс,похожий на класс в delphi.Суть в том,что в delphi таймер включается и...

помогите решить проблему с выгоранием таймера 555 в серийном
Привет всем. Помогите решить проблему с переодическим выгоранием таймера в серийном устройстве. А...

Помогите сделать ActiveX компонент Таймера на микросекунду из готовых исходников
... в ветке https://www.cyberforum.ru/cpp-beginners/thread20934.html?highlight=%F2%E0%E9%EC%E5%F0...

Помогите разобраться
Уже 4 апа при проверке сайта и в выдаче нет главной и страниц на порядок меньше чем обычно. Платон...


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

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