реклама на сайте
подробности

 
 
> Прерывания в STM32
Confucij
сообщение Dec 2 2012, 10:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 2-12-12
Пользователь №: 74 652



Разбираюсь с прерываниями в STM32 но как-то не выходит... Когда приходит прерывание(пробовал внешнее и прерывание от системного таймера) выполнение уходит непойми-куда.

CODE

Program received signal SIGTRAP, Trace/breakpoint trap.
0x20000004 in ?? ()
(gdb) bt
#0 0x20000004 in ?? ()
#1 <signal handler called>
#2 0x08000412 in main () at src/main.c:52
(gdb)


Код начальной инициализации:

CODE

#include "stm32f10x.h"
//TODO Почему-то не видело объявления в "stm32f10x.h" скопипастил сюда. Костыль. Поправить. Ага, поправить. Так оно тут и будет.
#define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */
extern int main(void);

/* provided by the linker script */
extern unsigned long _estack;
extern unsigned long __text_end;
extern unsigned long __data_start;
extern unsigned long __data_end;
extern unsigned long __bss_start;
extern unsigned long __bss_end;


/**
* Cortex M3 core interrupt handlers
*
* We provide basic implementations of the core of them, but "weak" so that
* simply declaring them again will count as implementing them
*/
void Reset_Handler(void);
void NMI_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void HardFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void MemManage_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void BusFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void UsageFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void SVC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void DebugMon_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void PendSV_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
void SysTick_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));

/*Ethernet interrupt*/
extern void EXTI4_IRQHandler();
/**
* The chip specific (STM32L1xx or F1, or LPC, or TI etc) vectors are in a
* chip specific file. by placing them in a subsection, they can be linked in
* immediately after the core cortex handler table.
*/

void Dummy_Handler(void) {
volatile int i;
while(1) {
i++;
}
}


/**
* All the parts start on some sort of an internal clock.
* STM32F101, 103, 105, 107 start on HSI (~8MHz)
* STM32F100xx (Value Line) start on HSI (~8MHz)
* STM32F2xx starts on HSI (~16MHz)
* STM32F4xx starts on HSI (~16MHz)
* STM32L1xx starts on MSI (~2MHz)
* Additionally, the STM32L1xx starts in voltage range 2 (1.5V), and needs
* to be switched to voltage range 1 before enabling its HSI (~16MHz)
*
* Regardless, the default startup clock is enough to run. However, you may
* wish to override this function, (simply implement your own) and configure
* clocks, power regulators, or any other "premain" code you wish to run.
*/
void SystemInit(void) __attribute__ ((weak));
void SystemInit(void) {
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/* Конфигурацяи SYSCLK, HCLK, PCLK2 и PCLK1 */
/* Включаем HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);

/* Ждем пока HSE не выставит бит готовности либо не выйдет таймаут*/
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
}
while( (HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

//if ( (RCC->CR & RCC_CR_HSERDY) != RESET)
// {
// HSEStatus = (uint32_t)0x01;
// }
//else
// {
// HSEStatus = (uint32_t)0x00;
// }

/* Если HSE запустился нормально */
if ( (RCC->CR & RCC_CR_HSERDY) != RESET)
{

/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

/* Конфигурируем множитель PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
/* При условии, что кварц на 8МГц! */
/* RCC_CFGR_PLLMULL9 - множитель на 9. Если нужна другая частота, не 72МГц */
/* то выбираем другой множитель. */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);

/* Включаем PLL */
RCC->CR |= RCC_CR_PLLON;

/* Ожидаем, пока PLL выставит бит готовности */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
// Ждем
}

/* Выбираем PLL как источник системной частоты */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

/* Ожидаем, пока PLL выберется как источник системной частоты */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
// Ждем
}

}
else
{
/* Все плохо... HSE не завелся... Чего-то с кварцем или еще что...
Надо бы както обработать эту ошибку... Если мы здесь, то мы работаем
от HSI! */
}
}

void __attribute__((noreturn, naked)) Reset_Handler() {
unsigned long *src;
unsigned long *dest;

src = &__text_end;
dest = &__data_start;
if (src != dest)
while(dest < &__data_end)
*(dest++) = *(src++);

dest = &__bss_start;
while(dest < &__bss_end)
*(dest++) = 0;
SystemInit();
main();
}

/**
* This table contains the core Coretex vectors, and should be linked first.
* You should link any chip specific tables after this.
*/
void *vector_table[] __attribute__ ((section(".vectors"))) = {
&_estack,
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSV_Handler,
SysTick_Handler,
};


void *other_vector_table[] __attribute__ ((section(".vectors.other"))) = {
Dummy_Handler, // Window watchdog interrupt
Dummy_Handler, //PVD
Dummy_Handler, //TAMPER_STAMP
Dummy_Handler, //RTC_WKUP
Dummy_Handler, //FLASH
Dummy_Handler, //RCC
Dummy_Handler, //EXTI0
Dummy_Handler, //EXTI1
Dummy_Handler, //EXTI2
Dummy_Handler, //EXTI3
EXTI4_IRQHandler, //EXTI4
Dummy_Handler, //DMA1_Channel1
Dummy_Handler, //DMA1_Channel2
Dummy_Handler, //DMA1_Channel3
Dummy_Handler, //DMA1_Channel4
Dummy_Handler, //DMA1_Channel5
Dummy_Handler, //DMA1_Channel6
Dummy_Handler, //DMA1_Channel7
Dummy_Handler, //ADC1
Dummy_Handler,// R
Dummy_Handler,// E
Dummy_Handler,// S
Dummy_Handler,// Erved
Dummy_Handler, //EXTI9_5
Dummy_Handler, //TIM1_BRK_TIM15
Dummy_Handler, //TIM1_UP_TIM16
Dummy_Handler, //TIM_TRG_COM_TIM17
Dummy_Handler, //TIM1_CC
Dummy_Handler, //TIM2
Dummy_Handler, //TIM3
Dummy_Handler, //TIM4
Dummy_Handler, //I2C1_EV
Dummy_Handler, //I2C1_ER
Dummy_Handler, //I2C2_EV
Dummy_Handler, //I2C2_ER
Dummy_Handler, //SPI1
Dummy_Handler, //SPI2
Dummy_Handler, //UART1_Interupt
Dummy_Handler, //USART2
Dummy_Handler, //USART3
Dummy_Handler, //EXTI15_10
Dummy_Handler, //RTC_Alarm
Dummy_Handler, //CEC
Dummy_Handler, //TIM12
Dummy_Handler, //TIM13
Dummy_Handler, //TIM14
Dummy_Handler, //RESERV
Dummy_Handler, //RESERV
Dummy_Handler, //FSMC
Dummy_Handler, //RESERVED
Dummy_Handler, //TIM5
Dummy_Handler, //SPI3
Dummy_Handler, //UART4
Dummy_Handler, //UART5
Dummy_Handler, //TIM6_DAC_IRQHandler, //TIM6
Dummy_Handler, //TIM7
Dummy_Handler, //DMA2_CH1
Dummy_Handler, //DMA2_CH2
Dummy_Handler, //DMA2_CH3
Dummy_Handler, //DMA2_CH4_5
Dummy_Handler //DMA2_5
};


Подскажите пожалуйста где я ошибся.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Confucij
сообщение Dec 2 2012, 11:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 2-12-12
Пользователь №: 74 652



Дописал при инициалиизации
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
И прерывания починились. Странно, я думал что контроллер прерываний знает где лежит таблица прерываний, тем более что лежит она с первых адресов флеша, что вроди стандартно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 2 2012, 12:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Confucij @ Dec 2 2012, 13:26) *
Дописал при инициалиизации
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
И прерывания починились. Странно, я думал что контроллер прерываний знает где лежит таблица прерываний, тем более что лежит она с первых адресов флеша, что вроди стандартно.

Если бы nvic не знал где таблица находится, то как бы Reset_Handler вызвался?

P.S. странная у вас таблица какая-то - почти вся из Dummy_Handler.
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 2 2012, 15:26
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Вы явно взяли пример не сайта ST, потому что таблица векторов в виде Сишного массива была во времена 1 версии стандартной периферийной библиотеки. Тогда пропагандировалось избавление от ассемблера в коде для CM3 :-) потом, видимо, одумались.
Рекомендую пользоваться софтом от ST, получите возможность использовать тулзы типа конфигуратора системных частот.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016