DIY-ELECTRIC
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

tìm hiểu về UART

Go down

tìm hiểu về UART Empty tìm hiểu về UART

Bài gửi by Admin Thu Apr 18, 2019 3:22 pm

UART là một thiết bị có chức năng chuyển đổi chuỗi bít song song (thường được nhóm trong 1 bye) sang luồng tín hiệu liên tục truyền trền 1 dây duy nhất.
Để truyền nhận được, thì bên phát và bên thu phải cùng tốc độ.
tìm hiểu về UART Untitl11
transmiter và receiver dùng chung 1 clock.

tìm hiểu về UART Untitl12
sự khác biệt giữa UART và USART


Admin
Admin

Tổng số bài gửi : 12
Join date : 24/03/2019

https://dientu4u.forumvi.com

Về Đầu Trang Go down

tìm hiểu về UART Empty Re: tìm hiểu về UART

Bài gửi by Admin Fri Apr 19, 2019 5:01 pm

CubeHAL dành riêng API để quản lý các giao tiếp UART và USART. Tất cả các hàm và điều khiển theo ngôn ngữ C được sử dụng để xử lý USART bắt đầu từ tiền tố HAL_USART và được chứa trong các file stm32xxx_hal_usart.{c,h}, trong khi các hàm và cấu trúc điều khiển C liên quan đến quản lý các UART sẽ bắt đầu với tiền tố HAL_UART và nằm trong các file HAL_UART. Vì cả 2 mô đun là đồng nhất với nhau về mặt khái niệm, và vì UART là dạng thông dụng nhất về truyền thông nối tiếp giữa các mô đun khác nhau, nên quyển sách này chỉ bao gồm các đặc tính của mô đun HAL_UART.
8.2 Khởi tạo UART
Giống như tất cả các ngoại vi của STM32, thâm chí các USART được án xạ vào bộ nhớ được xác định vởi miền ngoại vi bắt đầu từ địa chỉ 0x4000 0000. CubeHAL lấy vị trí của mỗi UART cho một STM32 nhất định nhờ vào bộ mô tả USART_TypeDef. Ví dụ, chúng ta có thể sử dụng đơn giản macro USART2 để tham chiếu đến ngoại vi USART được hỗ trợ bởi tất cả các bộ vi điều khiển STM32 với LQFP64 package.
Tuy nhiên, tất cả các hàm HAL liên quan đến quản lý UART được thiết kế sao cho tham số đầu tiên mà chúng nhận là một thể hiện (Instance) của cấu trúc C UART_HandleTypeDef, được định nghĩa như sau:
typedef struct {
USART_TypeDef *Instance; /* UART registers base address */
UART_InitTypeDef Init; /* UART communication parameters */
UART_AdvFeatureInitTypeDef AdvancedInit; /* UART Advanced Features initialization
parameters */
uint8_t *pTxBuffPtr; /* Pointer to UART Tx transfer Buffer */
uint16_t TxXferSize; /* UART Tx Transfer size */
uint16_t TxXferCount; /* UART Tx Transfer Counter */
uint8_t *pRxBuffPtr; /* Pointer to UART Rx transfer Buffer */
uint16_t RxXferSize; /* UART Rx Transfer size */
uint16_t RxXferCount; /* UART Rx Transfer Counter */
DMA_HandleTypeDef *hdmatx; /* UART Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* UART Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_UART_StateTypeDef State; /* UART communication state */
__IO HAL_UART_ErrorTypeDef ErrorCode; /* UART Error code */
} UART_HandleTypeDef;

Chúng ta hãy tìm hiểu chi tiết các trường quan trọng của cấu trúc này:
Instance: Là con trỏ đến bộ mô tả USART mà chúng đa sẽ sử dụng. Ví dụ, USART2 là mô tả của UART liên kết đến giao tiếp ST_LINK của các boar Nucleo.
Init: là một thể hiển của cấu trúc UART_InitTypeDef, được sử dụng để cấu hình giao tiếp UART. Chúng ta sẽ nghiên cứu sâu hơn ở thời gian tới.
AdvancedInit: trường này được dùng để cấu hính các đặc tính cao cấp hơn của UART như tự động phát hiện Baudrate và hoán đổi chân Tx/Rx. Một số HALs không hỗ trợ trường bổ sung này. Điều này là vì giao tiếp USART là không giống nhau cho tất cả các MCU STM32. Điều này rất quan trọng cho việc chọn đúng loại MCU cho ứng dụng của bạn. Việc phân tích trương này nằm ngoài mục đích của cuốn sách này.
pTxBuffPtr and pRxBuffPtr:

Admin
Admin

Tổng số bài gửi : 12
Join date : 24/03/2019

https://dientu4u.forumvi.com

Về Đầu Trang Go down

