Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2740
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Инструмент STM32CubeMX

121

Рисунок 19: Все параметры установки должны быть включены при установке Python на Windows

После того, как мы установили Python и библиотеку lxml, можно скачать скрипт CubeMXImporter с github и поместить его в удобное место (я предполагаю, что он загру-

жается в папку /STM32Toolchain/CubeMXImporter).

Теперь закройте проект Eclipse (не пропустите этот шаг) и выполните CubeMXImporter на консоли терминала следующим образом:

$ python cubemximporter.py <путь-к-проекту-eclipse> <путь-к-проекту-cube-mx>

Через несколько секунд проект CubeMX будет правильно импортирован. Теперь снова откройте проект Eclipse и выполните обновление дерева с файлами с исходным кодом, щелкнув правой кнопкой мыши по корню проекта и выбрав пункт Refresh.

Вы можете приступить к сборке проекта.

4.3. Изучение сгенерированного кода приложения

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

хранить шаблон проекта в месте, отделенном от рабочего пространства Eclipse;

импортировать его в рабочее пространство, когда вам нужно начать новый про-

ект (выберите File → Import… и выберите пункт Import Existing Projects into Workspace);

откройте проект и переименуйте его, как вы хотите, щелкнув правой кнопкой мыши по корню проекта и выбрав пункт Rename….

Асейчас мы настроим его main.c, чтобы сделать что-то полезное с нашей Nucleo. Но, прежде чем изменять файлы приложения, давайте посмотрим на них.

Первым важным файлом, который мы собираемся проанализировать, является include/stm32XXxx_hal_conf.h. Это файл, в котором конфигурации HAL переводятся в код на языке Си с использованием нескольких определений макросов. Эти макросы используются для «инструктирования» HAL о включенных функциях микроконтроллера. Вы найдете много закомментированных макросов, как показано ниже:

SysTick_Handler()

Инструмент STM32CubeMX

122

Имя файла: include/stm32XXxx_hal_conf.h

87//#define HAL_QSPI_MODULE_ENABLED

88//#define HAL_CEC_MODULE_ENABLED

89//#define HAL_FMPI2C_MODULE_ENABLED

90//#define HAL_SPDIFRX_MODULE_ENABLED

91//#define HAL_DFSDM_MODULE_ENABLED

92//#define HAL_LPTIM_MODULE_ENABLED

93#define HAL_GPIO_MODULE_ENABLED

94#define HAL_DMA_MODULE_ENABLED

95#define HAL_RCC_MODULE_ENABLED

96#define HAL_FLASH_MODULE_ENABLED

97#define HAL_PWR_MODULE_ENABLED

98#define HAL_CORTEX_MODULE_ENABLED

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

Файл src/stm32f4xx_it.c является еще одним фундаментальным файлом с исходным кодом. Это место, где хранятся все процедуры обслуживания прерываний (Interrupt Service Routines, ISR), сгенерированные CubeMX. Давайте рассмотрим его содержимое16.

 

Имя файла: src/stm32XXxx_it.c

 

 

 

 

42

/* Внешние переменные --------------------------------------------------------

*/

43

 

 

 

44

/******************************************************************************/

45

/*

Обработчики прерываний и исключений процессора Cortex-M4

*/

46

/******************************************************************************/

47

 

 

 

48/**

49* @brief Данная функция обрабатывает прерывание от таймера System tick.

50*/

51void SysTick_Handler(void)

52{

53/* USER CODE BEGIN SysTick_IRQn 0 */

54

55/* USER CODE END SysTick_IRQn 0 */

56HAL_IncTick();

57HAL_SYSTICK_IRQHandler();

58/* USER CODE BEGIN SysTick_IRQn 1 */

60/* USER CODE END SysTick_IRQn 1 */

61}

Учитывая выбранную нами конфигурацию CubeMX, файл содержит, по существу, только определение функции void SysTick_Handler(void), которая объявлена в файле system/include/cortexm/ExceptionHandlers.h. – это ISR таймера

16 Некоторые комментарии в приведенных в книге листингах были переведены. (прим. переводчика)

Инструмент STM32CubeMX

123

SysTick, то есть процедура, которая вызывается, когда таймер SysTick достигает 0. Но где вызывается эта ISR?

Ответ на данный вопрос дает нам возможность начать работу с одной из самых инте-

ресных функций процессоров Cortex-M: Контроллером вложенных векторных прерываний

(Nested Vectored Interrupt Controller, NVIC). Таблица 1 в Главе 1 показывает типы исключений Cortex-M. Если вы помните, мы говорили, что в Cortex-M прерывания процессора – это особый тип исключений. Cortex-M определяет SysTick_Handler как пятнадцатое исключение в массиве векторов контроллера NVIC. Но где этот массив определен? В предыдущем параграфе мы добавили специальный файл, написанный на ассемблере, который мы назвали startup-файлом. Открыв данный файл, мы видим минимальную векторную таблицу для процессора Cortex, примерно в строке 140, как показано ниже:

Имя файла: system/src/cmsis/startup_stm32f401xe.S

142g_pfnVectors:

143.word _estack

144.word Reset_Handler

145.word NMI_Handler

146.word HardFault_Handler

147

.word MemManage_Handler

/* Не доступно в Cortex-M0/0+ */

148

.word BusFault_Handler

/* Не

доступно

в Cortex-M0/0+

*/

149

.word UsageFault_Handler

/* Не

доступно

в Cortex-M0/0+

*/

150.word 0

151.word 0

152.word 0

153.word 0

154.word SVC_Handler

155

.word DebugMon_Handler

/* Не доступно в Cortex-M0/0+ */

156.word 0

157.word PendSV_Handler

158.word SysTick_Handler

Встроке 158 SysTick_Handler() определяется как ISR для таймера SysTick.

Пожалуйста, учтите, что startup-файлы имеют небольшие изменения между разными версиями HAL от ST. Указанные здесь номера строк могут немного отличаться от startup-файла вашего микроконтроллера. Более того, исключе-

ния MemManage Fault, Bus Fault, Usage Fault и Debug Monitor не доступны (и, сле-

довательно, соответствующая запись вектора ЗАРЕЗЕРВИРОВАНА – см. таблицу 1 в Главе 1) в процессорах на базе Cortex-M0/0+. Однако первые пятнадцать исключений в контроллере NVIC всегда одинаковы для всех процессоров на базе Cortex-M0/0+ и всех микроконтроллеров на базе Cortex-M3/4/7.

Другой действительно важный файл для анализа – это src/stm32XXxx_hal_msp.c. Прежде всего, важно уточнить значение «MSP». Оно обозначает MCU Support Package (пакет поддержки микроконтроллера) и определяет все функции инициализации, используемые для конфигурации встроенных периферийных устройств в соответствии с пользовательской конфигурацией (назначение выводов, разрешение тактирования, использование DMA и прерываний). Давайте объясним его подробно на примере. Периферийное устройство, по существу, состоит из двух вещей: само периферийное

Инструмент STM32CubeMX

124

устройство (например, интерфейс SPI2) и аппаратные выводы, связанные с данным периферийным устройством.

Рисунок 20: Связь между файлами MSP и HAL

HAL от ST спроектирован таким образом, что в HAL модуль SPI является универсальным и абстрагируется от конкретных конфигураций I/O, которые могут отличаться в зависимости от корпуса микроконтроллера и пользовательской аппаратной конфигурации. Таким образом, разработчики ST возложили на пользователя ответственность за «заполнение» данной части HAL кодом, необходимым для конфигурации периферийного устройства, используя своего рода процедуры обратного вызова (callback routines), и этот код находится в файле src/stm32XXxx_hal_msp.c (см. рисунок 20).

Давайте откроем файл src/stm32XXxx_hal_msp.c. Здесь мы можем найти функцию

void HAL_MspInit(void):

Имя файла: src/ch4-stm32XXxx_hal_msp.c

44void HAL_MspInit(void)

45{

46/* USER CODE BEGIN MspInit 0 */

48/* USER CODE END MspInit 0 */

50

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);

51

 

52/* Инициализация системных прерываний*/

53/* Конфигурация прерываний SysTick_IRQn */

54HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

56/* USER CODE BEGIN MspInit 1 */

58/* USER CODE END MspInit 1 */

59}

HAL_MspInit(void) вызывается внутри функции HAL_Init(), которая, в свою очередь,

вызывается в файле main.c, как мы скоро увидим. Функция просто определяет приоритет исключения SysTick_IRQn, которое обрабатывается ISR SysTick_Handler(). Код назначает самый высокий определенный пользователем приоритет (чем меньше число, тем выше приоритет).

Последний файл, который остается проанализировать, – это src/main.c. По сути, он

содержит три процедуры: SystemClock_Config(void), MX_GPIO_Init(void) и int main(void).

Инструмент STM32CubeMX

125

Первая функция используется для инициализации тактирования ядра и периферии. Ее объяснение выходит за рамки данной главы, но ее код не так сложен для понимания. MX_GPIO_Init(void) – это функция, которая конфигурирует GPIO. Глава 6 объяснит данный вопрос подробно.

Наконец, у нас есть функция int main(void), как показано ниже.

Имя файла: src/main.c

60int main(void)

61{

62/* USER CODE BEGIN 1 */

64/* USER CODE END 1 */

66/* Конфигурация микроконтроллера---------------------------------------------------*/

67/* Сброс всей периферии, Инициализация интерфейса Flash и Systick. */

68HAL_Init();

69/* Конфигурация системного тактового сигнала */

70SystemClock_Config();

71/* Инициализация всей сконфигурированной периферии */

72MX_GPIO_Init();

73

74 /* USER CODE BEGIN 2 */

75

76 /* USER CODE END 2 */

77

78/* Бесконечный цикл */

79/* USER CODE BEGIN WHILE */

80while (1)

81{

82/* USER CODE END WHILE */

84/* USER CODE BEGIN 3 */

85}

86/* USER CODE END 3 */

87}

88

89/** Конфигурация системного тактового сигнала

90*/

91void SystemClock_Config(void)

92{

Код действительно говорит сам за себя. Сначала HAL инициализируется путем вызова функции HAL_Init(). Не забывайте, что это приводит к тому, что HAL автоматически вызывает функцию HAL_MSP_Init(). Затем инициализируются тактирование и GPIO. Наконец, приложение входит в бесконечный цикл: это место, где должен быть размещен наш код.