기술나눔

STM32 직렬 포트 작동 원리

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

STM32 직렬 포트는 매우 풍부하고 강력한 기능을 가지고 있습니다. 분수 전송 속도 생성기와 함께 최대 5개의 직렬 포트를 제공할 수 있으며, 단일 회선 광 통신 및 반이중 단일 회선 통신을 지원하고, LIN, 스마트 카드 프로토콜 및 IrDA SIRENDEC 사양(직렬 포트 3에서만 지원됨), DMA를 지원합니다. , 등.

직렬 포트의 가장 기본적인 설정은 전송 속도 설정입니다. STM32 직렬 포트는 직렬 포트 클럭을 켜고 해당 IO 포트의 모드를 설정한 다음 전송 속도, 데이터 비트 길이, 패리티 비트 및 기타 정보를 구성하는 한 사용이 매우 간단합니다. 그것. 아래에서는 시리얼 포트의 기본 구성과 직접적으로 관련된 레지스터들을 간략하게 소개하겠습니다.

1. 직렬 포트 클럭을 활성화합니다. STM32의 주변 장치로서 직렬 포트의 클럭은 주변 장치 항상 활성화 레지스터에 의해 제어됩니다. 여기서 사용하는 직렬 포트 1은 APB2ENR 레지스터의 비트 14입니다. APB2ENR 레지스터의 직렬 포트 1의 클럭 활성화를 제외하고 다른 직렬 포트의 클럭 활성화 비트는 모두 APB1ENR에 있습니다.

2. 직렬 포트 재설정 . 주변기기에 이상이 발생하면 리셋 레지스터의 해당 비트를 설정하여 주변기기를 리셋한 후 다시 작동하도록 주변기기를 재구성할 수 있습니다.일반적으로 시스템이 주변 장치를 처음 구성할 때 가장 먼저 주변 장치를 구성합니다.
이 주변 장치를 재설정하는 작업을 수행하십시오. 직렬 포트 1의 재설정은 APB2RSTR 레지스터의 비트 14를 구성하여 수행됩니다.

3. 직렬 포트 전송 속도 설정. 각 직렬 포트에는 자체적인 독립적인 전송 속도 레지스터 USART BRR이 있습니다. 이 레지스터를 설정하면 다양한 전송 속도를 구성할 수 있습니다. 이 레지스터의 비트 설명은 다음과 같습니다.

 

4. 직렬 포트 제어. STM32의 각 직렬 포트에는 3개의 제어 레지스터 USART CR1~3이 있습니다. 직렬 포트의 많은 구성은 이 3개의 레지스터를 통해 설정됩니다.

5. 데이터 전송 및 수신. STM32의 송수신은 데이터 레지스터 USART _DR을 통해 실현됩니다. 이는 TDR 및 RDR을 포함하는 이중 레지스터입니다. 이 레지스터에 데이터를 쓰면 직렬 포트가 데이터를 수신할 때 자동으로 보냅니다.
시간이 지나면 이 레지스터에도 저장됩니다.

32비트 레지스터임에도 불구하고 하위 9비트(DR[8:0])만 사용되고 나머지는 예약되어 있는 것을 알 수 있다. DR[8:0]은 전송 또는 수신된 데이터를 포함하는 직렬 포트 데이터입니다. 송신용(TDR) 레지스터와 수신용(RDR) 레지스터 2개로 구성되어 있어 읽기와 쓰기 기능을 모두 갖고 있습니다. TDR 레지스터는 내부 버스와 출력 시프트 레지스터 사이에 병렬 인터페이스를 제공합니다. RDR 레지스터는 입력 시프트 레지스터와 내부 버스 사이에 병렬 인터페이스를 제공합니다.

체크 비트를 활성화하여(USART CR1 PCE 비트가 설정됨) 전송할 때 MSB(MSB는 데이터 길이에 따라 7번째 또는 8번째 비트임)에 기록된 값은 후속 체크 비트 대체에 의해 수정됩니다. 수신을 위해 패리티 비트가 활성화된 경우 읽은 MSB 비트는 수신된 패리티 비트입니다.

6. 직렬 포트의 상태는 상태 레지스터 USART SR을 통해 읽을 수 있습니다.

여기서는 두 비트, 즉 비트 5와 6 RXNE 및 TC에 중점을 둡니다.
RXNE(읽기 데이터 레지스터가 비어 있지 않음), 이 비트가 1로 설정되면 데이터가 수신되었으며 읽을 수 있음을 나타냅니다. 이때 우리가 해야 할 일은 가능한 한 빨리 USART DR을 읽는 것입니다. USART DR을 읽으면 이 비트를 클리어할 수도 있고, 이 비트에 0을 써서 직접 클리어할 수도 있습니다.
TC(전송 완료), 이 비트가 설정되면 USARTDR에 있는 데이터가 전송되었음을 의미합니다. 이 비트에 대한 인터럽트가 설정되면 인터럽트가 생성됩니다. 이 비트에는 두 가지 지우기 방법도 있습니다. 1: USART SR 읽기 및 USARTDR 쓰기. 2: 이 비트에 직접 0을 씁니다.

  1. void uart_init(u32 pclk2,u32 bound)
  2. {
  3. float temp;
  4. u16 mantissar
  5. u16 fraction;
  6. temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
  7. mantissa=temp;//得到整数部分
  8. fraction=(temp-mantissa)*16://得到小数部分
  9. mantissa<<=4;
  10. mantissa+=fraction;
  11. RCC->APB2ENRI=1<<2;//使能PORTA口时钟
  12. RCC->APB2ENRI=1<<14;//使能串口时钟
  13. GPIOA->CRH&=0XFFFFF00F;
  14. GPIOA->CRH|=0X000008B0;//IO状态设置
  15. RCC->APB2RSTRI=1<<14;//复位串口1
  16. RCC->APB2RSTR&=~(1<<14)://停止复位
  17. //波特率设置
  18. USART1->BRR=mantissa;//波特率设置
  19. USART1->CR1|=0X200C;//1位停止,无校验位,
  20. USART1->CR1|=1<<8;//PE中断使能
  21. USART1->CR11=1<<5;//接收缓冲区非空中断使能
  22. MY_NVIC_Init(3,3,USART1 IRQChannel,2);//组2,最低优先级
  23. }

직렬 포트 하드웨어 장치를 초기화하고 인터럽트를 활성화합니다.

구성 단계:

(1) GPI0과 USART1의 클럭을 켭니다.
(2) 두 USART1 핀의 GPI0 모드를 설정합니다.
(3) USART1 데이터 형식, 전송 속도 및 기타 매개변수를 구성합니다.
(4) USART1 수신 인터럽트 기능 활성화
(5) 마지막으로 USART1 기능을 활성화합니다.