Полная версия этой страницы:
NVIC stm32
Stepan_L
Aug 19 2012, 17:25
Привет Всем. Дело вот в чем. не могу получить прерывание от Timer2.Таймер запускается, даже считает. NVIC_EnableIRQ(TIM2_IRQn) виснет в BusFault Handler.. и так далее ,а вот попробовал NVIC_EnableIRQ(USART1_IRQn) все нормально проходит.
TIM2_IRQn = 28 , USART1_IRQn = 37;
IAR 5.41.1
adnega
Aug 20 2012, 04:29
Может виснет не NVIC_EnableIRQ(TIM2_IRQn), а код из обработчика прерывания?
sla000
Aug 20 2012, 04:39
Попробуйте скачать свежую либу на свой проц. Там есть примеры инициализации таймера.
В примере NVIC_EnableIRQ() вообще не вызывается, используется ф-я NVIC_Init().
У меня сделано примерно так:
Код
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
static const TIM_TimeBaseInitTypeDef init = { //
.TIM_Prescaler = 0, //
.TIM_CounterMode = TIM_CounterMode_Up, //
.TIM_Period = 0xFFFF, //
.TIM_ClockDivision = TIM_CKD_DIV1, };
TIM_TimeBaseInit(TIM2, (TIM_TimeBaseInitTypeDef*) &init);
static const NVIC_InitTypeDef nvic = {
.NVIC_IRQChannel = TIM2_IRQn,
.NVIC_IRQChannelPreemptionPriority = 0,
.NVIC_IRQChannelSubPriority = 1,
.NVIC_IRQChannelCmd = ENABLE,
};
NVIC_Init((NVIC_InitTypeDef*)&nvic);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
Stepan_L
Aug 20 2012, 08:11
В обработчик прерывания вообще не заходит,даже точку останова нельзя установить в обработчике.
_Артём_
Aug 20 2012, 08:23
Цитата(Stepan_L @ Aug 20 2012, 11:11)

даже точку останова нельзя установить в обработчике.
Что может говорить о том, например что функция прерывания выкинута и программа попадает в Default_Handler.
extern "C" не забыто?
Stepan_L
Aug 20 2012, 08:28
extern "C" не забыто? ?????
сейчас как раз копаюсь над этим.
_Артём_
Aug 20 2012, 08:40
Цитата(Stepan_L @ Aug 20 2012, 11:28)

сейчас как раз копаюсь над этим.
Можно breakpoint поставить в Default_Handler.
KnightIgor
Aug 21 2012, 18:31
Цитата(Stepan_L @ Aug 20 2012, 10:11)

В обработчик прерывания вообще не заходит,даже точку останова нельзя установить в обработчике.
Явно "глухая" функция, без вызовов извне, а это означает лишь одно: имя вашего обработчика прерывания написано с ошибкой!
Открываете ассемблерный startup файл (как он там в IAR точно зовется, не знаю), ищите имя обработчика для TIM2, АККУРАТНЕНЬКО copy-paste в заголовок вашего обработчика - готово.
Stepan_L
Aug 22 2012, 08:41
TIM2_IRQHandler все точно написано
Не могу найти место для extern "C"
KnightIgor
Aug 22 2012, 12:11
Цитата(Stepan_L @ Aug 22 2012, 10:41)

TIM2_IRQHandler все точно написано
Остается одно: не тот стартап файл. Процессор задан правильно?
Цитата
Не могу найти место для extern "C"
А зачем? Или С++ пишете?
Stepan_L
Aug 22 2012, 13:02
STM32VLDiscovery board processor STM32F100xB
_Артём_
Aug 22 2012, 13:31
Цитата(Stepan_L @ Aug 22 2012, 11:41)

Не могу найти место для extern "C"
В смысле?
Просто пишете так:
Код
extern "C" void TIM2_IRQHandler ()
{
// действия в обработчике
}
SSerge
Aug 22 2012, 13:34
Цитата(Stepan_L @ Aug 22 2012, 15:41)

TIM2_IRQHandler все точно написано
Не могу найти место для extern "C"
Если функций несколько в одном месте, то можно их все разом окучить:
Код
#ifdef __cplusplus
extern "C" {
#endif
void TIM2_IRQHandler(void)
{
// код обработчика прерывания
}
void ещё_один_IRQHandler(void)
{
..........
}
#ifdef __cplusplus
}
#endif
Stepan_L
Aug 22 2012, 17:48
После F11 на /* Enable the Selected IRQ Channels */ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); зависает. extern тоже не помогло.
_Артём_
Aug 22 2012, 18:02
Цитата(Stepan_L @ Aug 22 2012, 20:48)

