Привет всем. Начал изучать чудесный мир ARM и наткнулся на проблему. Плата STM32F103C8T6. Никак не могу дойти, как же зажечь диод без использования дополнительных библиотек. Пытался накидать код, но с ним не работает. Интересно именно банальное включение пина таким способом. Вот мой вариант кода: ------------------------------------------------------------ #define RCC 0x40021000 #define APB2ENR 0x40021018 #define GPIOC 0x40011000 #define CRH 0x40011004 #define ODR 0x4001100C int main(void) { *(unsigned long*)(APB2ENR) |= (1 « 4); for(int i = 0; i < 100; i++); { } *(unsigned long*)(CRH) &= ~(1 « 20); *(unsigned long*)(CRH) |= (1 « 21); *(unsigned long*)(ODR) |= (1 « 13); while(1) { } } ---------------------------------------------------- Скажите, что не так и на что обратить внимание ?
На виденной мной плате светодиод подключен к плюсу питания, чтобы он горел нужен низкий уровень на выходе. Если подключать внешний к земле, надо сбросить биты CNF (23:22) того же регистра CRH (по умолчанию 01 - выход с открытым стоком), встроенный по идее должен работать и без этого. Для управления пином можно (и, насколько я понимаю, правильно) использовать запись в регистр BSRR.
>нужно было CNF, а не MODE трогать Вот этого я не понимаю. Если верить документации, исходное значение CNF:MODE = 4 = 0b0100, т.е. floating input:input mode. Проверьте, что если только записать не ноль в MODE, то при низком уровне на выходе светодиод горит. И кстати, в чем это все пишется? Мне пока не удалось получить работающий код с помощью gcc из репозитория Mint'a (17-го). C gcc из STM32WS вроде бы все нормально.
Если нагрузка подключена к плюсу, поменять только MODE достаточно: Код (Text): 800006c: f241 0004 movw r0, #4100 ; 0x1004 ; GPIOC_CRH 8000070: f2c4 0001 movt r0, #16385 ; 0x4001 8000074: 6802 ldr r2, [r0, #0] 8000076: f240 0100 movw r1, #0 ; GPIO_CRH_MODE13_1 800007a: f2c0 0120 movt r1, #32 800007e: 430a orrs r2, r1 8000080: 6002 str r2, [r0, #0]