Код: Выделить всё
#include "stm32f4xx.h"
void delay_us(uint32_t us) ;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int ClockInit(char g)
{
__IO int StartUpCounter;
if (g == 'I')
{
RCC->CR |= (1<<RCC_CR_HSION_Pos); //Enable internal generator
for(StartUpCounter=0; ; StartUpCounter++) //Waiting for internal generator on
{
if(RCC->CR & (1<<RCC_CR_HSIRDY_Pos))
break;
if(StartUpCounter > 0x1000)
{
return 1;
}
}
RCC->PLLCFGR |= (0xA8<<RCC_PLLCFGR_PLLN_Pos) //PLL VCO multiplier x168
| (0x08<<RCC_PLLCFGR_PLLM_Pos); //Divide HSI by 8 for PLL
RCC->PLLCFGR &= ~(0x01<<RCC_PLLCFGR_PLLSRC_Pos); //PLL connected to HSI
RCC->PLLCFGR &= ~(0x3<<RCC_PLLCFGR_PLLP_Pos); //Divide by 2 for system clock
RCC->CR |= (1<<RCC_CR_PLLON_Pos); //Enable PLL
for(StartUpCounter=0; ; StartUpCounter++) //Waiting for PLL on
{
if(RCC->CR & (1<<RCC_CR_PLLRDY_Pos))
break;
if(StartUpCounter > 0x1000)
{
RCC->CR &= ~(1<<RCC_CR_PLLON_Pos);
return 2;
}
}
FLASH->ACR |= (0x05<<FLASH_ACR_LATENCY_Pos); //Set delay for flash memory
RCC->CFGR |= (0x04<<RCC_CFGR_PPRE2_Pos) //Set APB1 and APB2 prescalers
| (0x05<<RCC_CFGR_PPRE1_Pos);
RCC->CFGR |= (0x02<<RCC_CFGR_SW_Pos); //Switch to PLL clocking
while((RCC->CFGR & RCC_CFGR_SWS_Msk) != (0x02<<RCC_CFGR_SWS_Pos)); //Waiting for clocking from PLL
return 0;
}
if (g == 'E')
{
RCC->CR |= (1<<RCC_CR_HSEON_Pos); //Enable external generator
for(StartUpCounter=0; ; StartUpCounter++) //Waiting for internal generator on
{
if(RCC->CR & (1<<RCC_CR_HSERDY_Pos))
break;
if(StartUpCounter > 0x1000)
{
RCC->CR &= ~(1<<RCC_CR_HSEON_Pos);
return 1;
}
}
RCC->PLLCFGR |= (0x01<<RCC_PLLCFGR_PLLSRC_Pos); //PLL connected to HSE
| (0xA8<<RCC_PLLCFGR_PLLN_Pos) //PLL VCO multiplier x168
| (0x02<<RCC_PLLCFGR_PLLM_Pos) //Divide HSE by 2 for PLL
RCC->PLLCFGR &= ~(0x3<<RCC_PLLCFGR_PLLP_Pos); //Divide by 2 for system clock
RCC->CR |= (1<<RCC_CR_PLLON_Pos); //Enable PLL
for(StartUpCounter=0; ; StartUpCounter++) //Waiting for PLL on
{
if(RCC->CR & (1<<RCC_CR_PLLRDY_Pos))
break;
if(StartUpCounter > 0x1000)
{
RCC->CR &= ~(1<<RCC_CR_PLLON_Pos);
return 2;
}
}
FLASH->ACR |= (0x05<<FLASH_ACR_LATENCY_Pos); //Set delay for flash memory
RCC->CFGR |= (0x04<<RCC_CFGR_PPRE2_Pos) //Set AHB, APB1 and APB2 prescalers
| (0x05<<RCC_CFGR_PPRE1_Pos);
RCC->CFGR |= (0x02<<RCC_CFGR_SW_Pos); //Switch to PLL clocking
while((RCC->CFGR & RCC_CFGR_SWS_Msk) != (0x02<<RCC_CFGR_SWS_Pos)); //Waiting for clocking from PLL
return 0;
}
return 3;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void PortInit(void)
{
RCC->AHB1ENR |= (1<<RCC_AHB1ENR_GPIOAEN_Pos ); //Enable GPIOA clocking
RCC->AHB1ENR |= (1<<RCC_AHB1ENR_GPIOBEN_Pos ); //Enable GPIOB clocking
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TIM_Init(void) //Timer initialization for microseconds delay
{
SysTick->CTRL &= ~(1<<SysTick_CTRL_CLKSOURCE_Pos); //Select AHB frequency/8 as clocksource
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void delay_us(uint32_t us) //Microseconds delay function
{
SysTick->LOAD |= (21*us<<SysTick_LOAD_RELOAD_Pos);
SysTick->CTRL |= (1<<SysTick_CTRL_ENABLE_Pos);
while(!(SysTick->CTRL & (1<<SysTick_CTRL_COUNTFLAG_Pos)));
SysTick->CTRL &= ~(1<<SysTick_CTRL_ENABLE_Pos);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
ClockInit('E');
PortInit();
GPIOB->MODER |= (0x01<<GPIO_MODER_MODER14_Pos)
| (0x01<<GPIO_MODER_MODER13_Pos)
| (0x01<<GPIO_MODER_MODER12_Pos)
| (0x01<<GPIO_MODER_MODER11_Pos);
GPIOB->OSPEEDR |= (0x03<<GPIO_OSPEEDR_OSPEED14_Pos)
| (0x03<<GPIO_OSPEEDR_OSPEED13_Pos)
| (0x03<<GPIO_OSPEEDR_OSPEED12_Pos)
| (0x03<<GPIO_OSPEEDR_OSPEED11_Pos);
TIM_Init();
while (1)
{
GPIOB->BSRR |= (1<<GPIO_BSRR_BS14_Pos);
//delay_us(500000);
delay_us(500000);
GPIOB->BSRR |= (1<<GPIO_BSRR_BR14_Pos);
//delay_us(500000);
delay_us(500000);
}
}


