Поиск…


замечания

В этом разделе представлен обзор того, что такое stm32, и почему разработчик может захотеть его использовать.

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

Что такое STM32?


STM32 - это 32-битное семейство микроконтроллеров Flash, разработанное ST Microelectronics. Он основан на процессоре ARM® Cortex®-M и предлагает 32-битный ассортимент продукции, который сочетает в себе очень высокую производительность, возможности в реальном времени, обработку цифрового сигнала и маломощную работу с низким напряжением.

Подробное описание каждой серии, средств разработки и декодирования номеров деталей можно найти в Википедии .

Серия продуктов

Cortex-M0 / -M0 + Cortex-M3 Cortex-M4 Cortex-M7
Высокая производительность: STM32F2 STM32F4 STM32F7 , STM32H7
Основное направление: STM32F0 STM32F1 STM32F3
Ультра-низкое энергопотребление: STM32L0 STM32L1 STM32L4

Платы развития

STM32 Nucleoподдержкой mbed ) Наборы для обнаружения Оценочные платы
Типичный вариант использования: Гибкое прототипирование, сообщество Прототипирование, творческие демонстрации Полная оценка возможностей
Возможности расширения: +++ ++ ++
Возможности подключения: Arduino ™, ST, Morpho ST ST

Версии

Версия Дата выхода
1.0.0 2016-11-01

( Примечание. Существует много IDE, toolchain и библиотеки, которые готовы к использованию с STM32. Следующая настройка требует минимальных усилий, чтобы заставить ее работать, но она только одна из многих. Не стесняйтесь исследовать других, это не цель этого примера - заставить кого-либо использовать инструменты, которые будут использоваться здесь.)


Установка IDE

System Workbench для STM32 : бесплатная среда IDE для Windows, Linux и OS X. Она была создана AC6 и доступна для скачивания после регистрации с сайта сообщества OpenSTM32 .

Сама IDE основана на Eclipse, но поставляется с некоторыми дополнительными возможностями для разработки STM32, например:

  • Acch STM32 MCU GCC toolchain
  • OpenOCD и GDB (arm-none-eabi-gdb) с автоматически созданной конфигурацией отладки в зависимости от целевой платы
  • Встроенные опции для программирования или стирания чипа

Чтобы начать с STM32 перед созданием собственной платы, рекомендуется поэкспериментировать с панелью Discovery , Nucleo или Eval , которая поставляется с встроенным программным модулем / отладчиком SWD (Serial Wire Debug) под названием ST-Link.

Создание проекта

В этом примере будет использоваться комплект обнаружения STM32F4 , в котором имеется микроконтроллер STM32F407VG. (Также можно использовать любую другую плату).

  1. Откройте SW4STM32 и создайте новый проект C: Файл → Новый → Проект C

  2. Дайте ему имя типа «STM32F4_Discovery-Blinky», а в списке « Тип проекта» выберите проект « Исполняемый / Ac6 STM32 MCU» . По умолчанию единственной доступной toolchain является Ac6 STM32 MCU GCC . Нажмите кнопку "Далее.

    введите описание изображения здесь

  3. Следующий шаг - параметры Debug / Release , которые можно пропустить, нажав кнопку «Далее».

  4. Выбор платы . Существующие платы можно выбрать, так как в этом примере можно добавить STM32F4 Discovery или новые пользовательские платы.

    введите описание изображения здесь

  5. Следующий шаг - настройка прошивки проекта . Выберите между прошивкой , стандартной периферийной библиотекой (SPL) или аппаратным абстракционным слоем (HAL). Допрашивается, какой из них более подходит для развития, но этот вопрос выходит за рамки данного примера. В этом примере будет использоваться библиотека HAL, поскольку она в настоящее время поддерживается ST Microelectronics. Дополнительным доступным программным инструментом для HAL является STM32CubeMX , который является генератором кода инициализации. Также некоторые программные приложения доступны в пакетах STM32CubeFx или STM32CubeLx. Загрузите целевую микропрограмму, если она отсутствует, и рекомендуется выбрать «Добавить драйверы низкого уровня в проекте» и «Как источники в приложении» . Наконец, нажмите «Готово».

    введите описание изображения здесь

