Помогите с STM32

Тема в разделе "Arduino & Shields", создана пользователем Sergej456, 7 май 2017.

Метки:
  1. Sergej456

    Sergej456 Нуб

    Привет всем. Начал изучать чудесный мир 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)
    {

    }
    }
    ----------------------------------------------------
    Скажите, что не так и на что обратить внимание ?
     
  2. NikitOS

    NikitOS Король шутов Администратор

  3. На виденной мной плате светодиод подключен к плюсу питания, чтобы он горел нужен низкий уровень на выходе. Если подключать внешний к земле, надо сбросить биты CNF (23:22) того же регистра CRH (по умолчанию 01 - выход с открытым стоком), встроенный по идее должен работать и без этого. Для управления пином можно (и, насколько я понимаю, правильно) использовать запись в регистр BSRR.
     
    Последнее редактирование: 7 май 2017
    Sergej456 и arkadyf нравится это.
  4. Sergej456

    Sergej456 Нуб

    Всё, понял в чём ошибка. И правда нужно было CNF, а не MODE трогать. Спасибо большое.
     
  5. >нужно было CNF, а не MODE трогать

    Вот этого я не понимаю. Если верить документации, исходное значение CNF:MODE = 4 = 0b0100, т.е. floating input:input mode. Проверьте, что если только записать не ноль в MODE, то при низком уровне на выходе светодиод горит.

    И кстати, в чем это все пишется? Мне пока не удалось получить работающий код с помощью gcc из репозитория Mint'a (17-го). C gcc из STM32WS вроде бы все нормально.
     
  6. ostrov

    ostrov Гуру

    Я с этим добром из Keil обычно. А попробовал с cube, так теперь без него в лом. )
     
  7. Если нагрузка подключена к плюсу, поменять только 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]