Всем большое спасибо, с вашей помощью разобрался!
Пришлось еще крепко почитать, но наводки здорово помогли, т.к. информацию пришлось собирать из разных источников на основе наводок (datasheet, programmers guide от IAR, книжка Ю Дж., тупое рассматривание содержимого файлов в папках IAR и т.п.

)
Оказалось: после ресета по умолчанию Cortex-M3 (и вроде бы M0 и M4 аналогично) ожидает предоставления информации в жестком формате: начиная с позиции со смещением 0 в памяти находится 32 битное слово - адрес стека, следующее слово - точка входа в программу, сразу за ним таблица векторов прерываний, которая включает для M3 сначала вектора предопределенных немаскируемых исключений (9 штук+ зарезервированные пропуски) потом несколько прерываний периферии, которых может быть до 240 в зависимости от конкретной микросхемы (в моей, действительно, 44 шт), включая нужное сейчас мне:
Итого, я взял за основу cstartup_M.c, как советовали в мануале, потребовалось дописать объявления этих 44 функций (с любыми названиями) по образу и подобию исключений:
Код
#pragma language=extended
#pragma segment="CSTACK"
extern void NMI_Handler( void );
...
extern void TC0_IrqHandler( void ); /* 27 Timer Counter 0 */
...
#pragma call_graph_root = "interrupt"
__weak void TC0_IrqHandler( void ) { while (1) {} } /* 27 Timer Counter 0 */
...
а от смущавшей меня "__iar_program_start()" я оставил в результате:
Код
void main( void );
#pragma required=__vector_table
void __iar_program_start( void ){main();} //Просто вызываем main()
Оказалось (откровением для меня) что точкой входа в программы для Cortex-M3 у IAR является в общем случае не "main()" а как раз функция "__iar_program_start()", которая содержит по умолчанию каркас для "правильного стиля программирования". Каркас успешно вымарался, чтобы не смущать нежную душу неофита и на мой вкус теперь все логично.
В основной программе написал функцию "TC0_IrqHandler()", трясущую выводами PIO, которая перекрыла "слабое" (__weak) описание и активировал прерывание:
Код
TC0->TC_CHANNEL->TC_IER|=0x00000010; // Разрешено прерывание RC compare
NVIC_EnableIRQ(TC0_IRQn); // Разрешено прерывание TC0 в NVIC
__enable_interrupt(); // Глобально разрешить маскируемые прерывания
Как обсуждалось на форуме, в обработчике потребовалось явно сбросить флаг события, вызвавшего прерывание в регистре статуса таймера и флаг отложенного прерывания "NVIC_ClearPendingIRQ(TC0_IRQn);"
Заработало!
Всем еще раз спасибо, удачи!
Сообщение отредактировал karavaevas - Dec 25 2014, 03:11