сайт для палких паяльників

Почему нельзя сделать такой контроллер, который имел бы минимум стандартных ног: ну, там – питание, выводы для программатора и т.д., а остальные выводы чтобы можно было настроить как угодно? Хочу на ногу №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.

stm32_remap

То есть, некоторый функционал (не весь) можно заремапить на другие выводы. Делается это довольно просто:

  • Включаем тактирования AFIO (альтернативные функции ввода-вывода)
  • Выполняем Remap нужного функционала

Все, что можно зремапиты описано в файле stm32f10x_gpio.c:

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.

Желаю успехов!

Смотри также:

Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна