STM32F051 매뉴얼을 읽으면 두 개의 핀에서 동일한 대체 기능을 구성 할 수있는 것처럼 보입니다. 예를 들어 동시에 여러 USART1_TX 핀을 가질 수 있습니다. 또는 예를 들어 2 개의 USART_RX 핀이 더 문제가되는 경우입니다. 이 경우 매뉴얼은 자동입니다. 이것이 합법적인가요? 이것이 유용한가요?
STM32F051 매뉴얼을 읽으면 두 개의 핀에서 동일한 대체 기능을 구성 할 수있는 것처럼 보입니다. 예를 들어 동시에 여러 USART1_TX 핀을 가질 수 있습니다. 또는 예를 들어 2 개의 USART_RX 핀이 더 문제가되는 경우입니다. 이 경우 매뉴얼은 자동입니다. 이것이 합법적인가요? 이것이 유용한가요?
답변:
핀당 레지스터를 사용하여 I / O 기능을 선택하는 프로세서에서는 일반적으로 출력 기능을 충돌없이 여러 핀으로 라우팅 할 수 있습니다. 모든 핀은 동일한 출력을 에코합니다. 입력에 여러 핀을 연결 한 결과는 종종 불특정입니다. 예를 들어 UART에 I / O 핀 3과 4가 UART에 연결되어 있으면 UART가 핀 3과 4를 입력으로 사용하는 "AND"게이트에 연결된 것처럼 작동하거나 마치 연결된 것처럼 작동 할 수 있습니다 한 핀에 연결하고 다른 핀을 무시하거나 중간 정도의 저항을 가진 트랜지스터를 통해 두 핀을 UART의 입력 버퍼에 연결하거나 핀 3이 높고 4가 낮거나 그 반대 인 경우 추가 전류를 끌어 올릴 수 있습니다. 상상할 수있는 다른 일을 할 수도 있습니다. 나는
일부 Microchip 부품 (아마도 일부 STM 부품)에 사용되는 다소 더 나은 설계 방식은 각 I / O 기능에 입력을 받아 들여야하는 핀을 선택하는 멀티플렉서와 I를 표시하는 멀티플렉서를 포함하는 멀티플렉서를 포함시키는 것입니다. 데이터를 출력해야하는 / O 기능. 이러한 설계를 통해 하나의 핀 피드로 여러 I / O 기능을 제공하는 동시에 충돌하는 구성으로 인한 모호성을 제거 할 수 있습니다.
예, 유용합니다. STM32F407VGT6 실험 결과 : 적어도이 핀을 AF 입력으로 사용하는 경우 두 AF 핀을 동시에 AF로 사용할 수 있습니다. 실험은 외부 트리거-신호 "TIM1_ETR"의 상승 에지에서 TIM1을 트리거하는 것입니다. "TIM1_ETR"신호는 MCU 패키지의 핀 PE7 및 / 또는 PA12에 매핑 될 수 있습니다.
실험 : TIM1에 대해 핀 PE7 및 PA12를 AF "TIM1_ETR"로 초기화합니다.
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // configure PE7 as AF
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // configure PA12 as AF
}
결과-TIM1은 핀 PE7 또는 PA12에서 상승 에지로 시작됩니다.
그러면 런타임에서 AF 핀을 MUX (변경)하는 방법이 나타납니다.
main
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
// Deactivate PA12 input (set as regular input):
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// select PE7 as a trigger source,
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
// Arm the timer
arm_tim1();
/* Now timer will be started by rising edge only on PE7 */
// ... later one can select PA12 as trigger source. Deactivate PE7 (set as regular input):
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
// Activate PA12
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Arm the timer
arm_tim1();
/* timer will be started by rising edge only on PA12 */
}
이것은 타이머 트리거링에 두 가지 소스가 필요하므로 도움이 될 수 있습니다. 포스트의 시작 부분에 표시된 것처럼 초기화되면 두 입력을 동시에 사용할 수 있습니다. 입력이 서로 연결되어 있지 않습니다. PA12의 신호가 PE7로 전송되지 않으며 그 반대도 마찬가지입니다 (GPIO가 입력으로 설정되어 있기 때문).
코드는 "STM32CubeF4 v5.3"+ "펌웨어 패키지 V1.24.0 / 2019 년 2 월 08 일"에 의해 생성됩니다.
기본적으로 핀은 대체 기능 (예 : UART_RX)에 할당 할 수있는 GPIO입니다. 모든 대체 기능에는 기본 핀과 기능을 다시 매핑 할 수있는 대체 핀이 있습니다. 9.1.5 절 에서 STM32F103 의 참조 매뉴얼 을 확인하면 다음 과 같이 말합니다.
여러 장치 패키지에 대한 주변 장치 I / O 기능의 수를 최적화하기 위해 일부 대체 기능을 다른 핀에 다시 매핑 할 수 있습니다. 소프트웨어에 의해 해당 레지스터를 프로그래밍하여 달성합니다 (177 페이지의 AFIO 레지스터 참조).이 경우 대체 기능은 더 이상 원래 할당에 매핑되지 않습니다 .