Апр 082013
 

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

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

MicroXplorer 3

Далее жмем кнопку Generate source code files (Generate source code files) на панели инструментов или выбираем одноименный пункт в меню Tools. Программа спросит в каком месте сохранить новые файлы. После сохранения увидим две новые папки inc и src. В папке inc находится всего один файл mx_gpio.h, в котором подключаются необходимые файлы с расширением .h, а также объявляется всего одна функция void mx_pinout_config(void).

/* Define to prevent recursive inclusion -------------------------------------*/ 
#ifndef __mx_pinoutConfig_H 
#define __mx_pinoutConfig_H 
#ifdef __cplusplus extern "C"
 { 
  #endif 
  /* Includes ------------------------------------------------------------------*/ 
  #include "stm32f10x.h" 
  #include "stm32f10x_gpio.h" 
  #include "stm32f10x_rcc.h" 
  void mx_pinout_config(void); 
  #ifdef __cplusplus 
 } 
#endif 
#endif /*__ mx_pinoutConfig_H */

Как видим, подключаются файлы библиотеки SPL (Standard Peripheral Library), то есть настройка портов будет производиться через функции этой библиотеки, а не напрямую через регистры.

Папка src содержит 2 файла: mx_gpio.c и mx_main.c. В первом файле находится функция, с помощью которой и настраивается нужный вывод порта для работы с заданным периферийным устройством.


void mx_pinout_config(void) 
{
 /* Private typedef ---------------------------------------------------------*/
 GPIO_InitTypeDef GPIO_InitStruct;/** ADC1 GPIO Configuration PA0-WKUP ------> ADC1_IN0 */
 /*Enable or disable APB2 peripheral clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 /*Configure GPIO pin */
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOA, &GPIO_InitStruct); 
}


А в файле mx_main.c вызывается данная функция, здесь же пишется весь остальной код программы.

/* Includes ------------------------------------------------------------------*/ 
#include "mx_gpio.h" 
/* USER CODE BEGIN 0 */ 
/* USER CODE END 0 */ 
int main(void)
 {
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
  mx_pinout_config();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  while (1) { }
  /* USER CODE BEGIN 3 *
  /* USER CODE END 3 */
 }

Для АЦП нужный вывод порта настраивается сразу. Но для некоторых других периферийных устройств, у которых множество разных режимов работы, в функции инициализации даются всего лишь заготовки структур, которые необходимо заполнить нужными параметрами, а затем удалить символы комментариев в нужных строках. Например, при включении SPI1

SPI1

будет сгенерирован следующий код функции инициализации задействованных выводов:

void mx_pinout_config(void)
 {
  /* Private typedef ---------------------------------------------------------*/
  GPIO_InitTypeDef GPIO_InitStruct;/** SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */
  /*Enable or disable APB2 peripheral clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
 }

Предыдущие примеры кода были сгенерированы для микроконтроллера STM32F100.

Если же попробовать сделать то же самое для микроконтроллера серии STM32L152, в котором подключение определенного периферийного устройства к нужным выводам порта задается выбором номера альтернативной функции в соответствующих регистрах порта GPIO, генерируемый код для функции инициализации изменится следующим образом:

void mx_pinout_config(void)
 { 
  /* Private typedef ---------------------------------------------------------*/
  GPIO_InitTypeDef GPIO_InitStruct;/** SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA11 ------> SPI1_MISO PA12 ------> SPI1_MOSI */
  /*Enable or disable the AHB peripheral clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_400KHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_400KHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
  //!!! GPIO_Init is commented because some parameters are missing
  //GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
  //GPIO_InitStruct.GPIO_Mode = ;
  //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_400KHz;
  //GPIO_Init(GPIOA, &GPIO_InitStruct);
  /*Configure GPIO pin alternate function */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
  /*Configure GPIO pin alternate function */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_SPI1);
  /*Configure GPIO pin alternate function */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_SPI1);
 }

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

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

Другие статьи: