stm32f4 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 (изменено) · Жалоба Всем привет. Начну сначала) На днях попал мне в руки stm32f405, ну думаю ща поиграюсь, но не тут-то было( Развел платку прилепил светодиод, накнопал простейшую программу мигания светодиода по таймеру: #include "stm32f4xx.h" void TIM5_IRQHandler() { GPIOB->ODR^=GPIO_ODR_ODR_8; TIM5->SR&= ~TIM_SR_UIF; //Сбрасываем флаг UIF } int main(void) { //***********TIM5*************** RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; // тактирование таймера TIM5->PSC = 16000; // предделитель TIM5->ARR = 1000; // переполнение TIM5->DIER |= TIM_DIER_UIE; // прерывание по переполнению TIM5->CR1 |= TIM_CR1_CEN; // запуск счета NVIC_EnableIRQ(TIM5_IRQn); NVIC_SetPriority(TIM5_IRQn,15); RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; GPIOB->MODER |= GPIO_MODER_MODER8_0; GPIOB->ODR |= GPIO_ODR_ODR_8; //***********MCO2************** RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; RCC->CFGR &=~RCC_CFGR_MCO2; // вывод System clock (SYSCLK) РЅР° PC9 RCC->CFGR |= (RCC_CFGR_MCO2PRE_1|RCC_CFGR_MCO2PRE_2);// 110: division by 4 GPIOC->MODER |= GPIO_MODER_MODER9_1; // output GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // 100Mhz I/O while(1) { } } зашил в МК! светодиод то зажегся, но не моргает((((( но если присмотреться, он все время как-то подмигивает! В итоге, если в debug-ере установить breakpoint в начале программы и нажать run то контроллер без проблем туда возращается, при учете что вконце программы есть while(1) -бесконечный цикл!Дело в том что если зашить этуже программу в stm32f4discovery то все работает корректно и при установке breakpoint он к нему никогда не доходит!!!!! Подскажите из-за чего может происходить прерывание, или что еще это может быть??????????? как определить, какое именно прерывание произошло? Кстати я еще не совсем уверен в правильности обвязки МК: по 0.1 и 1 мкФ на каждый VDD,по 2.2мкФ на GND от vcap1 и vcap2, NRST через 100к на VDD, BOOT0 и BOOT1 по 10к на VDD и 510 Ом на GND, ну и для SWD вывел VDD,PA14,GND,PA13,NRST,PB3.Правильно? Изменено 26 ноября, 2012 пользователем IgorKossak [codebox] для длинного кода!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 · Жалоба А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :) Зачем Вам BOOT1? И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 (изменено) · Жалоба А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :) Зачем Вам BOOT1? И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо? на данный момент я использую внутренний rc генератор(HSI). Boot1 казалось бы не нужен, но без подтяжки он вообще не стартует(так же и в discovery стоит )! как можно узнать какое срабатывает прерывание? Изменено 23 ноября, 2012 пользователем stm32f4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mbr 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 · Жалоба Вообще, сначала инициализировать обработчик и разрешать прерывание, которое работает с железом а уже ПОСЛЕ этого инициализировать само железо - совсем не правильно. Есть вероятность, что вызывается обработчик до инициализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :) Зачем Вам BOOT1? И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо? подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mbr 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ? А какие опции у железа есть по ресету? Вопрос не совсем понятен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ?Посмотреть, что процессор сохранил на стеке при входе в этот обработчик, вытащить из стекового кадра адрес возврата, посмотртеть по этому адресу на какой команде он споткнулся, проанализировать значения регистров и прийти к выводам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 (изменено) · Жалоба Тема все еще актуальна ((( но кстати выяснились некоторые моменты! к примеру если ткнуться осциллографом на ножку NRST то там проскакивает каждые 500мс сброс!!!!! Поискав немного в даташите(rm0090) нашел на странице 82 возможные причины сброса, в итоге это IWDG !!!!!!!!!!!Да, сброс его можно обойти - записью значений в переполняемый регистр, но почему он вообще включен? как его отключить ??? Изменено 30 ноября, 2012 пользователем stm32f4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться