|
|||||||
От Arduino к STM32
Время создания: 02.03.2022 22:33
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/1646249632i7befksf6c/text.html на raw.github.com
|
|||||||
|
|||||||
Если, вдруг, ресурсов контроллера Arduino и 8-битных МК Atmel AVR перестаёт хватать — всегда есть вариант перейти на ARM Cortex-M. Например, на популярные микроконтроллеры STM32. Переход можно осуществить довольно плавно — при помощи контроллеров:
А лучше сразу взять какую-нибудь Discovery. Например, STM32F4Discovery (STM32F407VG, 168 MHz). Начав ковыряться с STM32, вы быстро обнаружите, что они с SPL (Standard Peripheral Library) перешли на HAL (High Access Level) с удобным графическим конфигуратором — STM32CubeMX , что даёт просто турбореактивный старт использования МК STM32. Для вводного представления, можно посмотреть вебинар «Изучение STM32CubeMX на примере отладочной платы STM32F746G-DISCO»: http://www.youtube.com/watch?v=iCcJmn5N3R8 HAL работает поверх CMSIS (Cortex Microcontroller Software Interface Standard), который представляет собой единый стандарт описаний ресурсов (стандартную библиотеку). Например, реализация аналога digitalWrite() — HAL_GPIO_WritePin(): /** * @brief Sets or clears the selected data port bit. * * @note This function uses GPIOx_BSRR register to allow atomic read/modify * accesses. In this way, there is no risk of an IRQ occurring between * the read and the modify access. * * @param GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F429X device or * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * @param PinState: specifies the value to be written to the selected bit. * This parameter can be one of the GPIO_PinState enum values: * @arg GPIO_PIN_RESET: to clear the port pin * @arg GPIO_PIN_SET: to set the port pin * @retval None */ void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); assert_param(IS_GPIO_PIN_ACTION(PinState)); if(PinState != GPIO_PIN_RESET) { GPIOx->BSRR = GPIO_Pin; } else { GPIOx->BSRR = (uint32_t)GPIO_Pin << 16; } } - сводится к установке соответствующего бита в регистре BSRR, для соответствующего порта. Blink зелёным светодиодом для STM32F4DISCOVERY внутри while (1): /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 1); // LED_GREEN_Pin HAL_Delay(1000); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 0); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ где #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) - указатель на структуру: /** * @brief General Purpose I/O */ typedef struct { __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ } GPIO_TypeDef; Из адреса: ... #define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ ... #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) ... #define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) ... Что в сумме и даёт адрес 0x40020C00, где собственно и располагается GPIO register map для GPIOD (согласно референсу RM0090 для STM32F407/417). IDE System Workbench for STM32 - бесплатна - на базе Eclipse - поддерживается ST, для скачивания нужно зарегистрироваться. Keil uVision - бесплатен до 32 кБ, плюс для L0, F0. А можно опять-таки использовать сборную солянку из тулчейна , OpenOCD и любой удобной среды. Например, при помощи QtCreator: Программируем микроконтроллеры stm32 при помощи QtCreator Разработка для STM32F4Discovery с помощью mbed в QtCreator Ручной запуск отладчика: openocd.exe -f ..\scripts\board\stm32f4discovery.cfg Чтобы QtCreator не зависал: Qt Creator -> Инструменты -> Параметры -> Отладчик -> GDB, расширенные -> Использовать асинхронный режим для работы с программой. Для прошивки при помощи ST-LINK: arm-none-eabi-objcopy.exe -Oihex c:\workspace\testqt\.build\qtc_STM32-debug\testqt.elf c:\workspace\testqt\.build\qtc_STM32-debug\testqt.hex Пример qbs-проекта для простого Blink-проекта (мигает светодиодом) testqt.qbs import qbs Product { type: "application" consoleApplication: true cpp.executableSuffix: ".elf" Depends {name: "cpp" } property string name: "testqt" property string vendor: "STM" property string model: "STM32F4DISCOVERY" property string toolchain: "ARM_GCC" property string cortex: "M4" cpp.positionIndependentCode: false cpp.debugInformation: true cpp.commonCompilerFlags: [ "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard","-mfpu=fpv4-sp-d16", "-Os","-g3","-Wall","-fmessage-length=0", "-ffunction-sections","-c","-fmessage-length=0", ] cpp.defines: [ 'USE_HAL_DRIVER', 'STM32F407xx' ] cpp.linkerFlags:[ "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "--specs=nosys.specs", "--specs=nano.specs", "-Wl,-Map=output.map", "-Wl,--gc-sections","-lm", "-T"+path+"/SW4STM32/"+name+" Configuration/STM32F407VGTx_FLASH.ld" ] cpp.includePaths: [ "Inc", "Drivers/STM32F4xx_HAL_Driver/Inc", "Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", "Drivers/CMSIS/Include", "Drivers/CMSIS/Device/ST/STM32F4xx/Include" ] files: [ "Src/*.c", "Inc/*.h", "Drivers/CMSIS/Device/ST/STM32F4xx/Include/*.h", "Drivers/CMSIS/Include/*.h", "Drivers/STM32F4xx_HAL_Driver/Inc/*.h", "Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/*.h", "Drivers/STM32F4xx_HAL_Driver/Src/*.c", "Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/*.s", "Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/*.c", "Src/main.c" ] Properties { condition: qbs.buildVariant === "debug" cpp.defines: outer.concat(["DEBUG=1"]) } Group { qbs.install: true fileTagsFilter: "application" } } Если зачем-то захочется - можно даже Arduino IDE использовать (Arduino STM32 - работает только на версии IDE 1.6.5). |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|