tìm hiểu về UART Empty Re: tìm hiểu về UART

Bài gửi by Admin Fri Apr 19, 2019 5:01 pm

CubeHAL dành riêng API để quản lý các giao tiếp UART và USART. Tất cả các hàm và điều khiển theo ngôn ngữ C được sử dụng để xử lý USART bắt đầu từ tiền tố HAL_USART và được chứa trong các file stm32xxx_hal_usart.{c,h}, trong khi các hàm và cấu trúc điều khiển C liên quan đến quản lý các UART sẽ bắt đầu với tiền tố HAL_UART và nằm trong các file HAL_UART. Vì cả 2 mô đun là đồng nhất với nhau về mặt khái niệm, và vì UART là dạng thông dụng nhất về truyền thông nối tiếp giữa các mô đun khác nhau, nên quyển sách này chỉ bao gồm các đặc tính của mô đun HAL_UART.
8.2 Khởi tạo UART
Giống như tất cả các ngoại vi của STM32, thâm chí các USART được án xạ vào bộ nhớ được xác định vởi miền ngoại vi bắt đầu từ địa chỉ 0x4000 0000. CubeHAL lấy vị trí của mỗi UART cho một STM32 nhất định nhờ vào bộ mô tả USART_TypeDef. Ví dụ, chúng ta có thể sử dụng đơn giản macro USART2 để tham chiếu đến ngoại vi USART được hỗ trợ bởi tất cả các bộ vi điều khiển STM32 với LQFP64 package.
Tuy nhiên, tất cả các hàm HAL liên quan đến quản lý UART được thiết kế sao cho tham số đầu tiên mà chúng nhận là một thể hiện (Instance) của cấu trúc C UART_HandleTypeDef, được định nghĩa như sau:
typedef struct {
USART_TypeDef *Instance; /* UART registers base address */
UART_InitTypeDef Init; /* UART communication parameters */
UART_AdvFeatureInitTypeDef AdvancedInit; /* UART Advanced Features initialization
parameters */
uint8_t *pTxBuffPtr; /* Pointer to UART Tx transfer Buffer */
uint16_t TxXferSize; /* UART Tx Transfer size */
uint16_t TxXferCount; /* UART Tx Transfer Counter */
uint8_t *pRxBuffPtr; /* Pointer to UART Rx transfer Buffer */
uint16_t RxXferSize; /* UART Rx Transfer size */
uint16_t RxXferCount; /* UART Rx Transfer Counter */
DMA_HandleTypeDef *hdmatx; /* UART Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* UART Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_UART_StateTypeDef State; /* UART communication state */
__IO HAL_UART_ErrorTypeDef ErrorCode; /* UART Error code */
} UART_HandleTypeDef;

Chúng ta hãy tìm hiểu chi tiết các trường quan trọng của cấu trúc này:
Instance:  Là con trỏ đến bộ mô tả USART mà chúng đa sẽ sử dụng. Ví dụ, USART2 là mô tả của UART liên kết đến giao tiếp ST_LINK của các boar Nucleo.
Init: là một thể hiển của cấu trúc UART_InitTypeDef, được sử dụng để cấu hình giao tiếp UART. Chúng ta sẽ nghiên cứu sâu hơn ở thời gian tới.
AdvancedInit: trường này được dùng để cấu hính các đặc tính cao cấp hơn của UART như tự động phát hiện Baudrate và hoán đổi chân Tx/Rx. Một số HALs không hỗ trợ trường bổ sung này.  Điều này là vì giao tiếp USART là không giống nhau cho tất cả các MCU STM32.  Điều này rất quan trọng cho việc chọn đúng loại MCU cho ứng dụng của bạn.  Việc phân tích trương này nằm ngoài mục đích của cuốn sách này.
pTxBuffPtr and pRxBuffPtr:

Admin
Admin

Tổng số bài gửi : 12
Join date : 24/03/2019

https://dientu4u.forumvi.com

Về Đầu Trang Go down

tìm hiểu về UART Empty Re: tìm hiểu về UART

Bài gửi by Admin Sat Apr 20, 2019 1:23 am

pTxBuffPtr and pRxBuffPtr: Các trường này trỏ đến bộ đệm phát và thu. Chúng được sử dụng là nguồn để truyền TxXferSize trên UART và nhận RxXferSize khi UART được cấu hình ở chế độ Full Duplex. TxXferCount và RxXfercount được sử dụng nội bộ bởi HAL để tính số byte đã phát và thu được.
• Lock: Trường này được dùng bên trong bởi HAL để khóa các truy cập động thời đến giao tiếp UART.
Như đã nói ở trên. Trường Lock được sử dụng để tuân thủ các truy cập đồng thời trong hầu hết tất cả các thủ tục HAL.
Nếu bạn lưu tâm về code HAL. Bạn có thể nhân ra một vài trường hợp dung macro __HAL_LOCK(), nó được định nghĩa theo cách như sau:

