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
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви
