Kit STM32F4 Discovery bài 8: Truyền thông nối tiếp UART

0
5439

Giới thiệu chung

Vấn đề giao tiếp giữa PC với PC, giữa PC với vi điều khiển hay giữa các vi điều khiển với nhau có vai trò rất quan trọng trong các ứng dụng điều khiển, đo lường… Ghép nối qua cổng nối tiếp USART (Universal Synchronous/Asynchronous Receiver/Transmiter – Bộ thu/phát đồng bộ/không đồng bộ) là một trong những kỹ thuật được sử dụng rộng rãi để ghép nối các thiết bị ngoại vi với máy tính. Khi chỉ đề cập tới chế độ truyền không đồng bộ, ta dùng tên gọi UART.
Trong truyền thông nối tiếp, dữ liệu truyền được truyền nối tiếp nhau từng bit một trên một hay vài đường truyền. Ưu điểm của truyền thông nối tiếp là vi điều khiển có khả năng truyền-nhận nhiều dữ liệu, tiết kiệm đường IO, nhưng nhược điểm là không được nhanh như truyền song song và dễ bị mất, lỗi dữ liệu, phải có giải pháp phòng ngừa các tình huống này.

Với KIT STM32F407 có các bộ UART như sau:

Module RS232 TTL:
Chuẩn truyền thông này tương thích với RS232 của PC nếu có một thiết bị chuyển đổi điện áp để giao tiếp. Nếu máy tính bạn không có cổng COM bạn có thể sử dụng thiết bị chuyển đổi “USB to COM” hoặc “USB to USART”.
Module RS232 TTL là module dùng chuyển đổi điện áp mức logic RS232 sang điện áp có mức TTL (~5V) Thông qua IC Max232 giúp người lập trình có thể giao tiếp truyền thông giữa  máy tính với vi điều khiển.

  • IC điều khiển : MAX3232
  • Điện áp hoạt động: 3V – 5V DC
  • Dòng tiêu thụ : 6mA
  • Các chân giao tiếp UART TTL : TX, RX, GND, VCC
  • Kích thước: 33mm*32mm*16mm

Cáp chuyển đổi USB TO RS232 HL-340, USB TO RS232 PL2303:

Cổng COM1 trên bo mạch STM32F4-BB: đây chính là cổng USART6 trên vi điều khiển STM32F4Discovery.

Code ví dụ

Kit STM32F4 Discovery kết nối UART1:

Chú ý ghép nối: TX-RX,RX-TX ,GND-GND

PA9->RX
PA10->TX
GND->GND
Board chuyển đổi có thể dùng module PL2303,CH340…

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_usart.h"
#include "misc.h"

void GPIO_Config(void);
void USART_Config(void);
void USART6_Puts(char * str);
void NVIC_Config(void);
void Delay(uint32_t nCount);

void main()
{
	SystemInit(); // Initialize the Embedded Flash Interface, the PLL and update the System Frequency
	GPIO_Config();
	USART_Config();
	NVIC_Config();

	// Gui di chuoi "Hello World"
	USART6_Puts("Hello World!\n");

	while (1)
	{
		// Bat den LED o chan 12 cong D de bao hieu truyen du lieu
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
		Delay(0xFFFFFF);
	}

}
/*************************************************
Function: void GPIO_Config(void)
Description: Configure GPIOD to use LEDs
Input:
Output:
Return:
 *************************************************/
void GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	/* Ket noi GPIOD voi clock va bat clock */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	/* Khoi tao cong D la output, chuan bi xuat du lieu ra chan 12 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

	/* Goi ham khoi tao cong */
	GPIO_Init(GPIOD, &GPIO_InitStructure);

}
/*************************************************
Function: void USART_Config(void)
Description: Configure USART6 for serial communication
Input:
Output:
Return:
 *************************************************/
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

	// Lien ket PC6 va PC7 voi TX va RX cua USART6
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);

	// Cau hinh PC6 la chan TX, PC7 la chan RX cua USART6
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
	// Thiet lap che do lam viec cua cong la Alternate Function (AF)
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);

	/*Thiet lap cac tham so truyen thong cho USART6*/
	// Thiet lap hinh mac dinh
	USART_StructInit(&USART_InitStructure);
	// BaudRate = 115,2 kbits/s
	USART_InitStructure.USART_BaudRate =115200;
	// Data bits = 8
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// Stop bits = 1
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// Parity = none
	USART_InitStructure.USART_Parity = USART_Parity_No;
	// Handshaking = none
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// Cho phep truyen va nhan du lieu
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART6, &USART_InitStructure);

	USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); // Cho phep ngat xay ra doi voi USART6
	USART_Cmd(USART6, ENABLE); // Enable USART6
}
void NVIC_Config()
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    // Thiet lap nhom uu tien cho ngat la 1
	NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;  // Kenh ngat la USART6_IRQn
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Muc uu tien ngat bang 0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // Thiet lap SubPriority cua ngat bang 0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    // Xac lap kenh ngat
	NVIC_Init(&NVIC_InitStructure);
}
/*************************************************
Function: void USART6_Puts(char * str)
Description: USART6 Put string
Input: A string
Output:
Return:
 *************************************************/
void USART6_Puts(char * str)
{
	while (*str)
	{
		USART_SendData(USART6, *str++);

		/* Loop until the end of transmission */
		// Reference manual: when TXE is set, a frame of data transmission is completed
		while (USART_GetFlagStatus(USART6, USART_FLAG_TXE) == RESET);
	}
}
/*************************************************
Function: void Delay(uint32_t nCount)
Description: Delay for a while
Input: Unsigned int number - Number of loops
Output:
Return:
 *************************************************/

void Delay(uint32_t nCount)
{
	while (nCount--);
}

/*************************************************
Function: void USART6_IRQHandler(void)
Description: USART6 Interrupt request handler
Input:
Output:
Return:
 *************************************************/
void USART6_IRQHandler(void)
{
	// Neu xay ra ngat USART6
	if (USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
	{
		// Nhan du lieu ve va gui di ngay
		USART_SendData(USART6, USART_ReceiveData(USART6));

		// Tat den LED o chan 12 cong D de bao hieu ket thuc truyen du lieu
		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
	}
}

Các phần mềm gửi/nhận dữ liệu UART trên máy tính

Hercules:

Terminal:

Realterm:

LEAVE A REPLY

Please enter your comment!
Please enter your name here