После F11 на /* Enable the Selected IRQ Channels */ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); зависает. extern тоже не помогло.
Может у вас тип МК не соответствует выбранному в ИАРе и NVIC_EnableIRQ пишет в ячейку которой нет на самом деле?
Может проще проект выложить, чем гадать на кофейной гуще?
Stepan_L
Aug 24 2012, 07:16
main
#include "stm32f10x.h"
#include <misc.h>
//#define
int Delay_ms(unsigned int g)
{
for(volatile int f = g;f>1;f--){};
return 0;
}
void my_timerinit();
void Reinit_system();
void TIM2_IRQHandler();
int main()
{
//RCC_DeInit();
//RCC_HSEConfig(RCC_HSE_ON); //external 8 MHZ
//Reinit_system();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef PORTC_init;
PORTC_init.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
PORTC_init.GPIO_Speed = GPIO_Speed_50MHz;
PORTC_init.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&PORTC_init);
/* Remap GPIO */
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* Configure USART Tx as alternate function push-pull */
GPIO_InitTypeDef U_init;
U_init.GPIO_Mode = GPIO_Mode_AF_OD;//GPIO_Mode_AF_PP;
U_init.GPIO_Pin = GPIO_Pin_9;
U_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &U_init);
USART_InitTypeDef MY_USART;
MY_USART.USART_BaudRate = 1200;
MY_USART.USART_WordLength = USART_WordLength_8b;
MY_USART.USART_StopBits = USART_StopBits_1;
MY_USART.USART_Parity = USART_Parity_No;
MY_USART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
MY_USART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &MY_USART);
USART_Cmd(USART1, ENABLE);
/* */
//my_timerinit();
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //
TIM2->ARR = 60000; //
TIM2->PSC = 300; //
TIM2->CR1 |= TIM_CR1_CEN; //
TIM2->DIER |= TIM_DIER_UIE; //
TIM2->SR = ~TIM_IT_Update;
//TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//NVIC_Init((NVIC_InitTypeDef*)&nvic);
TIM_Cmd(TIM2, ENABLE);
//NVIC_InitTypeDef NVIC_InitStructure;
//NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
/**/
__enable_irq(); // sei
//NVIC_EnableIRQ(TIM2_IRQn);//); USART1_IRQn //
//NVIC->ISER[0] = 0x110010; //OK return
while(1)
{
for(volatile int r=0;r<6;r++) USART_SendData(USART1,r);
//GPIO_ResetBits(GPIOC,GPIO_Pin_8);
//GPIO_SetBits(GPIOC,GPIO_Pin_9);
// for(volatile int e = 5;e>1;e--){
// Delay_ms(100000);
//}
// GPIO_ResetBits(GPIOC,GPIO_Pin_9);
//GPIO_SetBits(GPIOC,GPIO_Pin_8);
Delay_ms(100000);
}
}
void TIM2_IRQHandler()
{
TIM2->SR &= ~TIM_SR_UIF; // ??????? ???? ??????????
GPIO_Write(GPIOC, GPIO_ReadOutputData(GPIOC) ^ GPIO_Pin_8);
}
void Reinit_system()
{
//#define HSE_VALUE// 8000000
// Enable HSE
RCC->CR |= RCC_CR_HSEON;
//ждать готовности HSE
while((RCC->CR & RCC_CR_HSERDY) == 0){};
//disable PLL
RCC->CR &= 0xfeffffff;
//disable PLL XTPRE
RCC->CFGR &= 0xfffdffff;
// PLLSRC
RCC->CFGR |= 0x00010000;
// PLL*2 = PLL -> 8 MHZ
RCC->CFGR |= RCC_CFGR_SW_PLL ;
//g=356;
RCC->CFGR |= RCC_CFGR_PLLMULL_2;
//PLL ON
RCC->CR |= RCC_CR_PLLON ;
//ждать готовности PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0){};
//return 0;//RCC_CR_HSERDY;
}
//#include "pp.c"
KnightIgor
Aug 24 2012, 08:31
Может это и паранойа, но напиши-ка
void TIM2_IRQHandler(void)
{
}
вместо нынешнего
void TIM2_IRQHandler()
{
}
Stepan_L
Aug 24 2012, 08:45
пробовал, 0
_Артём_
Aug 24 2012, 09:00
Цитата(Stepan_L @ Aug 24 2012, 10:16)

//NVIC->ISER[0] = 0x110010; //OK return
Вы разрешаете 3 прерывания, а сколько у вас обработчиков?
Из текста виден только TIM2_IRQHandler.
P.S. Вы бы проект выложили, а не поймёшь из вашего поста где код, где коментарий.
Stepan_L
Aug 24 2012, 09:52
Это комментарий.
Stepan_L
Aug 24 2012, 10:59
По stm32f10x_it.c видно что зависает в void HardFault_Handler(void).
_Артём_
Aug 24 2012, 11:41
Цитата(Stepan_L @ Aug 24 2012, 13:59)

По stm32f10x_it.c видно что зависает в void HardFault_Handler(void).
А stm32f10x_it.c разве подключен к проекту?
P.S. Маловероятно, но мало ли - ваша программа в непривелегированный режим не попадет на момент записи ISER?
Хотя с чего бы?
Stepan_L
Aug 24 2012, 13:41
А да, stm32f10x_it.c только что подключил,увидел.
Цитата
ваша программа в непривелегированный режим не попадет на момент записи ISER?
поясните пожалуйста .
Stepan_L
Aug 25 2012, 18:33
Вопрос снят. Все получилось.Я не подключил (не знал,что надо) startup_stm32f10x_md.s, а там почему то "LDR R0, =SystemInit" не хочет работать. Откомментировал и вперед.
Все ОК. С этим завтра разберусь.Всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.