18. STM32. Програмування STM32F103. Remap
Чому не можна зробити такий контролер, який би мав мінімум стандартних ніг: ну, там - живлення, виводи для програматора, тощо, а решту виводів щоб можна було налаштувати як заманеться? Хочу на ногу №1, скажімо, PA6, - програмно налаштував і готово. А захочу RX порта UART1, - сказав мікроконтролеру, щоб RX порту UART1 підключив до ноги №1 і все. І так само будь-який функціонал на будь-які виводи. Це було б дуже зручно! Але це технічно досить складно. Хоча, може так статися, що у недалекому майбутньому з`явиться щось схоже. Розробники мікроконтролерів до цього потихеньку, але впевнено, йдуть. Звісно, коли з`являться такі контролери, зміняться і підходи до проектування схем і програм. Але повернімося до реалій.
Ми вже звикли до того, що до певних виводів мікроконтролера прив`язаний певний функціонал. І ми можемо вибирати, які з доступних функцій ми можемо використати. Наприклад, у нашому мікроконтролері STM32F103 ногу, яка називається PA9 можна використати як лінію порту A9 (вхід або вихід). Або використати альтернативний функціонал, такий як TX вихід послідовного порту USART1 (USART1_TX), або як другий канал першого таймеру TIM1_CH2. Та що нам робити якщо A9 вже використовується, а нам вкрай потрібний USART1_TX? У STM32 є функція REMAP.
Якщо ви заглянете у документацію, то помітите, що стовпчик Alternate functions, у якому описані альтернативні функції для виводів мікроконтролера, розбитий на два - Default і Remap. Default - альтернативний функціонал виводу за замовчанням. Remap - альтернативний функціонал виводу після виконання функції Remap.
Тобто, деякий функціонал (не весь) можна заремапити на інші виводи. Робиться це досить просто:
- Вмикаємо тактування AFIO (альтернативні функції вводу-виводу)
- Виконуємо Remap потрібного функціоналу
GPIO_Remap_SPI1 : SPI1 Alternate Function mapping
GPIO_Remap_I2C1 : I2C1 Alternate Function mapping
GPIO_Remap_USART1 : USART1 Alternate Function mapping
GPIO_Remap_USART2 : USART2 Alternate Function mapping
GPIO_PartialRemap_USART3 : USART3 Partial Alternate Function mapping
GPIO_FullRemap_USART3 : USART3 Full Alternate Function mapping
GPIO_PartialRemap_TIM1 : TIM1 Partial Alternate Function mapping
GPIO_FullRemap_TIM1 : TIM1 Full Alternate Function mapping
GPIO_PartialRemap1_TIM2 : TIM2 Partial1 Alternate Function mapping
GPIO_PartialRemap2_TIM2 : TIM2 Partial2 Alternate Function mapping
GPIO_FullRemap_TIM2 : TIM2 Full Alternate Function mapping
GPIO_PartialRemap_TIM3 : TIM3 Partial Alternate Function mapping
GPIO_FullRemap_TIM3 : TIM3 Full Alternate Function mapping
GPIO_Remap_TIM4 : TIM4 Alternate Function mapping
GPIO_Remap1_CAN1 : CAN1 Alternate Function mapping
GPIO_Remap2_CAN1 : CAN1 Alternate Function mapping
GPIO_Remap_PD01 : PD01 Alternate Function mapping
GPIO_Remap_TIM5CH4_LSI : LSI connected to TIM5 Channel4 input capture for calibration
GPIO_Remap_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping
GPIO_Remap_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping
GPIO_Remap_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping
GPIO_Remap_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping
GPIO_Remap_ETH : Ethernet remapping (only for Connectivity line devices)
GPIO_Remap_CAN2 : CAN2 remapping (only for Connectivity line devices)
GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST
GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled
GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP)
GPIO_Remap_SPI3 : SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices)
When the SPI3/I2S3 is remapped using this function, the SWJ is configured
to Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST.
GPIO_Remap_TIM2ITR1_PTP_SOF : Ethernet PTP output or USB OTG SOF (Start of Frame) connected
to TIM2 Internal Trigger 1 for calibration (only for Connectivity line devices)
If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected to
Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output.
GPIO_Remap_PTP_PPS : Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices)
GPIO_Remap_TIM15 : TIM15 Alternate Function mapping (only for Value line devices)
GPIO_Remap_TIM16 : TIM16 Alternate Function mapping (only for Value line devices)
GPIO_Remap_TIM17 : TIM17 Alternate Function mapping (only for Value line devices)
GPIO_Remap_CEC : CEC Alternate Function mapping (only for Value line devices)
GPIO_Remap_TIM1_DMA : TIM1 DMA requests mapping (only for Value line devices)
GPIO_Remap_TIM9 : TIM9 Alternate Function mapping (only for XL-density devices)
GPIO_Remap_TIM10 : TIM10 Alternate Function mapping (only for XL-density devices)
GPIO_Remap_TIM11 : TIM11 Alternate Function mapping (only for XL-density devices)
GPIO_Remap_TIM13 : TIM13 Alternate Function mapping (only for High density Value line and XL-density devices)
GPIO_Remap_TIM14 : TIM14 Alternate Function mapping (only for High density Value line and XL-density devices)
GPIO_Remap_FSMC_NADV : FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices)
GPIO_Remap_TIM67_DAC_DMA : TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices)
GPIO_Remap_TIM12 : TIM12 Alternate Function mapping (only for High density Value line devices)
GPIO_Remap_MISC : Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping,
only for High density Value line devices)
Для того, щоб зремапити USART1 виконуємо наступні команди:
// Вмикаємо тактування AFIO (альтернативні функції вводу-виводу)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// Ремапимо USART1
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
Після цього USART1_TX буде на виводі PB6, а USART1_RX на виводі PB7.
Я наведу ще один цікавий приклад. Уявімо, що нам потрібна лінія порту PB3. Ця нога використовується як JTDO. Для того, щоб використати цю ногу як PB3 треба зробити Remap таким чином:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
Ми просто відключаємо SWJ_JTAG. Якщо нам знадобиться ще і нога PB4, нам прийдеться ремапити GPIO_Remap_SWJ_NoJTRST, або взагалі GPIO_Remap_SWJ_Disable.
Тобто, ми відключаємо SWJ. Після старту програми мікроконтролера, вона зробить Remap, який вимкне SWJ. І ... програматор більше не побачить нашого контролера! Не панікуйте. Перепрограмувати контролер можна за допомогою чарівної кнопки Reset. Натисніть на платі контролера Reset, на комп’ютері запустіть прошивку мікроконтролера і швидко відпустіть Reset. Контроль буде відновлено.
Зразок використання Remap можна знайти у прикладі Example_Nokia5110.
Бажаю успіхів!
Дивись також:
- 1. STM32. Програмування STM32F103. Тестова плата. Прошивка через UART та через ST-Link
- 2. STM32. Програмування. IDE для STM32
- 3. STM32. Програмування STM32F103. GPIO
- 4. STM32. Програмування STM32F103. Тактування
- 5. STM32. Програмування STM32F103. USART
- 6. STM32. Програмування STM32F103. NVIC
- 7. STM32. Програмування STM32F103. ADC
- 8. STM32. Програмування STM32F103. DMA
- 9. STM32. Програмування STM32F103. TIMER
- 10. STM32. Програмування STM32F103. TIMER. Захоплення сигналу
- 11. STM32. Програмування STM32F103. TIMER. Encoder
- 12. STM32. Програмування STM32F103. TIMER. PWM
- 13. STM32. Програмування STM32F103. EXTI
- 14. STM32. Програмування STM32F103. RTC
- 15. STM32. Програмування STM32F103. BKP
- 16. STM32. Програмування STM32F103. Flash
- 17. STM32. Програмування STM32F103. Watchdog
- 18. STM32. Програмування STM32F103. Remap
- 19. STM32. Програмування STM32F103. I2C Master
- 20. STM32. Програмування STM32F103. I2C Slave
- 21. STM32. Програмування STM32F103. USB
- 22. STM32. Програмування STM32F103. PWR
- 23. STM32. Програмування STM32F103. Option bytes
- 24. STM32. Програмування STM32F103. Bootloader
- STM32. Скачати приклади
- System Workbench for STM32 Інсталяція на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Керування безколекторним двигуном постійного струму (BLDC) за допомогою STM32
- Керування PMSM за допомогою STM32
Чомусь не працює приклад... Немає нічого на екрані...
Дисплей відійшов від платки... День промучився, поки замітив! Дякую за приклад, все працює!
А як вивести число на екран?...
Tags
web java-script bmp280 adc bldc stm32 rs-232 programmator 3d-printer flash pwm sms motor docker raspberry-pi meteo gps ngnix bme280 timer ssd1331 mpu-6050 bkp battery rfid st-link tim mpx4115a ssd1306 encoder atmega pmsm wifi options rtc examples nvic soldering mongodb esp8266 books lcd foc flask barometer bluetooth ethernet brushless uart watchdog servo gpio solar git remap dma usart eb-500 smd nodemcu sensors displays html python capture dht11 led i2c eeprom piezo exti websocket max1674 usb dc-dc avr hih-4000 css mpu-9250
Архіви
