Cấu trúc dữ liệu HAL
Trang 1 trong tổng số 1 trang
Cấu trúc dữ liệu HAL
mỗi bộ điều khiển HAL gồm các cấu trúc dữ liệu sau:
- Peripheral handle structures : cấu trúc điều khiển ngoại vi
- Initialization and configuration structures: Cấu trúc cấu hình và khởi tạo
- Specific process structures: Cấu trúc xử lý cụ thể
- Peripheral handle structures : cấu trúc điều khiển ngoại vi
- Initialization and configuration structures: Cấu trúc cấu hình và khởi tạo
- Specific process structures: Cấu trúc xử lý cụ thể
Re: Cấu trúc dữ liệu HAL
1. Cấu trúc điều khiển ngoại vi (Peripheral handle structures)
PPP_HandleTypeDef *handle là cấu trúc chính được thực thi trong HAL driver. Nó sẽ xử lý cấu hình và các thanh ghi, và nhúng các cấu trúc, biến cần thiết để thỏa mãn yêu cầu hoạt động của ngoại vi.
Cấu trúc xử lý ngoại vi thực hiện các mục đích sau:
- Hỗ trợ đa thể hiện(Multi-Instance): Mỗi một thể hiện (instance) của ngoại vi/mô đun có cách điều khiển của riêng nó. Hay nói một cách khác, các thể hiện của các ngoại vi là độc lập nhau.
- Giao tiếp xử lý ngoại vi (Peripheral process intercommunication): cấu trúc điều khiển ngoại vi được sử dụng để quản lý các nguồn tài nguyên dữ liệu được chia sẻ giữa các thủ tục xử lý. ví dụ như con trỏ toàn cục (global poiter) và các DMA.
- Lưu trữ (Storage) : Các cấu trúc điều khiển ngoại vi cũng quản lý các biến toàn cục bên trong một bộ điều khiển HAL nhất định.
ví dụ về cấu trục điều khiển ngoại vi như sau:
PPP_HandleTypeDef *handle là cấu trúc chính được thực thi trong HAL driver. Nó sẽ xử lý cấu hình và các thanh ghi, và nhúng các cấu trúc, biến cần thiết để thỏa mãn yêu cầu hoạt động của ngoại vi.
Cấu trúc xử lý ngoại vi thực hiện các mục đích sau:
- Hỗ trợ đa thể hiện(Multi-Instance): Mỗi một thể hiện (instance) của ngoại vi/mô đun có cách điều khiển của riêng nó. Hay nói một cách khác, các thể hiện của các ngoại vi là độc lập nhau.
- Giao tiếp xử lý ngoại vi (Peripheral process intercommunication): cấu trúc điều khiển ngoại vi được sử dụng để quản lý các nguồn tài nguyên dữ liệu được chia sẻ giữa các thủ tục xử lý. ví dụ như con trỏ toàn cục (global poiter) và các DMA.
- Lưu trữ (Storage) : Các cấu trúc điều khiển ngoại vi cũng quản lý các biến toàn cục bên trong một bộ điều khiển HAL nhất định.
ví dụ về cấu trục điều khiển ngoại vi như sau:
- Code:
typedef struct
{
USART_TypeDef *Instance; /* USART registers base address - địa chỉ cơ sở của các thanh ghi UART */
USART_InitTypeDef Init; /* Usart communication parameters - Các tham số giao tiếp của UART */
uint8_t *pTxBuffPtr;/* Pointer to Usart Tx transfer Buffer - Con trỏ đến bộ đếm phát Tx của UART*/
uint16_t TxXferSize; /* Usart Tx Transfer size - Kích thước truyền */
__IO uint16_t TxXferCount;/* Usart Tx Transfer Counter - Bộ đếm truyền */
uint8_t *pRxBuffPtr;/* Pointer to Usart Rx transfer Buffer- con trỏ đến bộ đệm thu */
uint16_t RxXferSize; /* Usart Rx Transfer size - kích thước dữ liệu thu */
__IO uint16_t RxXferCount; /* Usart Rx Transfer Counter - bộ đếm dữ liệu thu */
DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parameters - Các tham số xử lý DMA khi UART ở chế độ phát*/
DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parameters - các tham số DMA ở chế độ UART thu*/
HAL_LockTypeDef Lock; /* Locking object - khóa đối tượng */
__IO HAL_USART_StateTypeDef State; /* Usart communication state - trạng thái truyền thông UART */
__IO HAL_USART_ErrorTypeDef ErrorCode;/* USART Error code - Mã lỗi UART */
}USART_HandleTypeDef;
Được sửa bởi Admin ngày Mon Apr 15, 2019 3:27 pm; sửa lần 1.
Re: Cấu trúc dữ liệu HAL
Đặc tính đa thể hiện (multi Instance) nói lên rằng, các API được sử dụng các ứng dụng đều là re-entrant và tránh việc sử dụng các biến toàn cục do một thủ tục con có thể bi lỗi re-entran nếu nó phụ thuộc vào biến toàn cục có giá trị không thay đổi nhưng biến này lại bị thay đổi khi thủ tục này được gọi theo phương pháp đệ quy. Vì lý do này, cần phải tuân thủ các qui tắc sau:
- các đoạn mã re-entrant không chứa các dữ liệu không phải là hằng số dạng static hoặc global: các hàm re-entrant có thể làm việc với dữ liệu toàn cục, ví dụ như một thủ tục phục vụ ngắt có thể nhận một thông tin trạng thái phần cứng để làm việc (chẳng hạn như bộ đệm đọc của cổng nối tiếp UART), nó không những là dữ liệu toàn cục, mà còn thay đổi. Tuy nhiên, việc sử dụng điển hình các biến static và dữ liệu toàn cục là không được khuyến cáo, theo nghĩa là chỉ có các lệnh đọc-sửa - ghi mới sử dụng các biến này. và cũng không nên để các quá trình ngắt xảy ra khi thực hiện các lệnh này.
- Reentrant code không làm thay đổi các đoạn mã của nó
Khi một ngoại vi có thể quản lý một vài xử lý đồng thời khi sử dụng DMA, thì các cấu trúc điều khiển giao diện DMA cho mỗi xử lý sẽ được đưa vào PPP_HandleTypeDef.
không có cấu trúc điều khiển hay đối tượng thể hiện sử dụng cho các ngoại vi hệ thống và chia sẻ. Các ngoại vi liên quan đến ngoại lệ này gồm có:
- GPIO
- SYSTICK
- NVIC
- PWR
- RCC
- FLASH.
- các đoạn mã re-entrant không chứa các dữ liệu không phải là hằng số dạng static hoặc global: các hàm re-entrant có thể làm việc với dữ liệu toàn cục, ví dụ như một thủ tục phục vụ ngắt có thể nhận một thông tin trạng thái phần cứng để làm việc (chẳng hạn như bộ đệm đọc của cổng nối tiếp UART), nó không những là dữ liệu toàn cục, mà còn thay đổi. Tuy nhiên, việc sử dụng điển hình các biến static và dữ liệu toàn cục là không được khuyến cáo, theo nghĩa là chỉ có các lệnh đọc-sửa - ghi mới sử dụng các biến này. và cũng không nên để các quá trình ngắt xảy ra khi thực hiện các lệnh này.
- Reentrant code không làm thay đổi các đoạn mã của nó
Khi một ngoại vi có thể quản lý một vài xử lý đồng thời khi sử dụng DMA, thì các cấu trúc điều khiển giao diện DMA cho mỗi xử lý sẽ được đưa vào PPP_HandleTypeDef.
không có cấu trúc điều khiển hay đối tượng thể hiện sử dụng cho các ngoại vi hệ thống và chia sẻ. Các ngoại vi liên quan đến ngoại lệ này gồm có:
- GPIO
- SYSTICK
- NVIC
- PWR
- RCC
- FLASH.
Re: Cấu trúc dữ liệu HAL
2. Cấu trúc cấu hình và khởi tạo( Initialization and configuration )
- Code:
typedef struct
{
uint32_t BaudRate; /*!< This member configures the UART communication baudrate.*/
uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received
in a frame.*/
uint32_t StopBits; /*!< Specifies the number of stop bits transmitted.*/
uint32_t Parity; /*!< Specifies the parity mode. */
DocID025834 Rev 5 41/1838
uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or
disabled.*/
uint32_t HwFlowCtl; /*!< Specifies wether the hardware flow control mode is enabled
or disabled.*/
uint32_t OverSampling; /*!< Specifies wether the Over sampling 8 is enabled or
disabled,
to achieve higher speed (up to fPCLK/8).*/
}UART_InitTypeDef;
Re: Cấu trúc dữ liệu HAL
Các quy tắc:
quy tắc đặt tên
- PPP : tham chiếu đến chức năng của ngoại vi chứ không phải tham chiếu đến ngoại vi. Ví dụ với UART thì PPP có thể là USART, IRDA, UART hoặc SMARTCARD.
các hằng số được sử dụng trong 1 file được định nghĩa trong file đó. Một hằng số được dùng trong 1 số file được định nghĩa trong 1 file header. Tất cả các hăng số được viết bằng ký tự in hoa, ngoại trừ các tham số của hàm điều khiển ngoại vi.
- các thanh ghi được xem là các hằng số, tên của chúng là chữ in hoa
- tên hàm ngoại vi được thêm tiền tố HAL.
- cấu trúc chứa các tham số khởi tạo ngoại vi được đặt tên là PPP_InitTypeDef (ví dụ như ADC_InitTypeDef).
- Cấu trúc chứa các tham số cấu hình riêng cho ngoại vi PPP được đặt tên là PPP_xxxxConfTypeDef (ví dụ ADC_ChannelConfTypeDef).
- cấu trúc điều khiển ngoại vi PPP_HandleTypedef
- Các hàm được sử dụng để khởi tạo ngoại vi thông qua các tham số chỉ tra trong cấu trúc PPP_InitTypeDef được đặt tên là HAL_PPP_Init( ví dụ như HAL_TIM_Init()).
- các hàm được sử dụng để reset các thanh ghi ngoại vi PPP về giá trị mặc định của chúng được đặt tên là PPP_Deinit (ví dụ như TIM_DeInit).
quy tắc đặt tên
- PPP : tham chiếu đến chức năng của ngoại vi chứ không phải tham chiếu đến ngoại vi. Ví dụ với UART thì PPP có thể là USART, IRDA, UART hoặc SMARTCARD.
các hằng số được sử dụng trong 1 file được định nghĩa trong file đó. Một hằng số được dùng trong 1 số file được định nghĩa trong 1 file header. Tất cả các hăng số được viết bằng ký tự in hoa, ngoại trừ các tham số của hàm điều khiển ngoại vi.
- các thanh ghi được xem là các hằng số, tên của chúng là chữ in hoa
- tên hàm ngoại vi được thêm tiền tố HAL.
- cấu trúc chứa các tham số khởi tạo ngoại vi được đặt tên là PPP_InitTypeDef (ví dụ như ADC_InitTypeDef).
- Cấu trúc chứa các tham số cấu hình riêng cho ngoại vi PPP được đặt tên là PPP_xxxxConfTypeDef (ví dụ ADC_ChannelConfTypeDef).
- cấu trúc điều khiển ngoại vi PPP_HandleTypedef
- Các hàm được sử dụng để khởi tạo ngoại vi thông qua các tham số chỉ tra trong cấu trúc PPP_InitTypeDef được đặt tên là HAL_PPP_Init( ví dụ như HAL_TIM_Init()).
- các hàm được sử dụng để reset các thanh ghi ngoại vi PPP về giá trị mặc định của chúng được đặt tên là PPP_Deinit (ví dụ như TIM_DeInit).
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết
|
|