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

 
 
> Несколько вопросов по ARM Cortex M3
inventor
сообщение Nov 22 2011, 16:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Занимаюсь с армом всего три дня:
Купил отладочную платку STM32VL Discovery, попробовал все примеры, но вот возникли такие вопросы (прошу не пинаться)
Меня интересуют вот такие вопросы: хочу запустить таймер, чтобы в обработчике прерываний мигал светодиод и установить обработчик USART на прием и передачу.
Посмотрел инклюды и обратил внимание что на каждый USART по одному IRQ-не понятно как сделать IRQ на прием и на передачу.
То есть если кого то не затруднит, может у кого есть примеры для Cortex M3 от ST, как установить свой обработчик прерывания и воткнуть его ну и настроить VIC и прочее.
И еще, откуда можно взять нормальную документацию, ну как у атмела-там по крайней мере нормальный дадашыт: показана периферия и сразу примеры на асме и C. А для ST я что-то не могу найти подобного.

Спасибо.
PS Делаю примеры в IAR
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
inventor
сообщение Nov 23 2011, 14:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Сегодня посмотрел примеры для других плат, что-то переделал и запустил прерывание на своей, заморгало:

void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable TIM2 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


/* TIM1 config */
TIM_TimeBaseStructure.TIM_Period = 0x4AF;
TIM_TimeBaseStructure.TIM_Prescaler = ((SystemCoreClock/1200) - 1);
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

#if 0
/* Output Compare Timing Mode configuration: Channel1 */
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_Pulse = 0x0;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
#endif

/* Immediate load of TIM2 Precaler values */
TIM_PrescalerConfig(TIM2, ((SystemCoreClock/1200) - 1), TIM_PSCReloadMode_Immediate);

/* Clear TIM2 update pending flags */
TIM_ClearFlag(TIM2, TIM_FLAG_Update);


/* Enable the TIM2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable TIM2 Update interrupts */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

/* TIM2 enable counters */
TIM_Cmd(TIM2, ENABLE);
}



void TIM2_IRQHandler(void)
{
/* Clear TIM3 update interrupt */
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

/* Toggle LED2 */
STM32vldiscovery_LEDToggle(LED3);
}

поясните мне пожалуйста, зачем в обработчике нужно вот это:
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

И еще, там где закоментировано if 0 endif в этом случае выход таймера подсоединяется на внешнюю ногу, я прав?

и еще последний вопрос, все эти обработчики уже объявлены в ассемблерном файле boot и чтобы вызвать что то из обработчика нужно или внутрь него писать или вызвать из него внешнюю функцию.
не накладно ли? (push pop...)-так сделано в примерах.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 23 2011, 15:42
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(inventor @ Nov 23 2011, 21:45) *
и еще последний вопрос, все эти обработчики уже объявлены в ассемблерном файле boot и чтобы вызвать что то из обработчика нужно или внутрь него писать или вызвать из него внешнюю функцию.
не накладно ли? (push pop...)-так сделано в примерах.

Не нужно, достаточно просто написать свою функцию с тем же именем и, если это С++, то ещё и extern "C" добавить.
Объявления в ассемблерном файле сделаны так, что ругани по поводу переопределения не будет.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Nov 27 2011, 15:55
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



TIM_ClearITPendingBit(TIM2, TIM_IT_Update) судя по названию сбрасывает флаг запроса прерывания таймера TIM2. В архитектуре CortexM3 в обработчиках прерывания нужно сбрасывать флаги запросов вручную (в отличие от, скажем, AVR где флаги аппаратно сбрасывались при входе в обработчик). Если не сбросить, прерывание будет генерировать постоянно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- inventor   Несколько вопросов по ARM Cortex M3   Nov 22 2011, 16:12
- - Danis   Цитата(inventor @ Nov 22 2011, 20:12) ......   Nov 22 2011, 16:41
- - KRS   Цитата(inventor @ Nov 22 2011, 20:12) при...   Nov 22 2011, 19:46
- - Beginning   Дабы не плодить темы задам вопрос тут. Разбираю ин...   Nov 23 2011, 09:24
|- - AHTOXA   В регистр контроллера, расположенный по адресу 0x4...   Nov 23 2011, 09:38
- - Beginning   Спс. Меня смутило то, что обращение идёт напрямую ...   Nov 23 2011, 09:54
|- - AHTOXA   Цитата(Beginning @ Nov 23 2011, 15:54) Не...   Nov 23 2011, 10:22
- - Beginning   Да вы правы - это демо проекты из freeRTOS. Полови...   Nov 23 2011, 11:37
|- - inventor   Цитата(Sergey_Aleksandrovi4 @ Nov 27 2011, 18...   Nov 28 2011, 10:57
- - Flexz   Потому что далеко не все запросы прерываний сбрасы...   Nov 28 2011, 11:50
- - Nix_86   Прорабатываю вопросы реализации СнК на базе ядер C...   Mar 18 2012, 10:44
- - aaarrr   Если экстраполировать опыт с девятым ядром, то TCM...   Mar 18 2012, 13:15
- - Nix_86   Цитата(aaarrr @ Mar 18 2012, 16:15) Если ...   Mar 18 2012, 18:20


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

 


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


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