Главная » Статьи » Уроки по программированию stm32fxxx » Уроки по программированию stm32f1xx |
Урок 3: Помигаем светодиодом с StdPeriph
В прошлом уроке мы помигали светодиодом вручную заполняя все регистры. библиотека StdPeriph позволяет это сделать неявно, не обращаясь к портам напрямую. Создаём новый проект, как описано в уроке 1. Скачиваем саму библиотеку: StdPeriph. Или с этого сайта из раздела Каталог файлов Из неё копируем папку StdPeriph в папку с проектом. Рядом рассмотренный ранее CMSIS. Если вы скачаете StdPeriph с сайта www.st.com то там так же обнаружите CMSIS, подходящий под версию StdPeriph. Нам нужны именно папочки CMSIS и Stdperiph. Только в моём архиве файл _conf.h лежит в папке stdperiph/inc, а в скачанном с официального сайта, в папках с примерами. Теперь, как и раньше, создаём группы со следующими названиями: 1) startup - для файла начальной инициализации. просто переименовывается существующая группа. 2) CMSIS - для библиотеки CMSIS 3) User - для файлов пользователя 4) StdPeriph - для библиотеки StdPeriph. В которые добавляем файлы: 2) В CMSIS добавляем core_cm3.c 3) В User main.c 4) В StdPeriph добавляем все файлы *.с из папки src в StdPeriph. В файле main.c напишите следующий основной код: #include "stm32f10x.h" int main(void) { } В итоге у вас должно получиться следующее: Пока проект не соберётся. Теперь щёлкните правой кнопкой мыши по Target1 -> Options for Target 'Target 1'. Во вкладке С/С++ пропишите пути к папкам, в которых программа будет искать библиотеки. У вас должно получиться следующее: У файла stm32f10x.h снимите галочку только чтение. Нам сейчас придётся его править. Во-первых раскомментируйте define, относящийся к вашему устройству. Эта процедура описана в прошлом уроке. Примечание: Если вы используете библиотеку, скачанную с нашего сайта, то файл уже будет разблокирован и USE_STDPERIPH_DRIVER раскомментировано. Во-вторых найдите строки: #if !defined USE_STDPERIPH_DRIVER /** * @brief Comment the line below if you will not use the peripherals drivers. In this case, these drivers will not be included and the application code will be based on direct access to peripherals registers */ /*#define USE_STDPERIPH_DRIVER*/ #endif Раскомментируйте строку /*#define USE_STDPERIPH_DRIVER*/. Это значит, что вы собираетесь использовать библиотеку STDPERIPH. Второй тонкий момент. Найдите чуть ниже строку: #define HSE_VALUE ((uint32_t)8000000) Тут указана тактовая частота нашего кварца. Измените её, если вы используете кварц отличный от 8МГц. Теперь найдите в папке со скачанной библиотекой файлы: stm32f10x_conf.h и system_stm32f10x.c по пути: STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template. Второй файл, как вы помните, раньше входил в состав библиотеки CMSIS. Поместите их в папку user и добавьте к проекту в группу user. Примечание: Как уже писалось выше, если вы скачали архив в нашего сайта, то файл stm32f10x_conf.h будет лежать по адресу stdperiph/inc и переносить его не обязательно, достаточно просто добавить в проект. Всё. Теперь всё должно откомпилиться. Библиотека добавлена. В файле stm32f10x_conf.h находится список всех файлов из библиотеки stdperiph. Комментируя те или иные строки, можно подключать или отключать часть файлов. В нашем случае нам понадобятся только файлы stm32f10x_rcc.h и stm32f10x_gpio.h, отвечающие за тактирование и порты ввода-вывода соответственно. А также misc.h. Для инициализации порта в StdPeriph используется специальная структура следующего вида: typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef; В пользовательской программе переменная этого типа объявляется так: GPIO_InitTypeDef PORTA_init_struct; Теперь следуем следущему плану: 1) Включаем тактирование порта. 2) Заполняем структуру. 3) Вызываем функцию инициализации порта по этой структуре. 1) Тактирование включается следующим образом: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); Где вместо RCC_APB2Periph_GPIOA пишете порт, который хотите затактировать, например: RCC_APB2Periph_GPIOB. Или, если надо затактировать USART, то RCC_APB2Periph_USART1. 2) Заполняем структуру: PORTA_init_struct.GPIO_Pin = GPIO_Pin_9; PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz; PORTA_init_struct.GPIO_Mode = GPIO_Mode_Out_PP; Примечание: Если вы используете более позднюю библиотеку или библиотеку для другой серии, то там может быть немного другая структура данных. Тогда МК должен быть инициализирован так: GPIO_InitType.GPIO_Pin = GPIO_Pin_9; GPIO_InitType.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitType.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitType. GPIO_OType = GPIO_OType_PP; GPIO_InitType. GPIO_PuPd = GPIO_PuPd_NOPULL; В графу GPIO_Pin записываем номер ножки, которую инициализируете или список ножек через | в виде GPIO_Pin_Х, где Х - номер ножки. В графу GPIO_Speed записываем скорость порта. Чем выше скорость, тем быстрее он будет переключаться из одного состояния в другое. Но при этом будет больше энергопотребление. Выбирать можно из трёх вариантов: 1) GPIO_Speed_10MHz 2) GPIO_Speed_2MHz 3) GPIO_Speed_50MHz В графу GPIO_Mode записывается режим работы вывода. Это самая главная опция в структуре. Режимы работы были рассмотрены в предыдущем уроке. Вот как они описаны в StdPeriph: 1) GPIO_Mode_AIN - аналоговый вход. Нужен для работы АЦП. 2) GPIO_Mode_IN_FLOATING - вход с открытым коллектором. 3) GPIO_Mode_IPD - Вход с подтяжкой к земле. 4) GPIO_Mode_IPU - Вход с подтяжкой к питанию. 5) GPIO_Mode_Out_OD - Выход с открытым коллектором. 6) GPIO_Mode_Out_PP - Выход с подтяжкой. 7) GPIO_Mode_AF_OD - Альтернативный выход с открытым коллектором. 8) GPIO_Mode_AF_PP - Альтернативный выход с подтяжкой. 3) Теперь запишем настройки в порт: GPIO_Init(GPIOA, &PORTA_init_struct); Тут просто: Первым пишем название порта в виде GPIOХ, где Х - номер порта. А вторым пишем указатель на структуру. Напишем следующий код: #include "stm32f10x.h" void Delay( unsigned int Val); int main(void) { GPIO_InitTypeDef GPIO_InitPort; // Enable PORTB Periph clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitPort.GPIO_Pin = GPIO_Pin_0; GPIO_InitPort.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitPort.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitPort); GPIO_InitPort.GPIO_Pin = GPIO_Pin_1; GPIO_InitPort.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitPort.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitPort); while(1) { GPIO_SetBits( GPIOB, GPIO_Pin_0); GPIO_ResetBits( GPIOB, GPIO_Pin_1); Delay( 600000); GPIO_ResetBits( GPIOB, GPIO_Pin_0); GPIO_SetBits( GPIOB, GPIO_Pin_1); Delay( 600000); } } void Delay(vu32 nCount) { for(; nCount!= 0;nCount--); } Теперь соберём всё и зашьём. Светодиод должен мигать. Примечание по созданию папок для файлов: В их названиях не должно быть пробелов. Иначе будет прочитано последнее слово и выдана ошибка файла core_m3.c | |
Просмотров: 11490 | Комментарии: 7 | |