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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Несколько вопросов по 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
Danis
сообщение Nov 22 2011, 16:41
Сообщение #2


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



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


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

А в общем то

Смотрите тут


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 22 2011, 19:46
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

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

Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2011, 09:24
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Дабы не плодить темы задам вопрос тут.
Разбираю инициализацию 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;


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 23 2011, 09:38
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В регистр контроллера, расположенный по адресу 0x40022000 (FLASH_ACR), записывается число 2, соответствующее двум циклам ожидания.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2011, 09:54
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Спс. Меня смутило то, что обращение идёт напрямую по адресу, хотя практически каждый бит задефайнен. По этому и не полез смотреть что за адрес. Не понять мне прогеров пишуших стандартные библиотеки.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 23 2011, 10:22
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Beginning @ Nov 23 2011, 15:54) *
Не понять мне прогеров пишуших стандартные библиотеки.

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2011, 11:37
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Да вы правы - это демо проекты из freeRTOS. Половина проекта состоит из библиотек и я поока не разобрался что куда относится.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
inventor
сообщение Nov 23 2011, 14:45
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #10


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

Группа: Свой
Сообщений: 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
Сообщение #11


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

Группа: Свой
Сообщений: 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
сообщение Nov 28 2011, 10:57
Сообщение #12


Знающий
****

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



Цитата(Sergey_Aleksandrovi4 @ Nov 27 2011, 18:55) *
TIM_ClearITPendingBit(TIM2, TIM_IT_Update) судя по названию сбрасывает флаг запроса прерывания таймера TIM2. В архитектуре CortexM3 в обработчиках прерывания нужно сбрасывать флаги запросов вручную (в отличие от, скажем, AVR где флаги аппаратно сбрасывались при входе в обработчик). Если не сбросить, прерывание будет генерировать постоянно.


спасиб... я в принципе так и думал, но почему то в обработчике SysTick такого нету?
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 28 2011, 11:50
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Потому что далеко не все запросы прерываний сбрасываются очисткой соответствующего флага, например, прерывание от UART TXE (буфер передатчика пуст) очищается записью в DR. Видимо, аналогично и с SysTick, хотя что-то не вижу в документации явного указания, на то что это прерывание с автосбросом (да и вообще не вижу какого-либо упоминания о сбросе флага данного прерывания)
Go to the top of the page
 
+Quote Post
Nix_86
сообщение Mar 18 2012, 10:44
Сообщение #14


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

Группа: Свой
Сообщений: 85
Регистрация: 7-04-11
Пользователь №: 64 200



Прорабатываю вопросы реализации СнК на базе ядер Cortex-M, интересует вот что - правильно ли понимаю, что у ядер M3 и M4 есть 3 независимых интерфейса к шине AHB и ни одного интерфейса для работы исключительно с памятью? К примеру, ядро M1 помимо интерфейса к шине AHB имеет интерфейсы TCM, которые обеспечивают бОльшую в сравнении с AHB производительность при работе с памятью. Есть ли какие-то сравнительные данные по производительности в этой связи?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 18 2012, 13:15
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если экстраполировать опыт с девятым ядром, то TCM обладает не столько большей производительностью (тут отличие незначительно), сколько детерминированностью доступа к памяти (не мешают другие мастера, в отличие от AHB).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:25
Рейтинг@Mail.ru


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