|
NVIC stm32, TIM2 <-> USART1 |
|
|
|
Aug 19 2012, 17:25
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
Привет Всем. Дело вот в чем. не могу получить прерывание от Timer2.Таймер запускается, даже считает. NVIC_EnableIRQ(TIM2_IRQn) виснет в BusFault Handler.. и так далее ,а вот попробовал NVIC_EnableIRQ(USART1_IRQn) все нормально проходит. TIM2_IRQn = 28 , USART1_IRQn = 37; IAR 5.41.1
--------------------
ARM_enia
|
|
|
|
|
Aug 20 2012, 04:39
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670

|
Попробуйте скачать свежую либу на свой проц. Там есть примеры инициализации таймера. В примере 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);
|
|
|
|
|
Aug 20 2012, 08:11
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
В обработчик прерывания вообще не заходит,даже точку останова нельзя установить в обработчике.
--------------------
ARM_enia
|
|
|
|
|
Aug 20 2012, 08:28
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
extern "C" не забыто? ????? сейчас как раз копаюсь над этим.
--------------------
ARM_enia
|
|
|
|
|
Aug 21 2012, 18:31
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

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

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
TIM2_IRQHandler все точно написано
Не могу найти место для extern "C"
--------------------
ARM_enia
|
|
|
|
|
Aug 22 2012, 12:11
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

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

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
STM32VLDiscovery board processor STM32F100xB
--------------------
ARM_enia
|
|
|
|
|
Aug 22 2012, 13:31
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Stepan_L @ Aug 22 2012, 11:41)  Не могу найти место для extern "C" В смысле? Просто пишете так: Код extern "C" void TIM2_IRQHandler () { // действия в обработчике }
|
|
|
|
|
Aug 22 2012, 13:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(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
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 22 2012, 17:48
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
После F11 на /* Enable the Selected IRQ Channels */ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); зависает. extern тоже не помогло.
--------------------
ARM_enia
|
|
|
|
|
Aug 23 2012, 05:44
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Может проще проект выложить, чем гадать на кофейной гуще?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Aug 24 2012, 07:16
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
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"
--------------------
ARM_enia
|
|
|
|
|
Aug 24 2012, 08:45
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
пробовал, 0
--------------------
ARM_enia
|
|
|
|
|
Aug 24 2012, 09:52
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
Это комментарий.
Прикрепленные файлы
USART.rar ( 454.36 килобайт )
Кол-во скачиваний: 22
--------------------
ARM_enia
|
|
|
|
|
Aug 24 2012, 10:59
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
По stm32f10x_it.c видно что зависает в void HardFault_Handler(void).
--------------------
ARM_enia
|
|
|
|
|
Aug 24 2012, 13:41
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
А да, stm32f10x_it.c только что подключил,увидел. Цитата ваша программа в непривелегированный режим не попадет на момент записи ISER? поясните пожалуйста .
--------------------
ARM_enia
|
|
|
|
|
Aug 25 2012, 18:33
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 26-08-08
Из: Ереван
Пользователь №: 39 828

|
Вопрос снят. Все получилось.Я не подключил (не знал,что надо) startup_stm32f10x_md.s, а там почему то "LDR R0, =SystemInit" не хочет работать. Откомментировал и вперед. Все ОК. С этим завтра разберусь.Всем спасибо.
--------------------
ARM_enia
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|