Под платформы ПК первым уроком обычно является "Hello world", в нашем же случае, консольный вывод изначально не доступен. Поэтому для обучения простейшей программой выбрано управление светодиодом, т.к. не требует углубленных знаний.

Для начала необходимо разобраться в схеме макетной платы и выяснить к какой ноге МК подключен наш светодиод.

В моем случае для примера взята плата Open107V с MK STM32F107VCT

На плате имеется 4 светодиода: LED1-LED4. Для работы выберем LED1. Найдем его на схеме и проследим к какой ноге МК он подключен.

Из схемы видно, что LED1 подключен к порту B0. С ним то нам и предстоит работать.

Так как для линейки STM32F1xx Keil поставляет старые библиотеки Standard Peripherals Library, мы рассмотрим два варианта реализации проекта.

Вариант 1. Создаем проект для МК STM32F107VC с использованием поставляемой Keil библиотеки Standard Peripherals Library. Как создать проект в Keil?

В Manager Run-Time Environment должны быть выбраны следующие пункты:

  • Device->Startup
  • Device->StdPeriph Driver->GPIO
  • Device->StdPeriph Driver->Framevork
  • Device->StdPeriph Driver->RCC
  • CMSIS->CORE

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

main.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/*----------------------------------------------------------------------------*/
static __IO uint32_t TimingDelay;
/*----------------------------------------------------------------------------*/
void Delay(__IO uint32_t nTime);
//============================================================================//
void LedInit(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//============================================================================//
int main(void)
{
  LedInit();

  SysTick_Config(SystemCoreClock / 1000);

  while(1)
  {
    Delay(500);
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
    Delay(500);
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  }
}
//============================================================================//
void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}
//============================================================================//
void SysTick_Handler(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}
//============================================================================//

Теперь вкратце разберем что здесь и зачем.

Функция void LedInit(void) - инициализация ноги МК подключенной к светодиоду. В данной функции мы включаем тактирование порта B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE) и настраиваем ногу, заполнив структуру GPIO_InitStructure. Где GPIO_Pin = GPIO_Pin_0 соответствует номеру пина, а GPIO_Mode = GPIO_Mode_Out_PP режиму работы и производим инициализацию порта GPIO_Init(GPIOB, &GPIO_InitStructure), где указывается ранее заполненная структура и соответствующий порт. Т.е. если в вашем случае светодиод подключен к другой ноге МК, вам будет необходимо поменять эти параметры.

Функция void Delay(__IO uint32_t nTime) - организация задержки по времени в мс.

Функция void SysTick_Handler(void) - обработчик прерывания от системного таймера.

И так, мы инициализируем ногу контроллера для работы в режиме выхода, а так же системный таймер для организации задержки по времени. В цикле while, каждые 500 мс производится смена состояния выхода порта B0.

Задержка основана на базе системного таймера и глобальной переменной TimingDelay. При этом в обработчике прерывания производится декремент TimingDelay до обнуления переменной, а в функции Delay, мы задаем переменной время ожидания и в цикле ожидаем ее обнуления.

На этом первый вариант закончен, можно компилировать и зашивать.

Вариант 1. Создаем проект для МК STM32F107VCT с использованием CubeMX.

Создадим проект для нашего МК выбрав соответствующую серию, линейку и корпус LQFP100.

В разделе Peripherals->RCC для High Speed Clock (HSE) выберем Crystal/Ceramic Resonator. Данным действием мы подключаем к МК внешний кварц.

На МК по ноге PB0 нажмем левой кнопкой мыши и выберем пункт GPIO_Output.

Перейдем во вкладку Clock Configuration. В Input frequency выставим 25 MHz, с таким номиналом кварц на моей плате, в вашем случае может быть другой. В HCLK (MHz) выставим 72 MHz - тактовая частота контроллера. После CubeMX предложит пересчитать делители под конечную частоту. Соглашаемся, делители выставлены.

Теперь все готово и можно сгенерировать начальный код для Keil.

В меню Project выбираем Generate Code. В окне записываем имя проекта, выбираем путь к проекту и в Toolchain / IDE - MDK-ARM V5. Жмем OK и в появившемся окне Open Project.

 

CubeMX предоставил необходимы шаблоны, которые нам остается только дополнить двумя строчками:

HAL_Delay(500); - стандартная функция задержки по времени в библиотеке HAL.

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); - функция смены состояния порта.

Назначение остальных функций примерно такое же как и в первом варианте, поэтому расписывать их я не буду.

main.c

    

CubeMX создает код на основе библиотеки HAL. Разобравшись в CubeMX, что не так сложно, вы сможете с легкость подготавливать шаблоны с настроенной периферией. Что, в свою очередь, неплохо сократит время.

Какой метод использовать или с какой библиотекой работать зависит от вашего предпочтения. Так что выбирайте с умом.

В итоге мы рассмотрели два варианта реализации, при этом не углублялись в подробности настройки периферии. Более подробно с периферией и CubeMX, вы сможете познакомиться в других разделах сайта.

Просмотров: 1 765
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


© Copyright 2017. Все права защищены.
Яндекс.Метрика