#define __HAL_LOCK(__HANDLE__) \
do{ \
if((__HANDLE__)->Lock == HAL_LOCKED) \
{ \
return HAL_BUSY; \
} \
else \
{ \
(__HANDLE__)->Lock = HAL_LOCKED; \
} \
}while (0)

Cũng không hiểu vì sao các kỹ sư ở ST quyết định quan tâm đến các truy cập đồng thời đến các thủ tục HAL. Có thể ho muốn một phương pháp an toàn luồng (thread safe) nhằm tránh cho nhà phát triển ứn dụng khỏi trách nhiệm quản lý đa truy cập vào cùng một giao diện phần cứng trong trường hợp đa luồng đang thực thi trên cùng 1 ứng dụng.
……..
Tất cả các kích hoạt cấu hình UART được thực hiện bằng cách sử dụng một thể hiện của cấu trúc khởi tạo UART UART_InitTypedef, được định nghĩa như sau:
typedef struct {
uint32_t BaudRate;
uint32_t WordLength;
uint32_t StopBits;
uint32_t Parity;
uint32_t Mode;
uint32_t HwFlowCtl;
uint32_t OverSampling;
} UART_InitTypeDef;

BaudRate: Tham số này tham chiếu đến tốc độ của kết nối, được mô tả theo dạng số bít truyền trong 1 giây. Mặc dù tham số này có thể nhận các giá trị tùy ý, nhưng thông thường Baudrate nhận một số giá trị tiêu chuẩn hay dùng.
WordLength: Chỉ ra số bit dữ liệu được phát hoặc thu trong 1 khung. Trường này nhận 8 hoặc 9 bít dữ liệu, ko bao gồm các bít Start và Stop.
Mode: chỉ ra chế độ truyền hay nhận. các giá trị nhân được
UART_MODE_RX UART: được cấu hình chỉ để nhận dữ liệu.
UART_MODE_TX: Chỉ phát
UART_MODE_TX_RX: Cả thu lẫn phát.

• HwFlowCtl: Chỉ ra rằng chế độ điều khiển luồng có được cho phép hay không
UART_HWCONTROL_NONE : cấm điều khiển luồng
UART_HWCONTROL_RTS:Cho phép tín hiệu RTS.
UART_HWCONTROL_CTS: Cho phép CTS
UART_HWCONTROL_RTS_CTS: cho phép cả RTS và CTS.
OverSampling: Khi UART thu một khung từ một UART khác từ xa, nó sẽ lấy mẫu các tín hiệu để xác định giá trị bít 1 hay không trong tin nhắn. Oversampling là kỹ thuật lấy mẫu có tần số lấy mẫu lơn hơn đáng kể tốc độ Nyqist. Bộ thu thực hiện kỹ thuật oversampling theo cấu hình của người dùng (ngoại trừ chế độ đồng bộ) để phục hồi dữ liệu bằng cách phân biệt dữ liệu đến và nhiễu tạp. Trường OverSampling có thể nhận giá trị UART_OVERSAMPLING_16 để thực hiện 16 lần lấy mẫu cho mỗi bít hoặc UART_OVERSAMPLING_8 để thực hiện 8 lần lấy mẫu.

Admin
Admin

Tổng số bài gửi : 12
Join date : 24/03/2019

https://dientu4u.forumvi.com

Về Đầu Trang Go down

tìm hiểu về UART Empty Re: tìm hiểu về UART

Bài gửi by Admin Sat Apr 20, 2019 1:59 am

Tiếp theo chúng ta xem xét đoạn code

int main(void) {
UART_HandleTypeDef huart2;
/* Khởi tạo HAL */
HAL_Init();
/* Cấu hình Clock hệ thống*/
SystemClock_Config();
/* Cấu hình cho USART2 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 38400;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart2);
...
}

Bước đầu tiên là cấu hình cho USART. Ở đây chung ta đang sử dụng cấu hình 38400,N,1. Có nghĩa là Baurate = 38400 Bps, không Parity, 1 bít Stop. Cấm điều khiển luồng, mức lấy mẫu cao nhất (16 lần). Lệnh gọi hàm HAL_UART_Init() sẽ khởi tạo USART2 ứng với các tham số đã chọn.
Tuy nhiên, đoạn code trên vẫn chưa đủ để trao đổi dữ liệu. Chúng ta còn phải cấu hình các chân Tx và Rx.

Admin
Admin

Tổng số bài gửi : 12
Join date : 24/03/2019

https://dientu4u.forumvi.com

Về Đầu Trang Go down

tìm hiểu về UART Empty Re: tìm hiểu về UART

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết