Bài 07: GIAO TIẾP UART VỚI STM32

posted in: Vi điều khiển | 0

1. Giới thiệu về UART

Universal Asynchronous Reciver/Transmister (UART) là chuẩn giao tiếp không đồng bộ cho vi điều khiển và các ngoại vi khác.

UART là chuẩn giao tiếp điểm với điểm, tức là trong mạng chỉ có một thiết bị giữ vai trò Transmister và một thiết bị đóng vai trò Reciver. العاب كازينو مجانية

UART là giao thức truyền thông không đồng bộ, nghĩa là không có xung nhịp chung, các thiết bị có thể hiểu được nhau thông qua việc thiết lập các tham số giống nhau. موقع 1xbet

UART là truyền thông song công(Full duplex) nghĩa là tại một thời điểm có thể truyền và nhận đồng thời. موقع مراهنات عربي

Định dạng khung truyền:

  • Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt buộcphải có trong khung truyền, nó là một bit thấp (0).
  • Data hay dữ liệu cần truyền. Bit có trọng số nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có trọng số lớn nhất (MSB – Most Significant Bit, bit bên trái)
  • Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số “1” trong parity lẻ luôn là số lẻ. Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền.
  • Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Stop bits là các bit bắt buộc, bit cao (1).

STM32F103C8 có 3 bộ UART với nhiều mode hoạt động, với nhiều bộ UART ta có thể sử dụng được nhiều ứng dụng truyền nhận khác nhau.

Trong bài này, mình sẽ phần mềm Hercules Terminal và moduel CP2102 USB 2.0 để truyền tín hiệu từ máy tính điều khiển led trên board Blue Pill.




2. Cấu hình UART với thư viện ST

  • Hàm thiết lập tham số cho UART trong file uart.c
void USARTx_Init(USART_TypeDef* USARTx, USART_PinsPack_t pinspack, uint32_t baudrate) {

	USART_InitTypeDef 	USART_InitStruct;
	NVIC_InitTypeDef	NVIC_InitStruct;


	USART_InitStruct.USART_BaudRate = baudrate;
	
#ifdef USE_USART1
	if (USARTx == USART1) {
	USART1_InitPins(pinspack);
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
		
	USART_InitStruct.USART_HardwareFlowControl =                      USART1_HARDWARE_FLOW_CONTROL;
	USART_InitStruct.USART_Mode = USART1_MODE;
	USART_InitStruct.USART_Parity = USART1_PARITY;
	USART_InitStruct.USART_StopBits = USART1_STOP_BITS;
	USART_InitStruct.USART_WordLength = USART1_WORD_LENGTH;
	}
#endif
#ifdef USE_USART2
	if (USARTx == USART2) {
	USART2_InitPins(pinspack);
	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;

	USART_InitStruct.USART_HardwareFlowControl = USART2_HARDWARE_FLOW_CONTROL;
	USART_InitStruct.USART_Mode = USART2_MODE;
	USART_InitStruct.USART_Parity = USART2_PARITY;
	USART_InitStruct.USART_StopBits = USART2_STOP_BITS;
	USART_InitStruct.USART_WordLength = USART2_WORD_LENGTH;
	}
#endif
#ifdef USE_USART3
	if (USARTx == USART3) {
	USART3_InitPins(pinspack);
	NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;
	USART_InitStruct.USART_HardwareFlowControl = USART3_HARDWARE_FLOW_CONTROL;
	USART_InitStruct.USART_Mode = USART3_MODE;
	USART_InitStruct.USART_Parity = USART3_PARITY;
	USART_InitStruct.USART_StopBits = USART3_STOP_BITS;
	USART_InitStruct.USART_WordLength = USART3_WORD_LENGTH;
	}
#endif
	/* Disable */
	USART_Cmd(USARTx, DISABLE);
	/* Deinit first */
	USART_DeInit(USARTx);
	
	/* Init */
	USART_Init(USARTx, &USART_InitStruct);
	/* Enable */
	USART_Cmd(USARTx, ENABLE);
	
	/* Enable RX interrupt */
	USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);

	 /* Initialize NVIC*/
	 
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = USART_NVIC_PRIORITY;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority =                       USART_INT_GetSubPriority(USARTx);
	NVIC_Init(&NVIC_InitStruct);
}
  • Hàm nhận ký tự truyền tới trong file uart.c
uint8_t USART_Getc(USART_TypeDef* USARTx) {
	int8_t c = 0;
	USART_t* u = USART_INT_GetUsart(USARTx);
	
	/* Check if we have any data in buffer */
	if (u->Num > 0) {
		if (u->Out == u->Size) {
			u->Out = 0;
		}
		c = *(u->Buffer + u->Out);
		u->Out++;
		u->Num--;
	}
	return c;
}
  • Chương trình chính trong hàm main.c
 
 int main(void)
 {	
  u8 c=0;

    /* cau hình PC13 output */
   pinMode(PC13,OUTPUT);
   /* Cau hình UART 1*/
   USARTx_Init(USART1, Pins_PA9PA10, 115200);
  /* Bat Led*/		
  digitalWrite(PC13,LOW);
  while(1)
	{
         /* Gan ky tu nhan duoc cho c */
         c=USART_Getc(USART1);
  	 if(c == '1') 
	 {
	 digitalWrite(PC13,LOW);
	 }
	 else if (c == '0')
	 {
	 digitalWrite(PC13,HIGH);
	 }
        }
 }

Link code mẫu

Trả lời

Email của bạn sẽ không được hiển thị công khai.