Включение порта вывода в stm32f103c8t6 Blue Pill - PullRequest
2 голосов
/ 13 апреля 2020

Я пытаюсь включить PC13 в Blue Pill (stm32f103c8t6), который подключен к светодиоду, не уверен, что это активный низкий или активный высокий, поэтому я пробовал оба, но все равно не работает.

RCC->APB2ENR |= 0x10;
используется для включения часов в порту C.

enter image description here


GPIOC->CRH = (GPIOC->CRH & 0xFF0FFFFF) | 0x00100000;
is используется для настройки порта C на режим вывода и Pu sh -Pull.

enter image description here


GPIOC->ODR &= !(1<<13); чтобы установить вывод C13 в положение LOW.

Весь код:

#include "stm32f10x.h"

int main(){
    RCC->APB2ENR |= 0x10;
    GPIOC->CRH = (GPIOC->CRH & 0xFF0FFFFF) | 0x00100000;  
    while(1) {
        GPIOC->ODR = ~(1<<13);//if it is Active Low
        for (int i = 0; i < 1000000; ++i) __asm__("nop");
        GPIOC->ODR |= 1<<13; //if it is Active High
        for (int i = 0; i <  500000; ++i) __asm__("nop");
    }

}

Редактировать:
После некоторого исследования я обнаружил, что код работает отлично, если запустить сеанс отладки, это может быть программная проблема? или код для отладки устанавливает вещи, которые я не сделал? и как я уже сказал, я использую uVision для компиляции и fla sh.

1 Ответ

2 голосов
/ 13 апреля 2020

Если вы используете Keil, как вы сказали в ваших комментариях, то вы вполне уверены, что используете ST HAL. Как таковой, вы должны использовать его.

Используйте это для включения GPIO C часы

__GPIOC_CLK_ENABLE();

Похоже, вы не включили другие часы. Сейчас я не могу понять, какой это, но, вероятно, это один из самых высоких в цепи. (Вероятно, это происходит из-за того, что вы включили часы, используя APB2ENR вместо макроса)

Другое решение, чтобы выяснить это, было бы использовать STM32CubeMX , это проверенный мультиплатформенный инструмент ST для создания базовых инициализированных проектов для нескольких IDE.

Загрузите и запустите его, создайте проект для MCU, добавьте вывод, который вы хотите использовать в качестве выходного сигнала, и сгенерируйте проект Keil, который должен скомпилироваться и запустить. Если это работает, вы можете выполнить обратный инжиниринг шагов, которые STM32CubeMX предпринял для создания рабочего кода.


Основная проблема заключается в том, что вы не включили reset and run в конфигурации. Таким образом, после программирования плату необходимо сбросить перед запуском вновь прошитого кода. Запуск отладчика делает это.

configuration window with reset and run

Эта конфигурация находится в меню утилит-> настройки. (не обращая внимания на красный маркер, я сам не смог запечатлеть изображение и получил его из целого числа rnet)

enter image description here

...