Поскольку этот проект был создан с помощью STM32F4 Discovery, уже есть несколько готовых к использованию функций в папке / STM32F4_Discovery-Blinky / Utilities / STM32F4-Discovery / project, которая может использоваться для интерфейса периферийных устройств набора Discovery (акселерометр, аудио , Светодиоды, кнопка). В этом примере void BSP_LED_Init(Led_TypeDef Led) и функции void BSP_LED_Toggle(Led_TypeDef Led) будут использоваться из файла stm32f4_discovery.c для мигания зеленого светодиода, который является LED4 . Чтобы определить, какой светодиод используется схемой набора Discovery .

введите описание изображения здесь

Фактические имена контактов и портов уже скрыты некоторыми #define и enum , используйте Ctrl + Click, чтобы отслеживать их.

  1. Внутри main вызова HAL_Init() функцию HAL_Init() которая сбрасывает все периферийные устройства, инициализирует интерфейс Flash и Systick. (Systick будет использоваться для генерации задержки для мигания.)
  2. Системные часы должны быть настроены. Это можно сделать, используя функцию конфигурации часов STM32CubeMX или справочное руководство. В этом примере системные часы подаются внутренним PLL (Phase Locked Loop), который подается внешним кварцевым генератором 8 МГц (HSE). Предделители были настроены на достижение максимальной доступной частоты, которая составляет 168 МГц в случае обнаружения F4.
  3. Инициализация периферийных устройств, в данном случае штырь GPIO.
  4. В бесконечном цикле вызовите переключатель LED и HAL_Delay() . HAL_Delay() использует Systick и генерирует задержку в миллисекундах.

Весь код следующий:

#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
            
void SystemClock_Config(void);

int main(void)
{
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* Initialize one of the LED GPIO pin */
    BSP_LED_Init(LED4);

    while(1)
    {
        BSP_LED_Toggle(LED4);
        HAL_Delay(1000);       // in miliseconds
    }
}

/**
 * @brief  System Clock Configuration
 *         The system Clock is configured as follow :
 *            System Clock source            = PLL (HSE)
 *            SYSCLK(Hz)                     = 168000000
 *            HCLK(Hz)                       = 168000000
 *            AHB Prescaler                  = 1
 *            APB1 Prescaler                 = 4
 *            APB2 Prescaler                 = 2
 *            HSE Frequency(Hz)              = HSE_VALUE
 *            PLL_M                          = (HSE_VALUE/1000000u)
 *            PLL_N                          = 336
 *            PLL_P                          = 2
 *            PLL_Q                          = 7
 *            VDD(V)                         = 3.3
 *            Main regulator output voltage  = Scale1 mode
 *            Flash Latency(WS)              = 5
 * @param  None
 * @retval None
 */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  // Enable Power Control clock
  __PWR_CLK_ENABLE();

  // The voltage scaling allows optimizing the power consumption when the
  // device is clocked below the maximum system frequency, to update the
  // voltage scaling value regarding system frequency refer to product
  // datasheet.
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  // Enable HSE Oscillator and activate PLL with HSE as source
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
  // your case, you have to recompute these PLL constants.
  RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  // clocks dividers
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
      | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

Построить с помощью молотка введите описание изображения здесь , и загрузите приложение, щелкнув правой кнопкой мыши по папке проекта и выбрав опцию Target → Program chip ....

Другой способ загрузки - использование отладки . Чтобы сделать это, нажмите на стрелку рядом с значком ошибки. введите описание изображения здесь в панели инструментов и откройте меню « Конфигурация отладки ...» . Создайте новую конфигурацию отладки Ac6 STM32 и, если поле приложения C / C ++ пусто, заполните следующую команду:

Debug \ STM32F4_Discovery-Blinky.elf

Другие параметры отладки, такие как файл конфигурации OpenOCD и используемые порты Telnet и GDB, автоматически генерируются и заполняются каркасом. Наконец, нажмите кнопку «Отладка».



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow