Ortim_Horkusho
|
|
1 | |
Помогите разобраться с прерыванием таймера06.04.2015, 22:46. Показов 5247. Ответов 11
Метки нет (Все метки)
Доброго времени суток. Прошу прощение, если тема подымалась!
Итак емется отладочная плата 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);} |
06.04.2015, 22:46 | |
Ответы с готовыми решениями:
11
Мигание с прерыванием из таймера 3 (TIM3). Помогите с прерыванием по сравнению ORC0 Многозадачность с прерыванием от таймера. Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера |
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
Есть 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 | |
07.04.2015, 17:56 | |
Помогаю со студенческими работами здесь
12
Помогите с созданием таймера Помогите с дописанием таймера в код Помогите организовать прерывание таймера на Cortex-M3 Помогите создать класс таймера похожий на delphi)) помогите решить проблему с выгоранием таймера 555 в серийном Помогите сделать ActiveX компонент Таймера на микросекунду из готовых исходников Помогите разобраться Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |