Цитата(Новичек @ May 5 2013, 16:28)

Спасибо за ваши ответы!
по 1 вопросу. получается что GPIO имеет 4 выхода и при установлении соответствующей единицы туда подается напряжение?
по 2 вопросу. Почему в данном случае сначала используют указатель GPIO6->DR[led<<2] = ~led а потом не указатель GPIO6->DR[led<<2] = led?
Итак код
Код
#define LED_On(led) GPIO6->DR[led<<2] = ~led
#define LED_Off(led) GPIO6->DR[led<<2] = led
он правильный, во первых. Сомневаться в нем не надо.
Смотрите схему платы. Светодиоды зажигаются установкой
нуля на линии порта!
Не на порту всего есть 4 выхода, а только 4-е выхода используются на порту для светодиодов.
Возьмем
LED_On(LED_A)
перепишем: GPIO6->DR[0x02<<2] = ~0x02
и далее упростив: GPIO6->DR[0x08] = 0xFD
Т.е. по адресу (0x58000000 + 0x0000C008) записывается значение 0xFD
где 0x0000C000 это смещение порта P6 , а 0x58000000 -база для смещения
Сместили на 2-а бита влево значение индекса потому, что младшие два бита на шине адреса не входят в маску.
Главное, что маска(она же индекс в массиве DR) содержит только один бит, и этот бит указывает позицию в регистре порта где может быть изменено(вернее разрешено изменить) значение бита. И этот бит этой операцией изменяется на 0.
В принципе вместо ~0x02 программеры могли просто написать 0.
Но видать что-то в душе им не дало так написать, чего-то побоялись. Я их понимаю. Глючнее чем STR912 не видал чипа.
Еще служебных команд смотрите все таки в хелпе на компилятор Keil. Мне затруднительно сейчас все вспоминать.
Как назначаются прерывания и как пишутся обработчики прерываний можете посмотреть в соседнем проекте Measure-RT. Там прямо в функции main ясно видно как программируется прерывание одного из таймеров.