Перейти к содержанию
    

Проблемы с инициализацией STM32F103VE

Всем привет. Приобрел недавно отладочную плату на STM32F103VE, решил начать с самого простого, инициализации мк и включения единственного светодиода.

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

В общем по мануалу и insider's guide настроил все клоки, поставил 5-ый пин порта Б на выход. Нашел косяк, и не один, в процессе отладки, оказалось, что в reset регистры надо записывать 0 после старта, в мануале об этом ни слова, хорошо что в insider's guide было пояснение.

Но СД все равно не горит. Не могу понять в чем дело..

 

Код выглядит так:

 

/*----------------------------------------------------------------------------
*  Name:    Blinky.c
*  Purpose: LED Flasher for STM32
*---------------------------------------------------------------------------*/
#include <stm32f10x.h>
/*----------------------------------------------------------------------------
   Function prototypes
*---------------------------------------------------------------------------*/
void clockstart(void);
/*----------------------------------------------------------------------------
   Wait function - delay flashing
*---------------------------------------------------------------------------*/
void wait (void) {
  unsigned int countDown = 300000;                  // arbitrary int to count down

  while(countDown--);                                       // count down
}

/*----------------------------------------------------------------------------
   MAIN function
*---------------------------------------------------------------------------*/

int main (void) {
    clockstart();                                                // init start sequence
    GPIOB -> CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1);
                                                                    // set pin5 of PORTB to output mode, max speed 50 MHz
    GPIOB -> CRL &= 0xFF3FFFFF;                        // general purpose output push-pull

  while (1) {                                                   // loop forever
    GPIOB -> BSRR |= GPIO_BSRR_BS5;            // set pin5 to 1
    wait();                                                         // delay flashing
    GPIOB -> BSRR |= GPIO_BSRR_BR5;            // set pin5 off
    wait();
  }
}

 

#include <stm32f10x.h>

void clockstart(void) {
//    while (!(RCC -> CR & RCC_CR_HSIRDY))                      // Wait until internal HSI will be ready
//    {
//;
//    }

    RCC -> CR |= RCC_CR_HSEON;                                // Switch to HSE oscillator
    while (!(RCC -> CR & RCC_CR_HSERDY))                      // Wait until external HSE will be ready
    {
;
    }

    RCC -> CFGR |= RCC_CFGR_PLLSRC;                        // Set PLL source clock as HSE
    RCC -> CFGR |= (RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2);
                                                                                // Set PLL multiplier x9 (72 MHz)
    RCC -> CFGR |= RCC_CFGR_SW_1;                            // PLL selected as system clock
    RCC -> CR |= RCC_CR_PLLON;                                    // Start PLL
    while (!(RCC -> CR & RCC_CR_PLLRDY))                      // Wait until PLL is locked
    {
;
    }

    RCC -> CFGR |= RCC_CFGR_PPRE1_DIV2;                    // HCLK divided by 2 (36MHz)
    RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN;                // IO port B clock enable
    RCC -> APB2RSTR = 0x00000000;
    RCC -> APB1RSTR = 0x00000000;                            // release peripherals from reset    
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сама прога выполняется? А какие значения присваиваешь регистру BSRR? Т.к. тут еще отдельно есть регистр сброса выводов BRR, то я привык через него сбрасывать. Напиши так, может поможет:

GPIOB -> BSRR = 0x20; //pa5 set to high

WaitToGoldLife();

GPIOB -> BRR = 0x20; //pa5 reset

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сама прога выполняется? А какие значения присваиваешь регистру BSRR? Т.к. тут еще отдельно есть регистр сброса выводов BRR, то я привык через него сбрасывать. Напиши так, может поможет:

GPIOB -> BSRR = 0x20; //pa5 set to high

WaitToGoldLife();

GPIOB -> BRR = 0x20; //pa5 reset

По дебагу в софте я еще не успел разобраться, кейл только недавно поставил. Попробую прогнать в дебаггере.

Железо по-крайней мере работает с тестовой прошивкой (что была с платой), СД горит и шьется она нормально. Было подозрение на стартап-код, я дефолтный использую. Во все тонкости пока не вник.

А в BSRR пишу то же 0x20, просто имя взято из хедера стандартного STM.

Попробовал - нет разницы.

Знать бы в каком направлении искать, а то думаю, ошибка в настройке тактовых, порты или вообще стартап.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какое значение у GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 ? Запиши просто и сразу вместо двух строчек одну "GPIOB -> CRL = 0x44344444;"

Ну это на случай если у тебя уже завелся МК и по проге он прыгает. А если не завелся, то попробуй пока без своего "clockstart();". Подключи к проекту готовый стартап и system_stm32f10x.c. Там кварц, PLL, AHB, APB1 и т.п. проинициализируется. Только включи тактирование GPIOB: "RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN;".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какое значение у GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 ? Запиши просто и сразу вместо двух строчек одну "GPIOB -> CRL = 0x44344444;"

Ну это на случай если у тебя уже завелся МК и по проге он прыгает. А если не завелся, то попробуй пока без своего "clockstart();". Подключи к проекту готовый стартап и system_stm32f10x.c. Там кварц, PLL, AHB, APB1 и т.п. проинициализируется. Только включи тактирование GPIOB: "RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN;".

GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */

GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */

То есть при побитном ИЛИ они дают xx11xx.

Прогу прогнал, вроде бы проходит всю инициализацию и в основном цикле крутится, правда странно, иногда курсор вылетает за пределы функции

123lje.jpg

Готовый стартап я пробовал, с ходу не получилось, и я решил расписать вручную. Попробую еще раз, тогда я явно забывал запустить тактирование порта..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема оказалась на поверхности,

 RCC -> CFGR |= RCC_CFGR_SW_1;                            // PLL selected as system clock
    RCC -> CR |= RCC_CR_PLLON;                                    // Start PLL
    while (!(RCC -> CR & RCC_CR_PLLRDY))                      // Wait until PLL is locked
    {
;
    }

Источник тактирования для ПЛЛ должен быть включен после запуска самой ПЛЛ, а не до, то есть так:

 
    RCC -> CR |= RCC_CR_PLLON;                                    // Start PLL
    while (!(RCC -> CR & RCC_CR_PLLRDY))                      // Wait until PLL is locked
    {
;
    }
    RCC -> CFGR |= RCC_CFGR_SW_1;                            // PLL selected as system clock

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по комментариям, не источник тактирования для ПЛЛ должен быть включен до запуска ПЛЛ, а для системных тактов должна использоваться ПЛЛ после того, как войдет в рабочий режим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по комментариям, не источник тактирования для ПЛЛ должен быть включен до запуска ПЛЛ, а для системных тактов должна использоваться ПЛЛ после того, как войдет в рабочий режим.
Пардон, в коде было правильно, сюда не то скопировал

RCC -> CFGR |= (RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2);
                                                    // set PLL multiplier x9 (72 MHz)   
    RCC -> CR |= RCC_CR_PLLON;                        // start PLL
    while (!(RCC -> CR & RCC_CR_PLLRDY));              // wait until PLL will be locked                                                

    RCC -> CFGR |= RCC_CFGR_PLLSRC;                    // set PLL source clock - HSE
    RCC -> CFGR |= RCC_CFGR_SW_PLL;                    // PLL selected as system clock

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...