[uquote="axillent",url="/forum/viewtopic.php?p=3191511#p3191511"]а это какие биты в каком конкретно регистре? по RM0016 я не понял как векторы связаны с этими регистрами, там почему то нотация другая, иными словами не вижу там EXTIx[/uquote]
Для примера... настраиваю TIM2 с пониженным приоритетом следующим образом:
Код: Выделить всё
//настройка таймера TIM2 для организации регулярных прерываний 400Гц
TIM2_PSCR = 7; //предделитель таймера 0-7 (7 = 128)
TIM2_ARRH = (uint8_t)(154>>8); //считаем до 150, (для генерации частоты 400Гц при 8МГц)
TIM2_ARRL = (uint8_t)(154);
TIM2_IER_bit.UIE = 1; //прерывание по обновлению включено
TIM2_CR1_bit.CEN = 1; //разрешение работы таймера
ITC_SPR4 &= ~(0x0C); //понизить c 3 до 2 программный приоритет у TIM2 update/overflow
В RM0016 на стр.68 есть табличка с 8-мю регистрами ITC_SPR1 - ITC_SPR8, в которых каждые парные 2 бита отвечают за приоритет соответствующего прерывания.
Но в этой таблице (на стр.68), первые два железных прерывания пропущены (RESET и TRAmP или как там его...)))), поэтому VECT0SPR[1:0] это биты не 0-го прерывания а 2-го... соответственно VECT1SPR[1:0] это биты 3-го и т.д.
Так что от фактического номера железного прерывания нужно отнимать 2 чтобы получить номер в таблице на стр.68
Номера железных прерываний можно подсмотреть в IAR-е в конце файла iostm8s103f3.
Например, нужный мне вектор TIM2_OVR_UIF_vector находится под номером 0x0F, отнимаем от 15-ти двоечку и получаем номер 13 в таблице на стр.68 т.е. VECT13SPR[1:0] а это конкретно регистр ITC_SPR4 и биты [3:2], отсюда и команда ITC_SPR4 &= ~(0x0C);
на стр.67 есть табличка уровней (состояния 2-х битов), от низкого к высокому, по ней и выставляй соответствующую пару...
Возможно это решается как то по другому и покрасивее, но мне когда это было нужно, я ничего другого не сообразил, как только таким способом ... так что другого пока не могу предложить)