Чт ноя 22, 2018 23:37:14
#ifndef MAIN_H_
#define MAIN_H_
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
//#include "misc.h"
#endif /* MAIN_H_ */
//*******************************************************************************
#include "main.h"
//*******************************************************************************
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
// Обязательно сбрасываем флаг
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIOC->ODR ^= GPIO_Pin_13;
}
}
int main(void)
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int i;
//******************************************************************************************************************************
{ //настройка тактирования
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ----------*/
RCC_DeInit(); /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */
RCC_HSEConfig( RCC_HSE_ON); /* Включаем HSE (внешний кварц) */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Ждем пока HSE будет готов */
if (HSEStartUpStatus == SUCCESS) /* Если с HSE все в порядке */
{
/* Следующие две команды касаются исключительно работы с FLASH.
Если вы не собираетесь использовать в своей программе функций работы с Flash,
FLASH_PrefetchBufferCmd( ) та FLASH_SetLatency( ) можно закомментировать */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); /* Включаем Prefetch Buffer */
/* FLASH Latency.
Рекомендовано устанавливать:
FLASH_Latency_0 - 0 < SYSCLK? 24 MHz
FLASH_Latency_1 - 24 MHz < SYSCLK ? 48 MHz
FLASH_Latency_2 - 48 MHz < SYSCLK ? 72 MHz */
//FLASH_SetLatency( FLASH_Latency_2);
RCC_HCLKConfig( RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */
RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */
RCC_PCLK1Config( RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */
/* PLLCLK = 8MHz * 9 = 72 MHz */
/* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */
/* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd( ENABLE); /* Включаем PLL */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Ждем пока PLL будет готов */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Переключаем системное тактирование на PLL */
while (RCC_GetSYSCLKSource() != 0x08) {} /* Ждем пока переключиться */
}
else /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */
{
while (1) {} /* Пока тут заглушка - вечный цикл*/
}
}
{ //настройка портов
GPIO_InitTypeDef GPIO_InitStructure; /* Initialize Leds mounted on STM32 board */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Initialize LED which connected to PC13, Enable the Clock*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//----------
//GPIO_InitTypeDef GPIO_InitStructure; /* Initialize Leds mounted on STM32 board */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Initialize LED which connected to PC13, Enable the Clock*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; /* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//----------
}
{ //настройка таймеров
// TIMER2
TIM_TimeBaseInitTypeDef TIMER_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructInit(&TIMER_InitStructure);
TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIMER_InitStructure.TIM_Prescaler = 8000;
TIMER_InitStructure.TIM_Period = 500;
TIM_TimeBaseInit(TIM2, &TIMER_InitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
/* NVIC Configuration */
/* Enable the TIM2_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // Set C13 to Low level ("0")
while (1)
{
// GPIOC->ODR ^= GPIO_Pin_13; /* Toggle LED which connected to PC13*/
// GPIOB->ODR ^= GPIO_Pin_0;
// GPIO_ResetBits(GPIOC, GPIO_Pin_13); // Set C13 to Low level ("0")
// for(i=0;i<0x5AE8BA;i++); /* delay */
// GPIO_SetBits(GPIOC, GPIO_Pin_13); // Set C13 to High level ("1")
GPIO_SetBits(GPIOB, GPIO_Pin_0);
for(i=0;i<0x5AE8BA;i++); /* delay */
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
for(i=0;i<0x5AE8BA;i++); /* delay */
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
Чт ноя 22, 2018 23:47:56
Пт ноя 23, 2018 00:52:53
extern "C" void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Обязательно сбрасываем флаг
GPIOC->ODR ^= GPIO_Pin_13;
}
}
Пт ноя 23, 2018 00:57:31
Пт ноя 23, 2018 01:06:51