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

Спасибо.
PS Делаю примеры в IAR
Danis
Цитата(inventor @ Nov 22 2011, 20:12) *
.....
откуда можно взять нормальную документацию, ну как у атмела-там по крайней мере нормальный дадашыт: показана периферия и сразу примеры на асме и C. А для ST я что-то не могу найти подобного.


"периферия и сразу примеры на асме и C." - такого на официальном сайте не найдете.

А в общем то

Смотрите тут
KRS
Цитата(inventor @ Nov 22 2011, 20:12) *
примеры на асме

для начала Cortex вообще ASM не нужен! Там даже указатель стека из таблицы прерываний берется, и т.п.
ASM может понадобится для переключения контекста и очень специфичных DSP расчетов...
В части инициализации периферии С компилятор вообще сгенерит код оптимальнее потому что знает числовые значение адресов и констант...

Beginning
Дабы не плодить темы задам вопрос тут.
Разбираю инициализацию STM32F10x
Есть строка:
CODE
/* 2 wait states required on the flash. */
*( ( unsigned portLONG * ) 0x40022000 ) = 0x02;


Я не понимаю зачем она?
Последовательность такая:
CODE
RCC_HSEConfig( RCC_HSE_ON ); //Enable HSE (high speed external clock).
while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET ){} //Wait till HSE is ready.

/* 2 wait states required on the flash. */
*( ( unsigned portLONG * ) 0x40022000 ) = 0x02;
AHTOXA
В регистр контроллера, расположенный по адресу 0x40022000 (FLASH_ACR), записывается число 2, соответствующее двум циклам ожидания.
Beginning
Спс. Меня смутило то, что обращение идёт напрямую по адресу, хотя практически каждый бит задефайнен. По этому и не полез смотреть что за адрес. Не понять мне прогеров пишуших стандартные библиотеки.
AHTOXA
Цитата(Beginning @ Nov 23 2011, 15:54) *
Не понять мне прогеров пишуших стандартные библиотеки.

Вообще-то, судя по "unsigned portLONG", это что-то из FreeRTOS. Поэтому же и непосредственная константа в коде - видимо автор хотел обойтись без использования заголовочных файлов от производителя, но потом бросил эту идею.
Beginning
Да вы правы - это демо проекты из freeRTOS. Половина проекта состоит из библиотек и я поока не разобрался что куда относится.
inventor
Сегодня посмотрел примеры для других плат, что-то переделал и запустил прерывание на своей, заморгало:

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

Не нужно, достаточно просто написать свою функцию с тем же именем и, если это С++, то ещё и extern "C" добавить.
Объявления в ассемблерном файле сделаны так, что ругани по поводу переопределения не будет.
Sergey_Aleksandrovi4
TIM_ClearITPendingBit(TIM2, TIM_IT_Update) судя по названию сбрасывает флаг запроса прерывания таймера TIM2. В архитектуре CortexM3 в обработчиках прерывания нужно сбрасывать флаги запросов вручную (в отличие от, скажем, AVR где флаги аппаратно сбрасывались при входе в обработчик). Если не сбросить, прерывание будет генерировать постоянно.
inventor
Цитата(Sergey_Aleksandrovi4 @ Nov 27 2011, 18:55) *
TIM_ClearITPendingBit(TIM2, TIM_IT_Update) судя по названию сбрасывает флаг запроса прерывания таймера TIM2. В архитектуре CortexM3 в обработчиках прерывания нужно сбрасывать флаги запросов вручную (в отличие от, скажем, AVR где флаги аппаратно сбрасывались при входе в обработчик). Если не сбросить, прерывание будет генерировать постоянно.


спасиб... я в принципе так и думал, но почему то в обработчике SysTick такого нету?
Flexz
Потому что далеко не все запросы прерываний сбрасываются очисткой соответствующего флага, например, прерывание от UART TXE (буфер передатчика пуст) очищается записью в DR. Видимо, аналогично и с SysTick, хотя что-то не вижу в документации явного указания, на то что это прерывание с автосбросом (да и вообще не вижу какого-либо упоминания о сбросе флага данного прерывания)
Nix_86
Прорабатываю вопросы реализации СнК на базе ядер Cortex-M, интересует вот что - правильно ли понимаю, что у ядер M3 и M4 есть 3 независимых интерфейса к шине AHB и ни одного интерфейса для работы исключительно с памятью? К примеру, ядро M1 помимо интерфейса к шине AHB имеет интерфейсы TCM, которые обеспечивают бОльшую в сравнении с AHB производительность при работе с памятью. Есть ли какие-то сравнительные данные по производительности в этой связи?
aaarrr
Если экстраполировать опыт с девятым ядром, то TCM обладает не столько большей производительностью (тут отличие незначительно), сколько детерминированностью доступа к памяти (не мешают другие мастера, в отличие от AHB).
Nix_86
Цитата(aaarrr @ Mar 18 2012, 16:15) *
Если экстраполировать опыт с девятым ядром, то TCM обладает не столько большей производительностью (тут отличие незначительно), сколько детерминированностью доступа к памяти (не мешают другие мастера, в отличие от AHB).

Собственно "помехи" других мастеров я думаю и должны оказать влияние на производительность (в частности если происходят обращения к одному и тому же физически банку памяти). Шина инстукций и шина данных работают с одним адресным пространством и теоретически, если константы и программы будут располагаться в физически разных банках, то проблема вроде бы исчезает. Интересно как это чаще бывает на практике.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.