Модифицировал какой-то простейший кейловский пример, там почему-то даже не было инициализации системы тактирования, и направления портов 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();
}
}
* 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
}
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
}