A-10 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Всем привет. Приобрел недавно отладочную плату на 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Сама прога выполняется? А какие значения присваиваешь регистру BSRR? Т.к. тут еще отдельно есть регистр сброса выводов BRR, то я привык через него сбрасывать. Напиши так, может поможет: GPIOB -> BSRR = 0x20; //pa5 set to high WaitToGoldLife(); GPIOB -> BRR = 0x20; //pa5 reset Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A-10 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Сама прога выполняется? А какие значения присваиваешь регистру BSRR? Т.к. тут еще отдельно есть регистр сброса выводов BRR, то я привык через него сбрасывать. Напиши так, может поможет: GPIOB -> BSRR = 0x20; //pa5 set to high WaitToGoldLife(); GPIOB -> BRR = 0x20; //pa5 reset По дебагу в софте я еще не успел разобраться, кейл только недавно поставил. Попробую прогнать в дебаггере. Железо по-крайней мере работает с тестовой прошивкой (что была с платой), СД горит и шьется она нормально. Было подозрение на стартап-код, я дефолтный использую. Во все тонкости пока не вник. А в BSRR пишу то же 0x20, просто имя взято из хедера стандартного STM. Попробовал - нет разницы. Знать бы в каком направлении искать, а то думаю, ошибка в настройке тактовых, порты или вообще стартап. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 1 октября, 2010 Опубликовано 1 октября, 2010 · Жалоба А какое значение у GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 ? Запиши просто и сразу вместо двух строчек одну "GPIOB -> CRL = 0x44344444;" Ну это на случай если у тебя уже завелся МК и по проге он прыгает. А если не завелся, то попробуй пока без своего "clockstart();". Подключи к проекту готовый стартап и system_stm32f10x.c. Там кварц, PLL, AHB, APB1 и т.п. проинициализируется. Только включи тактирование GPIOB: "RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN;". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A-10 0 1 октября, 2010 Опубликовано 1 октября, 2010 · Жалоба А какое значение у 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. Прогу прогнал, вроде бы проходит всю инициализацию и в основном цикле крутится, правда странно, иногда курсор вылетает за пределы функции Готовый стартап я пробовал, с ходу не получилось, и я решил расписать вручную. Попробую еще раз, тогда я явно забывал запустить тактирование порта.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A-10 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Проблема оказалась на поверхности, 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Судя по комментариям, не источник тактирования для ПЛЛ должен быть включен до запуска ПЛЛ, а для системных тактов должна использоваться ПЛЛ после того, как войдет в рабочий режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A-10 0 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба Судя по комментариям, не источник тактирования для ПЛЛ должен быть включен до запуска ПЛЛ, а для системных тактов должна использоваться ПЛЛ после того, как войдет в рабочий режим.Пардон, в коде было правильно, сюда не то скопировал 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться