Перейти к содержанию
    

Перезагрузка STM32F4 (

Всем привет. Начну сначала) На днях попал мне в руки 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.Правильно?

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :)

Зачем Вам BOOT1?

И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :)

Зачем Вам BOOT1?

И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо?

на данный момент я использую внутренний rc генератор(HSI). Boot1 казалось бы не нужен, но без подтяжки он вообще не стартует(так же и в discovery стоит )!

как можно узнать какое срабатывает прерывание?

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще, сначала инициализировать обработчик и разрешать прерывание, которое работает с железом а уже ПОСЛЕ этого инициализировать само железо - совсем не правильно. Есть вероятность, что вызывается обработчик до инициализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кварц рабочий? Вы его используете? Надо ж 10 отличий найти... :)

Зачем Вам BOOT1?

И для чего NRST & PB3 в SWD? Может у Вас по NRST и гуляет то, что не надо?

подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ?

А какие опции у железа есть по ресету? Вопрос не совсем понятен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите, а как можно узнать из-за чего программа переходит в "Default_Reset_Handler()" ?
Посмотреть, что процессор сохранил на стеке при входе в этот обработчик, вытащить из стекового кадра адрес возврата, посмотртеть по этому адресу на какой команде он споткнулся, проанализировать значения регистров и прийти к выводам.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема все еще актуальна ((( но кстати выяснились некоторые моменты! к примеру если ткнуться осциллографом на ножку NRST то там проскакивает каждые 500мс сброс!!!!! Поискав немного в даташите(rm0090) нашел на странице 82 возможные причины сброса, в итоге это IWDG !!!!!!!!!!!Да, сброс его можно обойти - записью значений в переполняемый регистр, но почему он вообще включен? как его отключить ???

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...