Electoday 4.0

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: tha on June 14, 2022, 09:22:55 am

Title: STM32F1 HAL
Post by: tha on June 14, 2022, 09:22:55 am
https://www.st.com/resource/en/user_manual/dm00154093-description-of-stm32f1-hal-and-lowlayer-drivers-stmicroelectronics.pdf (https://www.st.com/resource/en/user_manual/dm00154093-description-of-stm32f1-hal-and-lowlayer-drivers-stmicroelectronics.pdf)
ต้องขอขอบคุณทางทีมงานที่ทำเอกสารนี้ ที่ให้ความรู้เรามาไว้ ณ ที่นี้ด้วยครับ

UM1850
User manual
Description of STM32F1 HAL and low-layer drivers

Introduction(บทนำ)

STM32Cube เป็นความคิดริเริ่มดั้งเดิมของ STMicroelectronics เพื่อปรับปรุงประสิทธิภาพการทำงานของนักพัฒนาอย่างมีนัยยะโดยการลด development effort, เวลา และต้นทุน STM32Cube ครอบคลุมกลุ่มผลิตภัณฑ์ STM32

STM32Cube ประกบด้วย:
•   STM32CubeMX, a graphical software configuration tool ที่ยอมให้สร้าง C initialization code โดย
     ใช้ graphical wizards.
•   A comprehensive embedded software platform, จัดส่งตาม Series (อย่างเช่น STM32CubeF1 สำหรับ STM32F1)
    –   The STM32Cube HAL, STM32 abstraction layer embedded software ช่วยให้พกพาได้อย่างเต็มที่ทั่วกลุ่มผลิตภัณฑ์
         STM32. HAL API มีให้ใช้งานสำหรับ peripherals ทั้งหมด.
    –   Low-layer APIs (LL) นำเสนอ a fast light-weight expert-oriented layer ซึ่งใกล้ชิดกับ the hardware มากกว่า the
         HAL. LL APIs มีให้ใช้งานเฉพาะสำหรับชุดหนึ่งของ peripherals.
    –   ชุดที่ตรงกันของ middleware components อย่างเช่น RTOS, USB, TCP/IP and Graphics.
    –   All embedded software utilities, จัดส่งพร้อมตัวอย่างครบชุด.
Title: Re: STM32F1 HAL
Post by: tha on June 14, 2022, 09:53:12 am
The HAL driver layer จัดให้มี a simple, generic multi-instance set of APIs (application programming interfaces) เพื่อตอบโต้กันกับ the upper layer (application, libraries and stacks).

The HAL driver APIs ถูกแบ่งออกเป็นสองประเภท: generic APIs, ซึ่งจัดให้มี common and generic functions สำหรับทุก the STM32 series และ extension APIs, ซึ่งรวม specific and customized functions สำรับ a given line หรือ part number. The HAL drivers รวม a complete set of ready-to-use APIs ที่ง่ายต่อ the user application implementation. ตัวอย่างเช่น, the communication peripherals บรรจุ APIs เพื่อเริ่มต้นและกำหนดค่า the peripheral, จัดการ data transfers ใน polling mode, รับมือ interrupts หรือ DMA, และจัดการ communication errors.
Title: Re: STM32F1 HAL
Post by: tha on June 14, 2022, 10:31:28 am
The HAL drivers เป็น feature-oriented แทน IP-oriented. ตัวอย่างเช่น, the timer APIs ถูกแบ่งออกเป็นหลายประเภทตาม the IP functions, อย่างเช่น basic timer, capture and pulse width modulation (PWM). The HAL driver layer จัดให้มีใช้งาน run-time failure detection โดยการเช็ค the input values of all functions. เช่น dynamic checking ช่วยปรับปรุง the firmware robustness. Run-time detection เหมาะสำหรับ user application development and debugging ด้วย.

The LL drivers เสนอ hardware services ตามคุณสมบัติที่มีให้ของ the STM32 peripherals. บริการเหล่านี้สะท้อนให้เห็นอย่างชัดเจนความสามารถของฮาร์ดแวร์ และจัดให้มี atomic operations ที่ต้องถูกเรียกใช้โดยทำตาม the programming model ที่อธิบายใน the product line reference manual. เป็นผลให้, the LL services ไม่ได้ขึ้นอยู่กับ standalone processes และไม่ต้องการ any additional memory resources เพื่อบันทึก states, counter หรือ data pointers ของพวกมัน. All operations ถูกกระทำโดยการเปลี่ยนสิ่งที่บรรจุอยู่ภายในของ the associated peripheral registers. ไม่เหมือน the HAL, LL APIs ไม่ถูกจัดให้มีสำหรับ peripherals ที่การปรับการเข้าถึงให้เหมาะสมไม่ใช่คุณสมบัติหลัก, หรือสำหรับเหล่านั้นที่ต้องการ heavy software configuration และ/หรือ a complex upper-level stack (อย่างเช่น USB).
Title: Re: STM32F1 HAL
Post by: tha on June 14, 2022, 10:53:25 am
The HAL and LL เป็นส่วนเสริมและครอบคลุมย่านที่กว้างขวางของ application requirements:
•   The HAL เสนอ high-level and feature-oriented APIs ที่มี a high-portability level. เหล่านี้จะซ่อน the MCU and
     peripheral complexity จาก the end-user.
•   The LL เสนอ low-level APIs ที่ register level, พร้อมการปรับให้เหมาะสมที่ดีกว่า แต่พกพาสะดวกน้อยกว่า. เหล่านี้ต้องการความรู้ที่
     ลึกของ the MCU and peripheral specifications.

The HAL- and LL-driver source code ได้รับการพัฒนาใน ANSI-C ที่เข้มงวด ซึ่งทำให้มันเป็นอิสระจาก the development tools. มันถูกเช็คด้วย the CodeSonar® static analysis tool. มีเอกสารครบถ้วน.

เป็นไปตาม MISRA C®:2004 standard.
Title: Re: STM32F1 HAL
Post by: tha on June 15, 2022, 08:44:48 am
คู่มือผู้ใช้นี้มีโครงสร้างดังนี้:
•   ภาพรวมของ HAL drivers
•   ภาพรวมของ low-layer drivers
•   การอยู่ร่วมกันของ HAL and LL drivers
•   คำอธิบายโดยละเอียดของแต่ละ peripheral driver: configuration structures, functions, และวิธีในการใช้ the given API เพื่อ
     สร้าง your application
Title: Re: STM32F1 HAL
Post by: tha on June 15, 2022, 09:00:45 am
1 General information

The STM32CubeF1 MCU Package รันบน STM32F1 32-bit microcontrollers บนรากฐานของ the Arm® Cortex®-M processor.

หมายเหตุ: Arm เป็นเครื่องหมายการค้าจดทะเบียนของ Arm Limited (หรือบริษัทในเครือ) ในสหรัฐอเมริกาและ/หรือที่อื่นๆ
Title: Re: STM32F1 HAL
Post by: tha on June 15, 2022, 09:09:47 am
2 Acronyms and definitions

(https://i.imgur.com/CipZyWI.png)
(https://i.imgur.com/wNp19yZ.png)
Title: Re: STM32F1 HAL
Post by: tha on June 15, 2022, 09:15:35 am
(https://i.imgur.com/L8W1HvD.png)
(https://i.imgur.com/2YYMO5Q.png)
Title: Re: STM32F1 HAL
Post by: tha on June 15, 2022, 09:17:50 am
(https://i.imgur.com/jSfzQ6x.png)
Title: Re: STM32F1 HAL
Post by: tha on June 16, 2022, 08:29:02 am
3 Overview of HAL drivers

The HAL drivers ถูกออกแบบเพื่อนำเสนอ a rich set of APIs และตอบโต้อย่างง่ายๆกับ the application upper layers. แต่ละ driver ประกอบด้วย a set of functions ครอบคลุม the most common peripheral features. การพัฒนาของแต่ละ driver ถูกขับเคลี่ยนโดย a common API ซึ่งทำให้เป็นมาตรฐาน the driver structure, the functions และ the parameter names.

The HAL drivers จะรวม a set of driver modules, แต่ละ module กำลังถูกเชื่อมต่อกับ a standalone peripheral. อย่างไรก็ตาม, ในบางกรณี, the module ถูกเชื่อมต่อกับ a peripheral functional mode. ตัวอย่างเช่น, หลาย modules มีอยู่สำหรับ the USART peripheral: UART driver module, USART driver module, SMARTCARD driver module and IRDA driver module.
Title: Re: STM32F1 HAL
Post by: tha on June 16, 2022, 09:05:51 am
The HAL main features เป็นดังต่อไปนี้:
•   Cross-family portable set of APIs ที่ครอบคลุม the common peripheral features เช่นเดียวกับ extension APIs ในกรณี
     ของ specific peripheral features.
•   สาม API programming models: polling, interrupt and DMA.
•   APIs are RTOS compliant:
    –   Fully reentrant APIs
    –   การใช้ timeouts อย่างเป็นระบบใน polling mode.
•   การรองรับ peripheral multi-instance ช่วยให้สามารถเรียก API พร้อมกันสำหรับหลาย instances ของ a given peripheral
     (USART1, USART2...)
•   ทุก HAL APIs จัดให้มีใช้ user-callback functions mechanism:
    –   Peripheral Init/DeInit HAL APIs สามารถเรียก user-callback functions เพื่อดำเนินการ peripheral system level
         Initialization/De-Initialization (clock, GPIOs, interrupt, DMA)
    –   Peripherals interrupt events
    –   Error events.
•   Object locking mechanism: การเข้าถึงฮาร์ดแวร์อย่างปลอดภัยเพื่อป้องกันการเข้าถึงที่หลอกลวงหลายครั้งใน shared resources
•   Timeout ที่ใช้สำหรับทุก blocking processes: the timeout สามารถเป็น a simple counter หรือ a timebase.
Title: Re: STM32F1 HAL
Post by: tha on June 16, 2022, 09:32:53 am
3.1 HAL and user-application files

3.1.1 HAL driver files
A HAL drivers ถูกประกอบด้วยชุดต่อไปนี้ของ files:

(https://i.imgur.com/XBboFMp.png)

(https://i.imgur.com/FS8BczV.png)
Title: Re: STM32F1 HAL
Post by: tha on June 16, 2022, 10:04:46 am
3.1.2 User-application files
The minimum files ที่ต้องการเพื่อสร้าง an application โดยใช้ the HAL ถูกแสดงรายการในตารางข้างล่าง:

(https://i.imgur.com/pz0Zsu7.png)
Title: Re: STM32F1 HAL
Post by: tha on June 16, 2022, 10:29:44 am
The STM32Cube package มาพร้อมกับ ready-to-use project templates, หนึ่งโปรเจ็คสำหรับแต่ละ board ที่รองรับ. แต่ละ project บรรจุ the files ที่แสดงรายการไว้ข้างบนและ a preconfigured project สำหรับ the supported toolchains.

แต่ละ project template จัดให้มี empty main loop function และสามารถถูกใช้เป็น a starting point เพื่อให้คุ้นเคยกับ project settings สำหรับ STM32Cube. คุณลักษณะของมันเป็นดังต่อไปนี้:
•   มันบรรจุ the sources of HAL, CMSIS and BSP drivers ซึ่งเป็นส่วนประกอบที่น้อยที่สุดเพื่อพัฒนา a code บน a given board.
•   มันบรรจุ the include paths สำหรับทุก the firmware components.
•   มันกำหนด the STM32 device ที่รองรับ, และยอมให้การกำหนดค่า the CMSIS and HAL drivers สอดคล้องกัน.
•   มันจัดให้มี ready to use user files ที่กำหนดค่าไว้ล่วงหน้าดังที่กำหนดไว้ข้างล่าง:
    –   HAL is initialized
    –   SysTick ISR ที่จัดให้มีใช้สำหรับ HAL_Delay()
    –   System clock ที่กำหนดค่าไว้ด้วย the maximum device frequency.

Note:   ถ้า an existing project ถูกก๊อปปี้ไปวางใส่ที่อื่น, ดังนั้น include paths ต้องถูกอัฟเดต.

(https://i.imgur.com/Lo5cPrf.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 06:46:59 am
3.2 HAL data structures

แต่ละ HAL driver สามารถบรรจุ the following data structures:
•   Peripheral handle structures
•   Initialization and configuration structures
•   Specific process structures.

3.2.1 Peripheral handle structures
The APIs มี a modular generic multi-instance architecture ที่ยอมให้การทำงานกับ several IP instances พร้อมกัน.

PPP_HandleTypeDef *handle เป็น the main structure ที่ถูกจัดให้มีใช้ใน the HAL drivers. มันจัดการ the peripheral/module configuration and registers และฝังทุก the structures and variables ที่จำเป็นต้องตามติด the peripheral device flow.

The peripheral handle ถูกใช้สำหรับจุดมุ่งหมายต่อไปนี้:
•   Multi-instance support: แต่ละ peripheral/module instance มี handle ของตัวเอง. ด้วยเหตุนี้ instance resources จึงเป็น
     อิสระ.
•   Peripheral process intercommunication: the handle ถูกใช้เพื่อจัดการ shared data resources ระหว่าง the process
     routines.
     Example: global pointers, DMA handles, state machine.
•   Storage : handle นี้ถูกใช้เพื่อจัดการ global variables ภายใน a given HAL driver ด้วย.

ตัวอย่างของ peripheral structure ถูกแสดงไว้ข้างล่าง:
(https://i.imgur.com/lvFhJf8.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 08:42:19 am
Note:  1. The multi-instance feature บอกเป็นนัยว่าทุก the APIs ที่ใช้ใน the application นั้นถูกกลับเข้ามาใหม่และหลีกเลี่ยงการ
              ใช้ global variables เนื่องจาก subroutines สามารถล้มเหลวที่จะถูกกลับเข้ามาใหม่ถ้าพวกมันวางใจ a global variable ว่า
              ยังคงไม่เปลี่ยนแต่ variable นั้นถูกโมดิฟายด์เมื่อ the subroutine ถูกเรียกใช้ซ้ำ ด้วยเหตุนี้ เคารพกฎต่อไปนี้:
              –   Reentrant code ไม่เก็บ any static (or global) non-constant data: reentrant functions สามารถทำงานด้วย
                   global data. ตัวอย่างเช่น, a reentrant interrupt service routine สามารถจับ a piece of hardware status เพื่อ
                   ทำงานด้วย (ตัวอย่างเช่น serial port read buffer) ซึ่งไม่เป็นเพียง global, แต่ volatile. ยังคงใช้งานได้ทั่วไป
                   ของ static variables และ global data ไม่ถูกแนะนำ, ในแง่ที่ว่า มีเพียง atomic read-modify-write instructions
                   ควรถูกใช้ในตัวแปรเหล่านี้. มันไม่ควรเป็นไปได้สำหรับ an interrupt หรือ signal เกิดขึ้นในระหว่างการปฏิบัติของ an
                   instruction ดังกล่าว.
              –   Reentrant code ไม่โมดิฟายด์ code ของตัวเอง.
          2. เมื่อ a peripheral สามารถจัดการหลาย processes พร้อมกันโดยใช้ the DMA (full duplex case), the DMA interface
              รับมือสำหรับแต่ละ process ถูกเพิ่มใน the PPP_HandleTypeDef.
          3. สำหรับ the shared and system peripherals, ไม่มี handle หรือ instance object ถูกใช้. The peripherals ที่เกี่ยวข้อง
              โดยข้อยกเว้นนี้มีดังต่อไปนี้:
              –   GPIO
              –   SYSTICK
              –   NVIC
              –   PWR
              –   RCC
              –   FLASH
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 09:13:33 am
3.2.2 Initialization and configuration structure
structures เหล่านี้ถูกกำหนดใน the generic driver header file เมื่อเป็นเรื่องปกติสำหรับทุก part numbers.  เมื่อพวกมันสามารถเปลี่ยนจาก one part number ไปอีกตัวหนึ่ง, the structures ถูกกำหนดใน the extension header file สำหรับแต่ละ part number.
(https://i.imgur.com/FDlFesM.png)
Note: The config structure ถูกใช้เพื่อกำหนดค่าเริ่มต้น the sub-modules or sub-instances. ดูตัวอย่างข้างล่าง:
(https://i.imgur.com/bUn0bxL.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 09:25:16 am
3.2.3 Specific process structures
The specific process structures ถูกใช้สำหรับ specific process (common APIs). พวกมันถูกกำหนดใน the generic driver header file.
Example:
(https://i.imgur.com/zUfhc87.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 10:31:27 am
3.3 API classification

The HAL APIs ถูกแบ่งออกเป็นสามประเภท:
•   Generic APIs: common generic APIs นำมาใช้กับทุก STM32 devices. APIs เหล่านี้จึงมีอยู่ใน the generic HAL driver files
     ของทุก STM32 microcontrollers.
(https://i.imgur.com/t1oR6uj.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 10:49:01 am
•   Extension APIs:
    ชุดของ API นี้ถูกแบ่งลงในสองประเภทย่อย :
    –   Family specific APIs: APIs นำมาใช้กับ a given family. พวกมันถูกวางอยู่ใน the extension HAL driver file (ดูตัวอย่างข้าง
         ล่างที่เกี่ยวข้องกับ the ADC).
(https://i.imgur.com/GN7yboa.png)
    –   Device part number specific APIs: APIs เหล่านี้ถูกจัดให้มีใช้ใน the extension file และไม่ถูกจำกัดโดย specific define
         statements ที่สัมพันธ์กับ a given part number.
(https://i.imgur.com/UL86yQy.png)
Note: The data structure ที่สัมพันธ์กับ the specific APIs ไม่ถูกจำกัดโดย the device part number define statement. มันถูก
         วางอยู่ใน the corresponding extension header C file.
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 11:06:31 am
ตารางต่อไปนี้สรุปรวมที่ตั้งของประเภทต่างๆของ HAL APIs ใน the driver files.
(https://i.imgur.com/BnFNvNe.png)
1. ในบางกรณี, การจัดให้มีใช้สำหรับ a specific device part number อาจเปลี่ยนแปลง. ในกรณีนี้ the generic API ถูกประกาศเป็น weak function ใน the extension file. The API ถูกจัดให้มีใช้อีกครั้งเพื่อเขียนทับ the default function.

Note: Family specific APIs สัมพันธ์กับ a given family เท่านั้น. นี้หมายความว่าถ้า a specific API ถูกจัดให้มีใช้ใน another family, และ the arguments ของ family หลังนี้แตกต่างกัน, additional structures and arguments อาจจำเป็นต้องถูกเพิ่ม.

Note: The IRQ handlers ถูกใช้สำหรับ common and family specific processes.
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 12:53:11 pm
3.4 Devices supported by HAL drivers

(https://i.imgur.com/hzkGrlY.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 12:54:17 pm
(https://i.imgur.com/HLMVQmO.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 01:09:13 pm
(https://i.imgur.com/j5fJsdG.png)
Title: Re: STM32F1 HAL
Post by: tha on June 17, 2022, 01:10:00 pm
3.5 HAL driver rules

3.5.1 HAL API naming rules
The following naming rules ถูกใช้ใน HAL drivers:
(https://i.imgur.com/mL9AjhR.png)
•   The PPP prefix อ้างอิงถึง the peripheral functional mode และไม่ถึง the peripheral มันเอง. ตัวอย่างเช่น, ถ้า the USART,
     PPP สามารถเป็น USART, IRDA, UART or SMARTCARD ขึ้นอยู่กับ the peripheral mode.
•   The constants ที่ใช้ใน one file ถูกกำหนดภายใน file นี้. A constant ที่ใช้ใน several files ถูกกำหนดใน a header file. ทุก
     constants ถูกเขียนด้วยตัวพิมพ์ใหญ่, ยกเว้นสำหรับ peripheral driver function parameters.
•   typedef variable names ควรถูกต่อท้ายด้วย _TypeDef.
•   Registers ที่ถือว่าเป็นค่าคงที่. ในกรณีส่วนใหญ่, ชื่อของพวกมันจะเป็นตัวพิมพ์ใหญ่และใช้ตัวย่อที่เหมือนกันกับใน the STM32F1
     reference manuals.
•   Peripheral registers ถูกประกาศใน the PPP_TypeDef structure (ตัวอย่างเช่น ADC_TypeDef) ใน the CMSIS header:
     stm32f1xxx.h ตรงกันกับ stm32f100xb.h, stm32f100xe.h, stm32f101x6.h, stm32f101xb.h,
     stm32f101xe.h, stm32f101xg.h, stm32f102x6.h, stm32f102xb.h, stm32f103x6.h, stm32f103xb.h,
     stm32f103xe.h, stm32f103xg.h, stm32f105xc.h and stm32f107xc.h.
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 08:05:28 am
•   Peripheral function names จะขึ้นต้นโดย HAL_, จากนั้น the corresponding peripheral acronym ใน uppercase ถูกตามโดย
     an underscore. The first letter ของแต่ละคำจะเป็นตัวพิมพ์ใหญ่ (ตัวอย่างเช่น HAL_UART_Transmit()). เพียง one underscore
     ถูกยอมให้ใน a function name เพื่อแยก the peripheral acronym จากที่เหลือของ the function name.
•   The structure containing the PPP peripheral initialization parameters มีชื่อว่า PPP_InitTypeDef (ตัวอย่างเช่น
     ADC_InitTypeDef).
•   The structure containing the Specific configuration parameters for the PPP peripheral มีชื่อว่า
     PPP_xxxxConfTypeDef (ตัวอย่างเช่น ADC_ChannelConfTypeDef).
•   Peripheral handle structures มีชื่อว่า PPP_HandleTypedef (ตัวอย่างเช่น  DMA_HandleTypeDef)
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 08:54:37 am
•   The functions ที่ใช้เพื่อกำหนดค่าเริ่มต้น the PPP peripheral สอดคล้องกันกับ parameters ที่ระบุใน PPP_InitTypeDef มีชื่อว่า
     HAL_PPP_Init (ตัวอย่างเช่น HAL_TIM_Init()).
•   The functions ที่ใช้เพื่อรีเซ็ต the PPP peripheral registers ไปเป็นค่าเริ่มต้นของมันมีชื่อว่า HAL_PPP_DeInit (e.g.
     HAL_TIM_DeInit()).
•   The MODE suffix หมายถึง the process mode, ซึ่งสามารถเป็น polling, interrupt or DMA. ตัวอย่างเช่น, เมื่อ the DMA ถูกใช้
     นอกเหนือจาก the native resources, the function นี้ควรถูกเรียก: HAL_PPP_Function_DMA().
•   The Feature prefix ควรอ้างอิงถึง the new feature.
     Example: HAL_ADC_Start() อ้างอิงถึง the injection mode
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 09:46:09 am
3.5.2 HAL general naming rules
•   สำหรับ the shared and system peripherals, ไม่มี handle or instance object ถูกใช้. กฎนี้นำไปใช้กับ the following
     peripherals:
     –   GPIO
     –   SYSTICK
     –   NVIC
     –   RCC
     –   FLASH.

Example: The HAL_GPIO_Init() ต้องการเฉพาะ the GPIO address และ configuration parameters ของมัน.
(https://i.imgur.com/BEu9n3J.png)
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 09:57:28 am
•   The macros ที่จัดการ interrupts and specific clock configurations ถูกกำหนดในแต่ละ peripheral/module driver. มาโคร
     เหล่านี้จะถูกส่งออกใน the peripheral driver header files ดังนั้นพวกมันสามารถถูกใช้โดย the extension file. รายการของมาโคร
     เหล่านี้ถูกกำหนดไว้ข้างล่าง:

Note:  รายการนี้ไม่ครบถ้วนสมบูรณ์ และมาโครอื่นที่เกี่ยวข้องกับ peripheral features สามารถถูกเพิ่ม, ดังนั้นพวกมันสามารถถูกใช้ใน the
          user application

(https://i.imgur.com/FPN9L1e.png)
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 10:18:12 am
•   NVIC and SYSTICK คือ two Arm® Cortex® core features. The APIs ที่เกี่ยวข้องกับคุณลักษณะเหล่านี้ถูกวางอยู่ใน the
     stm32f1xx_hal_cortex.c file.
•   เมื่อ a status bit หรือ a flag ถูกอ่านจาก registers, มันถูกประกอบด้วย shifted values ขึ้นอยู่กับ the number of read values
     และขนาดของมัน. ในกรณีนี้, the returned status width เป็น 32 bits. Example : STATUS = XX | (YY << 16) or
     STATUS = XX | (YY << 8 ) | (YY << 16) | (YY << 24)".
•   The PPP handles ใช้ได้ก่อนการใช้ the HAL_PPP_Init() API. The init function ดำเนินการตรวจสอบก่อนการแก้ไข the handle
     fields.
(https://i.imgur.com/0r1n5K0.png)
•   The macros ที่กำหนดไว้ข้างล่างถูกใช้:
     –   Conditional macro:
(https://i.imgur.com/2mXg9Wd.png)
     –   Pseudo-code macro (หลาย instructions macro):
(https://i.imgur.com/2ABfs7C.png)
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 10:48:17 am
3.5.3 HAL interrupt handler and callback functions
นอกจาก the APIs, HAL peripheral drivers ยังรวมถึง:
•   HAL_PPP_IRQHandler() peripheral interrupt handler ที่ควรถูกเรียกจาก stm32f1xx_it.c
•   User callback functions.

The user callback functions ถูกกำหนดเป็น empty functions ด้วย “weak” attribute. พวกมันต้องถูกกำหนดใน the user code.

มีสามชนิดของ user callbacks functions:
•   Peripheral system level initialization/ de-Initialization callbacks: HAL_PPP_MspInit() and HAL_PPP_MspDeInit
•   Process complete callbacks : HAL_PPP_ProcessCpltCallback
•   Error callback: HAL_PPP_ErrorCallback.

(https://i.imgur.com/BiP1VHb.png)
Title: Re: STM32F1 HAL
Post by: tha on June 18, 2022, 02:58:12 pm
3.6 HAL generic APIs

The generic APIs จัดให้มี common generic functions นำไปใช้กับทุก STM32 devices. พวกมันประกอบด้วย four APIs groups:
•   Initialization and de-initialization functions:HAL_PPP_Init(), HAL_PPP_DeInit()
•   IO operation functions: HAL_PPP_Read(), HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive()
•   Control functions: HAL_PPP_Set (), HAL_PPP_Get ().
•   State and Errors functions: HAL_PPP_GetState (), HAL_PPP_GetError ()

สำหรับบาง peripheral/module drivers, กลุ่มเหล่านี้ถูกแก้ไขขึ้นอยู่กับ the peripheral/module implementation.

Example: ใน the timer driver, การจัดกลุ่ม API จะขึ้นอยู่กับ timer features (PWM, OC, IC...).

The initialization and de-initialization functions ช่วยให้การกำหนดค่าเริ่มต้น a peripheral และการกำหนดค่า the low-level resources, หลักๆ clocks, GPIO, alternate functions (AF) และบางที DMA and interrupts. The HAL_DeInit()function คืน the peripheral default state, ปล่อยฟรี the low-level resources และลบการพึ่งพาโดยตรงกับ the hardware.

The IO operation functions ดำเนินการ a row access ไปยัง the peripheral payload data ใน write and read modes.

The control functions ถูกใช้เพื่อเปลี่ยนแบบไดนามิกค์ the peripheral configuration และเซ็ต operating mode อื่น.

The peripheral state and errors functions ช่วยให้สามารถดึง the peripheral and data flow states ในขณะทำงาน, และระบุประเภทของ errors ที่เกิดขึ้น. ตัวอย่างข้างล่างอ้างอิงจาก the ADC peripheral. The list of generic APIs ไม่ได้ละเอียดถี่ถ้วน. มันถูกให้เป็นตัวอย่างเท่านั้น.

(https://i.imgur.com/Ojgub1i.png)

(https://i.imgur.com/oQxuIy6.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 08:15:59 am
3.7 HAL extension APIs

3.7.1 HAL extension model overview
The extension APIs จัดให้มี specific functions หรือเขียนทับ modified APIs สำหรับ a specific family (series) หรือ specific part number ภายใน the same family.
The extension model ประกอบด้วย an additional file, stm32f1xx_hal_ppp_ex.c, ที่รวมทุก the specific functions และกำหนด statements (stm32f1xx_hal_ppp_ex.h) สำหรับ a given part number.
ข้างล่างตัวอย่างอ้างอิงจาก the ADC peripheral:
(https://i.imgur.com/PUSTBNk.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 08:29:39 am
3.7.2 HAL extension model cases
The specific IP features สามารถถูกจัดการโดย the HAL drivers ใน 5 วิธีที่แตกต่างกัน. พวกมันถูกอธิบายข้างล่าง.

Adding a part number-specific function
เมื่อ a new feature ที่เฉพาะเจาะจงถึง a given device ถูกต้องการ, the new APIs ถูกเพิ่มใน the stm32f1xx_hal_ppp_ex.c extension file. พวกมันมีชื่อว่า HAL_PPPEx_Function().
(https://i.imgur.com/72EsiKT.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 08:45:34 am
Adding a family-specific function
ในกรณีนี้, the API ถูกเพิ่มใน the extension driver C file และมีชื่อว่า HAL_PPPEx_Function ().

(https://i.imgur.com/byu0J5z.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 09:11:21 am
Adding a new peripheral (specific to a device belonging to a given family)
เมื่อ a peripheral ซึ่งมีให้ใช้งานเฉพาะใน a specific device ถูกต้องการ, the APIs ที่ตรงกันกับ new peripheral/module (newPPP) นี้ถูกเพิ่มใน a new stm32f1xx_hal_newppp.c. อย่างไรก็ตามการรวมของ file นี้ถูกเลือกใน the stm32f1xx_hal_conf.h โดยใช้ the macro:

(https://i.imgur.com/131A8GZ.png)

(https://i.imgur.com/b2syetk.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 09:23:13 am
Updating existing common APIs
ในกรณีนี้, the routines ถูกกำหนดด้วย the same names ใน the stm32f1xx_hal_ppp_ex.c extension file, ในขณะที่ the generic API ถูกกำหนดเป็น weak, ดังนั้น the compiler จะเขียนทับ the original routine ด้วย the new defined function.

(https://i.imgur.com/5SdQ8Cf.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 09:29:49 am
Updating existing data structures
The data structure สำหรับ a specific device part number (ตัวอย่างเช่น PPP_InitTypeDef) สามารถมี different fields. ในกรณีนี้, the data structure ถูกกำหนดใน the extension header file และไม่ถูกจำกัดโดย the specific part number define statement.

Example:
(https://i.imgur.com/lbrwxpb.png)
Title: Re: STM32F1 HAL
Post by: tha on June 19, 2022, 09:49:48 am
3.8 File inclusion model

The header of the common HAL driver file (stm32f1xx_hal.h) รวม the common configurations สำหรับ the whole HAL library. มันเป็น the only header file ที่ถูกรวมใน the user sources และ the HAL C sources files เพื่อให้สามารถใช้ the HAL resources.

(https://i.imgur.com/tfN6mps.png)

A PPP driver เป็น a standalone module ซึ่งถูกใช้ใน a project. ผู้ใช้ต้องเปิดใช้งาน the corresponding USE_HAL_PPP_MODULE define statement ใน the configuration file.
(https://i.imgur.com/LAS77KU.png)
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 07:04:14 am
3.9 HAL common resources

The common HAL resources, อยางเช่น common define enumerations, structures and macros, ถูกกำหนดใน stm32f1xx_hal_def.h.The main common define enumeration คือ HAL_StatusTypeDef.

•   HAL Status
The HAL status ถูกใช้โดย HAL APIs เกือบทั้งหมด, ยกเว้น boolean functions and IRQ handler. มันส่งคืนกลับ the status of the current API operations. มันมีค่าที่เป็นไปได้ 4 ค่าดังอธิบายข้างล่าง:
(https://i.imgur.com/d0ZKAR6.png)

•   HAL Locked
The HAL lock ถูกใช้โดยทุก HAL APIs เพื่อป้องกันการเข้าถึงโดย accident shared resources.
(https://i.imgur.com/vH24s5R.png)
นอกเหนือจาก common resources, the stm32f1xx_hal_def.h file จะเรียก the stm32f1xx.h file ใน CMSIS library เพื่อให้ได้ the data structures and the address mapping สำหรับทุก peripherals:
    –   การประกาศของ peripheral registers and bits definition.
    –   Macros เพื่อเข้าถึง peripheral registers hardware (Write register, Read register…etc.).

•   Common macros
(https://i.imgur.com/PxOozKE.png)
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 08:52:46 am
3.10 HAL configuration

The configuration file, stm32f1xx_hal_conf.h, อนุญาตให้ปรับแต่ง the drivers สำหรับ the user application ได้. การแก้ไขการกำหนดค่านี้ไม่บังคับ: the application สามารถใช้ the default configuration โดยไม่มีการแก้ไขใดๆ. เพื่อกำหนดค่า parameters เหล่านี้, ผู้ใช้ควร enable, disable or modify บางตัวเลือกนี้โดย uncommenting, commenting or modifying ค่าของ the related define statements ดังอธิบายในตารางข้างล่าง:
(https://i.imgur.com/SERgtea.png)
(https://i.imgur.com/nDnSUqw.png)

Note:   The stm32f1xx_hal_conf_template.h file ถูกวางอยู่ใน the HAL drivers Inc folder. มันควรถูกก๊อปปี้ไปยัง the user
            folder, เปลี่ยนชื่อหรือแก้ไขตามที่อธิบายข้างบน.

Note:   โดยค่าเริ่มต้น, the values ที่กำหนดใน the stm32f1xx_hal_conf_template.h file เป็นเหมือนกับที่ใช้สำหรับตัวอย่างและ
            การสาธิต. ทุก HAL include files ถูกเปิดใช้งานดังนั้นพวกมันสามารถถูกใช้ใน the user code โดยปราศจากการแก้ไข
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 09:22:25 am
3.11 HAL system peripheral handling

บทนี้ให้ภาพรวมของวิธีที่ the system peripherals ถูกจัดการโดย the HAL drivers. The full API list ถูกจัดให้มีภายในแต่ละ peripheral driver description section.

3.11.1 Clock
Two main functions สามารถถูกใช้เพื่อกำหนดค่า the system clock:
•   HAL_RCC_OscConfig (RCC_OscInitTypeDef *RCC_OscInitStruct). ฟังชั่นนี้กำหนดค่า/เปิดใช้งานหลาย clock sources
     (HSE, HSI, LSE, LSI, PLL).
•   HAL_RCC_ClockConfig (RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency). ฟังชั่นนี้
     –   เลือก the system clock source
     –   กำหนดค่า AHB, APB1 and APB2 clock dividers
     –   กำหนดค่า the number of Flash memory wait states
     –   อัฟเดต the SysTick configuration เมื่อ HCLK clock เปลี่ยน.

บาง peripheral clocks ไม่ได้มาจาก the system clock (อย่างเช่น RTC, USB). ในกรณีนี้, the clock configuration ถูกกระทำโดย an extended API ที่กำหนดใน stm32f1xx_hal_rcc_ex.c: HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit).
Additional RCC HAL driver functions มีให้ใช้ประโยชน์:
•   HAL_RCC_DeInit() Clock de-initialization function ที่คืนกลับ clock configuration ไปเป็น reset state
•   ได้รับ clock functions ที่ยอมให้ดึง various clock configurations (system clock, HCLK, PCLK1, PCLK2, …)
•   MCO and CSS configuration functions

A set of macros ถูกกำหนดใน stm32f1xx_hal_rcc.h and stm32f1xx_hal_rcc_ex.h. พวกมันอนุญาตให้ปฏิบัติการทำงานเบื้องต้นใน RCC block registers, อย่างเช่น peripherals clock gating/reset control:
•   __HAL_PPP_CLK_ENABLE/__HAL_PPP_CLK_DISABLE to enable/disable the peripheral clock
•   __HAL_PPP_FORCE_RESET/__HAL_PPP_RELEASE_RESET to force/release peripheral reset
•   __HAL_PPP_CLK_SLEEP_ENABLE/__HAL_PPP_CLK_SLEEP_DISABLE to enable/disable the peripheral clock ใน
    ระหว่าง Sleep mode.
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 10:02:58 am
3.11.2 GPIOs
GPIO HAL APIs เป็นดังต่อไปนี้:
•   HAL_GPIO_Init() / HAL_GPIO_DeInit()
•   HAL_GPIO_ReadPin() / HAL_GPIO_WritePin()
•   HAL_GPIO_TogglePin ().

นอกเหนือจาก standard GPIO modes (input, output, analog), the pin mode สามาถถูกกำหนดค่าเป็น EXTI พร้อมด้วย interrupt หรือ event generation.
เมื่อเลือก EXTI mode พร้อมด้วย interrupt generation, ผู้ใช้ต้องเรียก HAL_GPIO_EXTI_IRQHandler() จาก stm32f1xx_it.c และจัดให้มีใช้ HAL_GPIO_EXTI_Callback()
ตารางข้างล่างอธิบาย the GPIO_InitTypeDef structure field.
(https://i.imgur.com/bRZqRAG.png)

โปรดดูข้างล่าง typical GPIO configuration examples:
•   การกำหนดค่า GPIOs เป็น output push-pull เพื่อขับ external LEDs:
(https://i.imgur.com/T2XdkZb.png)

•   การกำหนดค่า PA0 เป็น external interrupt ที่มี falling edge sensitivity:
(https://i.imgur.com/ygdv7J9.png)
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 10:38:49 am
3.11.3 Cortex® NVIC and SysTick timer
The Cortex® HAL driver, stm32f1xx_hal_cortex.c, จัดให้มี APIs เพื่อจัดการ NVIC and SysTick. The supported APIs รวม:
•   HAL_NVIC_SetPriority()/ HAL_NVIC_SetPriorityGrouping()
•   HAL_NVIC_GetPriority() / HAL_NVIC_GetPriorityGrouping()
•   HAL_NVIC_EnableIRQ()/HAL_NVIC_DisableIRQ()
•   HAL_NVIC_SystemReset()
•   HAL_SYSTICK_IRQHandler()
•   HAL_NVIC_GetPendingIRQ() / HAL_NVIC_SetPendingIRQ () / HAL_NVIC_ClearPendingIRQ()
•   HAL_NVIC_GetActive(IRQn)
•   HAL_SYSTICK_Config()
•   HAL_SYSTICK_CLKSourceConfig()
•   HAL_SYSTICK_Callback()
Title: Re: STM32F1 HAL
Post by: tha on June 20, 2022, 10:43:23 am
3.11.4 PWR
The PWR HAL driver จัดการ power management. The features ที่แชร์ระหว่างทุก STM32 Series ถูกแสดงรายการข้างล่าง:
•   PVD configuration, enabling/disabling and interrupt handling
    –   HAL_PWR_ConfigPVD()
    –   HAL_PWR_EnablePVD() / HAL_PWR_DisablePVD()
    –   HAL_PWR_PVD_IRQHandler()
    –   HAL_PWR_PVDCallback()
•   Wakeup pin configuration
    –   HAL_PWR_EnableWakeUpPin() / HAL_PWR_DisableWakeUpPin()
•   Low-power mode entry
    –   HAL_PWR_EnterSLEEPMode()
    –   HAL_PWR_EnterSTOPMode()
    –   HAL_PWR_EnterSTANDBYMode()
Title: Re: STM32F1 HAL
Post by: tha on June 21, 2022, 06:45:32 am
3.11.5 EXTI
The EXTI ไม่ถูกถือว่าเป็น a standalone peripheral แต่ค่อนข้างเป็น a service ที่ใช้โดย peripheral อื่น, ที่ถูกจัดการผ่านทาง EXTI HAL APIs. นอกจากนี้, แต่ละ peripheral HAL driver จัดให้มีใช้ the associated EXTI configuration and function เป็น macros ใน header file ของมัน.

The first 16 EXTI lines ที่เชื่อมต่อถึง the GPIOs ถูกจัดการภายใน the GPIO driver. The GPIO_InitTypeDef structure อนุญาตให้การกำหนดค่า an I/O เป็น external interrupt or external event.

The EXTI lines ที่เชื่อมต่อภายในถึง the PVD, RTC, USB, and Ethernet ถูกกำหนดค่าภายใน the HAL drivers ของ peripheral เหล่านั้นผ่านทาง the macros ทีให้ในตารางข้างล่าง.

The EXTI internal connections ขึ้นอยู่กับ the targeted STM32 microcontroller (ดูที่ the product datasheet สำหรับรายละเอียดเพิ่มเติม):
(https://i.imgur.com/nDXloW2.png)
(https://i.imgur.com/x5hXgL2.png)
(https://i.imgur.com/4Ef2cTZ.png)
ถ้า the EXTI interrupt mode ถูกเลือก, the user application ต้องเลือก HAL_PPP_FUNCTION_IRQHandler() (ตัวอย่างเช่น HAL_PWR_PVD_IRQHandler()), จาก stm32f1xx_it.c file, และจัดให้มีใช้ HAL_PPP_FUNCTIONCallback() callback function (ตัวอย่างเช่น HAL_PWR_PVDCallback().
Title: Re: STM32F1 HAL
Post by: tha on June 21, 2022, 08:17:31 am
3.11.6 DMA
The DMA HAL driver ยอมให้การเปิดใช้งานและการกำหนดค่า the peripheral ถูกเชื่อมต่อถึง the DMA Channels (ยกเว้นสำหรับ internal SRAM/FLASH memory ซึ่งไม่ต้องการการกำหนดค่าเริ่มต้นใดๆ). ดูที่ the product reference manual สำหรับรายละเอียดเกี่ยวกับ the DMA request ที่ตรงกันกับแต่ละ peripheral.

สำหรับ a given channel, HAL_DMA_Init() API ยอมให้การโปรแกรม the required configuration ผ่านทาง the following parameters:
•   Transfer direction
•   Source and destination data formats
•   Circular, Normal or peripheral flow control mode
•   Channel priority level
•   Source and destination Increment mode

Two operating modes มีให้ใช้ประโยชน์:

•   Polling mode I/O operation
    1.   ใช้ HAL_DMA_Start() เพื่อสตาร์ท DMA transfer เมื่อ the source and destination addresses and the Length of
          data ที่จะถูกส่งถ่ายถูกกำหนดค่าแล้ว.
    2.   ใช้ HAL_DMA_PollForTransfer() เพื่อวนตรวจหา the end of current transfer. ในกรณีนี้ a fixed timeout สามารถถูก
          กำหนดค่าขึ้นอยู่กับ the user application.

•   Interrupt mode I/O operation
    1.   กำหนดค่า the DMA interrupt priority โดยใช้ HAL_NVIC_SetPriority()
    2.   เปิดใช้งานe the DMA IRQ handler โดยใช้ HAL_NVIC_EnableIRQ()
    3.   ใช้ HAL_DMA_Start_IT() เพื่อสตาร์ท DMA transfer เมื่อ the source and destination addresses and the length of
          data ที่จะถูกส่งถ่ายถูกกำหนดค่าแล้ว. ในกรณีนี้ the DMA interrupt จะถูกกำหนดค่า.
    4.   ใช้ HAL_DMA_IRQHandler() ที่เรียกภายใต้ DMA_IRQHandler() Interrupt subroutine
    5.   เมื่อ data transfer เสร็จสมบูรณ์, HAL_DMA_IRQHandler() function ถูกปฏิบัติและ a user function สามารถถูกเรียกโดย
          การปรับแต่งตามต้องการ XferCpltCallback and XferErrorCallback function pointer (ตัวอย่างเช่น a member of DMA
          handle structure).
Title: Re: STM32F1 HAL
Post by: tha on June 21, 2022, 09:09:42 am
DMA HAL driver macros ที่ใช้มากที่สุดมีดังนี้:
•   __HAL_DMA_ENABLE: enables the specified DMA channel.
•   __HAL_DMA_DISABLE: disables the specified DMA channel.
•   __HAL_DMA_GET_FLAG: gets the DMA channel pending flags.
• _  _HAL_DMA_CLEAR_FLAG: clears the DMA channel pending flags.
•   __HAL_DMA_ENABLE_IT: enables the specified DMA channel interrupts.
•   __HAL_DMA_DISABLE_IT: disables the specified DMA channel interrupts.
•   __HAL_DMA_GET_IT_SOURCE: เช็คว่า the specified DMA channel interrupt ถูกเปิดใช้งานแล้วหรือไม่.

Note:   เมื่อ a peripheral ถูกใช้ใน DMA mode, the DMA initialization ควรถูกทำใน the HAL_PPP_MspInit() callback.
            นอกจากนี้, the user application ควรเชื่อมโยง the DMA handle กับ the PPP handle (ดูที่ section “HAL IO
            operation functions”).

Note:   DMA channel callbacks จำเป็นต้องถูกกำหนดค่าเริ่มต้นโดย the user application เฉพาะในกรณีของ memory-to-
            memory transfer. อย่างไรก็ตามเมื่อ peripheral-to-memory transfers ถูกใช้, these callbacks ถูกกำหนดค่าเริ่มต้นโดย
            อัตโนมัติโดยการเรียก a process API function ที่ใช้ the DMA.
Title: Re: STM32F1 HAL
Post by: tha on June 21, 2022, 10:00:42 am
3.12 How to use HAL drivers

3.12.1 HAL usage models
รูปต่อไปนี้แสดงการใช้งานทั่วไปของ the HAL driver และการตอบโต้ระหว่าง the application user, the HAL driver และ the interrupts.

(https://i.imgur.com/WC7JxkC.png)

Note:   The functions ที่จัดให้มีใช้ใน the HAL driver ถูกแสดงเป็นสีเขียว, the functions ที่เรียกจาก interrupt handlers ในเส้น
            ใข่ปลา, และ the msp functions  ที่จัดให้มีใช้ใน the user application ในสีแดง. เส้นทึบแสดงการตอบโต้ระหว่าง the user
            application functions.


โดยท่วไป, the HAL driver APIs ถูกเรียกจาก user files และที่เป็นตัวเลือกจาก interrupt handlers file เมื่อ the APIs ขึ้นอยู่กับ the DMA หรือ the PPP peripheral dedicated interrupts ถูกใช้.

เมื่อ DMA or PPP peripheral interrupts ถูกใช้, the PPP process complete callbacks ถูกเรียกเพื่อแจ้ง the user ให้ทราบเกี่ยวกับ the process completion ใน real-time event mode (interrupts). โปรดทราบว่า the same process completion callbacks ถูกใช้สำหรับ DMA ใน interrupt mode.
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 07:24:07 am
3.12.2 HAL initialization

3.12.2.1 HAL global initialization
นอกเหนือจาก the peripheral initialization และ de-initialization functions, a set of APIs ถูกจัดให้มีเพื่อกำหนดค่าเริ่มต้น the HAL core ที่จัดให้มีใข้ใน file stm32f1xx_hal.c.
•   HAL_Init(): ฟังชั่นนี้ต้องถูกเรียกที่ application startup เพื่อ
    –   กำหนดค่าเริ่มต้น data/instruction cache และ pre-fetch queue
    –   เซ็ต SysTick timer เพื่อสร้าง an interrupt แต่ละ 1ms (อ้างอิงจาก HSI clock) ด้วย the lowest priority
    –   เรียก HAL_MspInit() user callback function เพื่อดำเนินการ system level initializations (Clock, GPIOs, DMA,
         interrupts). HAL_MspInit() ถูกกำหนดเป็น “weak” empty function ใน the HAL drivers.
•   HAL_DeInit()
    –   รีเซ็ตทุก peripherals
    –  เรียก function HAL_MspDeInit() ซึ่งเป็น user callback function เพื่อกระทำ system level De-Initalizations.
•   HAL_GetTick(): ฟังชั่นนี้ได้รับ current SysTick counter value (ที่เพิ่มขึ้นใน SysTick interrupt) ที่ใช้โดย peripherals
     drivers เพื่อจัดการ timeouts.
•   HAL_Delay(). ฟังชั่นนี้จัดให้มีใช้ a delay (แสดงเป็น milliseconds) โดยใช้ the SysTick timer. ต้องระมัดระวังเมื่อใช้
     HAL_Delay() เนื่องจากฟังชั่นนี้จัดให้มี an accurate delay (แสดงเป็น milliseconds) ขึ้นอยู่กับตัวแปรที่เพิ่มขึ้นใน SysTick ISR.
     นี้หมายความว่าถ้า HAL_Delay() ถูกเรียกจาก a peripheral ISR, ดังนั้น the SysTick interrupt ต้องมี highest priority (ตัวเลข
     น้อยกว่า) มากกว่า the peripheral interrupt, มิฉะนั้น the caller ISR จะถูกบล็อก.
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 08:20:04 am
3.12.2.2 System clock initialization
The clock configuration ถูกทำที่ the beginning of the user code. อย่างไรก็ตามผู้ใช้สามารถเปลี่ยน the configuration of the clock ในโค้ดของตัวเอง.
โปรดหาข้างล่าง the typical Clock configuration sequence:
(https://i.imgur.com/yQMgssu.png)
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 09:23:27 am
3.12.2.3 HAL MSP initialization process
The peripheral initialization ถูกทำผ่านทาง HAL_PPP_Init() ในขณะที่ the hardware resources initialization ที่ใช้โดย a peripheral (PPP) ถูกดำเนินการในระหว่าง initialization นี้โดยการเรียก MSP callback function HAL_PPP_MspInit(). The MspInit callback ดำเนินการ the low level initialization ที่เกี่ยวข้องกับ the different additional hardware resources: RCC, GPIO, NVIC and DMA.

ทุก the HAL drivers ที่มีการจัดการรวมสอง MSP callbacks สำหรับ initialization and de-initialization:
(https://i.imgur.com/2WWGGx6.png)
The MSP callbacks ถูกประกาศอย่างว่างเปล่าเป็น weak functions ในแต่ละ peripheral driver. The user สามารถใช้พวกมันเพื่อเซ็ต the low level initialization code หรือละเว้นพวกมันและใช้ initialization routine ของตัวเอง.

The HAL MSP callback ถูกจัดให้มีใช้ภายใน the stm32f1xx_hal_msp.c file ใน the user folders. An stm32f1xx_hal_msp.c file template ถูกวางอยู่ใน the HAL folder และควรถูกก๊อปปี้ไปยัง the user folder. มันสามารถถูกสร้างโดยอัตโนมัติโดย STM32CubeMX tool และแก้ไขต่อไป. โปรดทราบว่าทุก the routines ถูกประกาศเป็น weak functions และสามารถถูกเขียนทับหรือเอาออกเพื่อใช้ user low level initialization code.

stm32f1xx_hal_msp.c file บรรจุ the following functions:
(https://i.imgur.com/vrfOfze.png)
โดยค่าเริ่มต้น, ถ้าไม่มี peripheral จำเป็นต้องถูกยกเลิกการกำหนดค่าเริ่มต้นในระหว่าง the program execution, the whole MSP initialization ถูกทำใน Hal_MspInit() และ MSP De-Initialization ใน the Hal_MspDeInit(). ในกรณีนี้ the HAL_PPP_MspInit() และ HAL_PPP_MspDeInit() ไม่ถูกจัดให้มีใช้.

เมื่ออย่างน้อยหนึ่ง peripherals จำเป็นต้องถูกยกเลิกการกำหนดค่าเริ่มต้นใน run time และ the low level resources ของ a given peripheral จำเป็นต้องถูกปลดปล่อยและถูกใช้โดย another peripheral, HAL_PPP_MspDeInit() and HAL_PPP_MspInit() ถูกจัดให้มีใช้สำหรับ peripheral ที่เกี่ยวข้องและ peripherals initialization and de-Initialization อื่นถูกเก็บใน the global HAL_MspInit() and the HAL_MspDeInit().

ถ้าไม่มีอะไรที่จะถูกกำหนดค่าเริ่มต้นโดย the global HAL_MspInit() and HAL_MspDeInit(), the two routines นี้สามารถถูกละเว้นได้ง่ายๆ.
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 10:27:42 am
3.12.3 HAL I/O operation process
The HAL functions ที่มี internal data processing อย่าง transmit, receive, write and read โดยทั่วไปถูกจัดให้มีด้วย three data processing modes ดังต่อไปนี้:
•   Polling mode
•   Interrupt mode
•   DMA mode

3.12.3.1 Polling mode
ใน Polling mode, the HAL functions ส่งคืนกลับ the process status เมื่อ the data processing in blocking mode เสร็จสมบูรณ์. The operation ถูกถือว่าเสร็จสมบูรณ์เมื่อ the function ส่งคืนกลับ the HAL_OK status, ถ้าเป็นอย่างอื่น an error status ถูกส่งคืนกลับ. ผู้ใช้สามารถได้รับข้อมูลที่มากขึ้นผ่านทาง the HAL_PPP_GetState() function. The data processing ถูกจัดการภายในใน a loop. A timeout (แสดงเป็น ms) ถูกใช้เพื่อป้องกัน process hanging. ตัวอย่างข้างล่างแสดง the typical Polling mode processing sequence :
(https://i.imgur.com/QBsLKM5.png)
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 11:05:20 am
3.12.3.2 Interrupt mode
ใน Interrupt mode, the HAL function ส่งคืนกลับ the process status หลังจากสตาร์ท the data processing และเปิดใช้งาน the appropriate interruption. The end of the operation ถูกแสดงให้เห็นโดย a callback ที่ประกาศเป็น a weak function. มันสามารถถูกปรับแต่งตามความต้องการโดย the user เพื่อที่จะถูกแจ้งให้ทราบใน real-time เกี่ยวกับ the process completion. The user สามารถได้รับ the process status ผ่านทาง the HAL_PPP_GetState() function อีกด้วย.

ใน Interrupt mode, four functions ถูกประกาศใน the driver:
•   HAL_PPP_Process_IT(): เริ่ม the process
•   HAL_PPP_IRQHandler(): the global PPP peripheral interruption
•   __weak HAL_PPP_ProcessCpltCallback (): the callback สัมพันธ์กับ the process completion.
•   __weak HAL_PPP_ProcessErrorCallback(): the callback สัมพันธ์กับ the process Error.

เพื่อใช้ a process ใน Interrupt mode, HAL_PPP_Process_IT() ถูกเรียกใน the user file และ HAL_PPP_IRQHandler ใน stm32f1xx_it.c.

The HAL_PPP_ProcessCpltCallback() function ถูกประกาศเป็น weak function ใน the driver. นี้หมายความว่าผู้ใช้สามารถประกาศมันอีกครั้งใน the application. The function ใน the driver ไม่ถูกแก้ไข.

ตัวอย่าของการใช้เป็นดังแสดงข้างล่าง:

main.c file:
(https://i.imgur.com/QfMRex2.png)

stm32f1xx_it.c file:
(https://i.imgur.com/04Q1lgj.png)
Title: Re: STM32F1 HAL
Post by: tha on June 22, 2022, 11:46:47 am
3.12.3.3 DMA mode
ใน DMA mode, the HAL function ส่งคืนกลับ the process status หลังจากสตาร์ท the data processing ผ่านทาง the DMA และหลังจากเปิดใช้งาน the appropriate DMA interruption. The end of the operation ถูกแสดงให้เห็นโดย a callback ที่ประกาศเป็น a weak function. มันสามารถถูกปรับแต่งตามความต้องการโดย the user เพื่อที่จะถูกแจ้งให้ทราบใน real-time เกี่ยวกับ the process completion. The user สามารถได้รับ the process status ผ่านทาง the HAL_PPP_GetState() function อีกด้วย.
สำหรับ the DMA mode, three functions ถูกประกาศใน the driver:

•   HAL_PPP_Process_DMA(): เริ่ม the process
•   HAL_PPP_DMA_IRQHandler(): the DMA interruption ที่ใช้โดย the PPP peripheral
•   __weak HAL_PPP_ProcessCpltCallback(): the callback สัมพันธ์กับ the process completion.
•   __weak HAL_PPP_ErrorCpltCallback(): the callback สัมพันธ์กับ the process Error.

เพื่อใช้ a process ใน DMA mode, HAL_PPP_Process_DMA() ถูกเรียกใน the user file และ the HAL_PPP_DMA_IRQHandler() ถูกวางใน the stm32f1xx_it.c. เมื่อ DMA mode ถูกใช้, the DMA initialization ถูกทำใน the HAL_PPP_MspInit() callback. ผู้ใช้ควรเชื่อมโยง the DMA handle เข้ากับ the PPP handle ด้วย. สำหรับวัตถุประสงค์นี้, the handles ของทุก the peripheral drivers ที่ใช้ the DMA ต้องถูกประกาศดังต่อไปนี้:
(https://i.imgur.com/LVRNnGr.png)

The initialization ถูกทำดังต่อไปนี้ (UART example):
(https://i.imgur.com/St0gznd.png)

The HAL_PPP_ProcessCpltCallback() function ถูกประกาศเป็น weak function ใน the driver. นี้หมายความว่าผู้ใช้สามารถประกาศมันอีกครั้งใน the application code. The function ใน the driver ไม่ควรถูกแก้ไข.

ตัวอย่าของการใช้เป็นดังแสดงข้างล่าง:

main.c file:
(https://i.imgur.com/4EryrTP.png)

stm32f1xx_it.c file:
(https://i.imgur.com/4D1jar2.png)

HAL_USART_TxCpltCallback() and HAL_USART_ErrorCallback() ควรถูกเชื่อมโยงใน the HAL_PPP_Process_DMA() function เข้ากับ the DMA transfer complete callback and the DMA transfer Error callback โดยการใช้ the following statement:
(https://i.imgur.com/fXUaSjL.png)
Title: Re: STM32F1 HAL
Post by: tha on June 23, 2022, 07:44:20 am
3.12.4 Timeout and error management

3.12.4.1 Timeout management
The timeout มักจะถูกใช้สำหรับ the APIs ที่ทำงานใน Polling mode. มันกำหนด the delay ในระหว่างที่ a blocking process ควรรอจนกว่า an error จะถูกส่งคืนกลับ. ตัวอย่างถูกจัดให้มีข้างล่าง:
(https://i.imgur.com/CZ6uaCz.png)

The timeout possible value เป็นดังต่อไปนี้:
(https://i.imgur.com/yVZlshp.png)

อย่างไรก็ตาม, ในบางกรณี, a fixed timeout ถูกใช้สำหรับ system peripherals หรือ internal HAL driver processes. ในกรณีเหล่านี้, the timeout มีความหมายเหมือนกันและถูกใช้ในลักษณะเดียวกัน ยกเว้นเมื่อมันถูกกำหนดแบบโลคอลไว้ใน the drivers และไม่สามารถถูกแก้ไขหรือนำมาใช้เป็น an argument ใน the user application.

Example of fixed timeout:
(https://i.imgur.com/54pXh5a.png)

The following example แสดงวิธีการใช้ the timeout ภายใน the polling functions:
(https://i.imgur.com/OWVDV1F.png)
Title: Re: STM32F1 HAL
Post by: tha on June 23, 2022, 09:08:37 am
3.12.4.2 Error management
The HAL drivers จัดให้มีใช้ a check บนรายการต่อไปนี้:
•   Valid parameters: สำหรับบางขบวนการ the used parameters ควรถูกต้องและกำหนดไว้แล้ว, มิฉะนั้น the system อาจขัดข้องหรือเข้าสู่สถานะไม่ได้กำหนด พารามิเตอร์ที่สำคัญเหล่านี้ได้รับการตรวจสอบก่อนถูกใช้งาน (ดูตัวอย่างด้านล่าง).
(https://i.imgur.com/H7qXqXL.png)

•   Valid handle: the PPP peripheral handle เป็น the most important argument เนื่องจากมันเก็บ the PPP driver vital parameters. มันถูกตรวจเช็คเสมอในจุดเริ่มต้นของ the HAL_PPP_Init() function.
(https://i.imgur.com/6zgPJ3F.png)

•   Timeout error: the following statement ถูกใช้เมื่อ a timeout error เกิดขึ้น:
(https://i.imgur.com/Gin82Or.png)

เมื่อ an error เกิดขึ้นในระหว่าง a peripheral process, HAL_PPP_Process () ส่งคืนกลับด้วย a HAL_ERROR status. The HAL PPP driver จัดให้มีใช้ the HAL_PPP_GetError () เพื่อยอมให้การดึงที่มาของ the error.
(https://i.imgur.com/MzHOe0c.png)

ในทุก peripheral handles, a HAL_PPP_ErrorTypeDef ถูกกำหนดและถูกใช้เพื่อเก็บ the last error code.
(https://i.imgur.com/auD9Phk.png)

The error state และ the peripheral global state ถูกอัฟเดตก่อนการส่งคืนกลับ an error เสมอ:
(https://i.imgur.com/6OPvduI.png)

HAL_PPP_GetError () ต้องถูกใช้ใน interrupt mode ใน the error callback:
(https://i.imgur.com/XkUib0F.png)
Title: Re: STM32F1 HAL
Post by: tha on June 23, 2022, 10:05:29 am
3.12.4.3 Run-time checking
The HAL จัดให้มีใช้ run-time failure detection โดยการตรวจเช็ค the input values ของทุก HAL driver functions. The runtime checking ถูกทำให้สำเร็จโดยการใช้ an assert_param macro. macro นี้ถูกใช้ในทุก the HAL driver functions ซึ่งมี an input parameter. มันช่วยให้ตรวจสอบได้ว่า the input value อยู่ภายใน the parameter allowed values.

เพื่อเปิดใช้งาน the run-time checking, ใช้ the assert_param macro, และทิ้ง the define USE_FULL_ASSERT ไว้ไม่คอมเม้นต์ออกใน stm32f1xx_hal_conf.h file.
(https://i.imgur.com/4IiN3g7.png)

ถ้า the expression ที่ส่งผ่านไปยัง the assert_param macro ล้มเหลว, the assert_failed function ถูกเรียกและส่งคืนกลับ the name of the source file และ the source line number ของ the call ที่ล้มเหลวนั้น. ถ้า the expression เป็นจริง, ไม่มีค่าใดถูกส่งคืนกลับ.

The assert_param macro ถูกจัดให้มีใช้ใน stm32f1xx_hal_conf.h:
(https://i.imgur.com/1a3WdjP.png)

The assert_failed function ถูกจัดให้มีใช้ใน the main.c file หรือใน any other user C file:
(https://i.imgur.com/zdQDlB3.png)

Note:   เนื่องจากนำสู่โอเวอร์เฮดของ run-time checking, ขอแนะนำให้ใช้มันในระหว่าง application code development and
           debugging, และเอามันออกจาก the final application เพื่อปรับปรุง code size and speed ให้ดีขึ้น.
Title: Re: STM32F1 HAL
Post by: tha on June 23, 2022, 03:07:39 pm
4   Overview of low-layer drivers

The low-layer (LL) drivers ถูกออกแบบเพื่อนำเสนอ a fast light-weight expert-oriented layer ซึ่งจะใกล้ชิดกับ the hardware มากกว่า the HAL. ตรงกันข้ามกับ the HAL, LL APIs ไม่ถูกจัดให้มีสำหรับ peripherals ที optimized access ไม่ใช่ a key feature, หรือเหล่านั้นที่ต้องการ heavy software configuration และ/หรือ complex upper-level stack (อย่างเช่น USB).

The LL drivers feature:
•   A set of functions เพื่อกำหนดค่าเริ่มต้น peripheral main features สอดคล้องกันกับ the parameters ที่ระบุใน data structures
•   A set of functions ที่ใช้เพื่อเติมการกำหนดค่าเริ่มต้น data structures ด้วย the reset values ของแต่ละฟิลด์
•   Functions ดำเนินการ peripheral de-initialization (peripheral registers คืนกลับไปยังค่าเริ่มต้นของมัน)
•   A set of inline functions สำหรับ direct and atomic register access
•   เป็นอิสระอย่างเต็มที่จาก HAL เนื่องจาก LL drivers สามารถถูกใช้อย่างใดอย่างหนึ่ง in standalone mode (โดยไม่มี HAL drivers)
     หรือ in mixed mode (พร้อมด้วย HAL drivers)
•   ครอบคลุมอย่างเต็มที่ the supported peripheral features.
Title: Re: STM32F1 HAL
Post by: tha on June 23, 2022, 03:19:56 pm
The low-layer drivers จัดให้มี hardware services ขึ้นอยู่กับ the available features ของ the STM32 peripherals. การบริการเหล่านี้สะท้อน the hardware capabilities อย่างชัดเจนและจัดให้มี one-shot operations ที่ต้องถูกเรียกตามติด the programming model ที่อธิบายใน the microcontroller line reference manual. ด้วยเหตุนี้, the LL services ไม่จัดให้มีใช้ขบวนการใดๆและไม่ต้องการ any additional memory resources เพื่อบันทึก states, counter หรือ data pointers ของพวกมัน: ทุก the operations ถูกดำเนินการโดยการเปลี่ยน the associated peripheral registers content.
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 07:24:38 am
4.1   Low-layer files

The low-layer drivers ถูกสร้างรอบๆ header/C files (หนึ่งต่อแต่ละ supported peripheral) บวก five header files สำหรับบาง System and Cortex related features.
(https://i.imgur.com/VkJNgrU.png)

Note:   ไม่มี configuration file สำหรับ the LL drivers.

(https://i.imgur.com/87T9ot0.png)

(https://i.imgur.com/5iHCZSx.png)

Application files ต้องรวมเฉพาะ the used low-layer driver header files.
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 08:35:20 am
4.2 Overview of low-layer APIs and naming rules

4.2.1 Peripheral initialization functions
The LL drivers เสนอ three sets of initialization functions. พวกมันถูกกำหนดใน stm32f1xx_ll_ppp.c file:
•   A set of functions เพื่อกำหนดค่าเริ่มต้น peripheral main features สอดคล้องกันกับ the parameters ที่ระบุใน data structures
•   A set of functions ที่ใช้เพื่อเติมการกำหนดค่าเริ่มต้น data structures ด้วย the reset values ของแต่ละฟิลด์
•   Functions สำหรับ peripheral de-initialization (peripheral registers คืนกลับไปยังค่าเริ่มต้นของมัน)

The definition ของ LL initialization functions เหล่านี้และ associated resources (structure, literals and prototypes) มีข้อแม้โดย a compilation switch: USE_FULL_LL_DRIVER. เพื่อใช้ฟังชั่นเหล่านี้, switch นี้ต้องถูกเพิ่มใน the toolchain compiler preprocessor หรือไปยัง any generic header file ซึ่งถูกประมวลผลก่อน the LL drivers.

ตารางข้างล่างแสดงรายการของ the common functions ที่จัดให้มีสำหรับทุก the supported peripherals:
(https://i.imgur.com/0G9B9KB.png)

Additional functions มีให้ใช้งานสำหรับบาง peripherals (ดูที่ Table 18. Optional peripheral initialization functions ).
(https://i.imgur.com/mdvDCX0.png)

(https://i.imgur.com/YD4ABFA.png)
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 08:56:00 am
4.2.1.1 Run-time checking
เหมือนกับ HAL drivers, LL initialization functions จัดให้มีใช้ run-time failure detection โดยการตรวจเช็ค the input values ของทุก LL driver functions. สำหรับรายละเอียดที่มากขึ้นโปรดดู Section 3.12.4.3 Run-time checking.
เมื่อใช้ the LL drivers ใน standalone mode (โดยไม่มีการเรียก HAL functions), the following actions ถูกต้องการเพื่อใช้ run-time checking:
1.   ก๊อปปี้ stm32_assert_template.h ไปยัง the application folder และเปลี่ยนชื่อมันเป็น stm32_assert.h. ไฟล์นี้กำหนด the
      assert_param macro ซึ่งถูกใช้เมื่อ run-time checking ถูกเปิดใช้งาน.
2.   รวม stm32_assert.h file ไว้ภายใน the application main header file.
3.   เพิ่ม the USE_FULL_ASSERT compilation switch ใน the toolchain compiler preprocessor หรือใน any generic
      header file ซึ่งถูกประมวลผลก่อน the stm32_assert.h driver.

Note:   Run-time checking ไม่มีให้ใช้งานสำหรับ LL inline functions.
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 09:34:53 am
4.2.2 Peripheral register-level configuration functions
บนส่วนบนของ the peripheral initialization functions, the LL drivers นำเสนอ a set of inline functions สำหรับ direct atomic register access. รูปแบบของพวกมันเป็นดังต่อไปนี้:
(https://i.imgur.com/8zxT3Zu.png)

The “Function” naming ถูกกำหนดขึ้นอยู่กับ the action category:
•   Specific Interrupt, DMA request and status flags management: Set/Get/Clear/Enable/Disable flags on
     interrupt and status registers
(https://i.imgur.com/AOHwJfC.png)

(https://i.imgur.com/HVFPre4.png)
Note: BITNAME อ้างอิงถึง the peripheral register bit name ตามที่อธิบายใน the product line reference manual.

•   Peripheral clock activation/deactivation management: Enable/Disable/Reset a peripheral clock
(https://i.imgur.com/uGPbwWt.png)
Note: 'x' ตรงกันกับ the group index และอ้างอิงถึง the index of the modified register บน a given bus. 'bus' ตรงกันกับ the bus name.

•   Peripheral activation/deactivation management : Enable/disable a peripheral or activate/deactivate specific
     peripheral features
(https://i.imgur.com/O5ka1FT.png)

•   Peripheral configuration management : Set/get a peripheral configuration settings
(https://i.imgur.com/CuVw0Dj.png)

•   Peripheral register management : Write/read the content of a register/retrun DMA relative register address
(https://i.imgur.com/pPLJ39C.png)
Note: The Propriety คือ a variable ที่ใช้เพื่อระบุ the DMA transfer direction หรือ the data register type.
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 10:28:18 am
5   Cohabiting of HAL and LL

The low-ayer APIs ถูกออกแบบเพื่อให้ถูกใช้ใน standalone mode หรือรวมกันกับ the HAL. พวกมันไม่สามารถถูกใช้โดยอัตโนมัติพร้อมกับ the HAL สำหรับ the same peripheral instance. ถ้าคุณใช้ the LL APIs สำหรับ a instance ที่ระบุ, คุณยังคงสามารถใช้ the HAL APIs สำหรับ instances อื่น. โปรดระมัดระวังว่า the low-layer APIs อาจเขียนทับบาง registers ซึ่ง content ถูกส่องใน the HAL handles.

5.1 Low-layer driver used in Standalone mode

The low-layer APIs สามารถถูกใช้โดยไม่มีการเรียก the HAL driver services. นี้ถูกทำโดยเพียงแค่รวม stm32f1xx_ll_ppp.h ใน the application files. The LL APIs for a given peripheral ถูกเรียกโดยการปฏิบัติลำดับที่เหมือนกันกับ the one ที่แนะนำโดย the programming model ใน the corresponding product line reference manual. ในกรณีนี้ the HAL drivers ที่เกี่ยวข้องกับ the used peripheral สามารถถูกเอาออกจาก the workspace. อย่างไรก็ตาม the STM32CubeF1 framework ควรถูกใช้ในวิธีเดียวกันกับใน the HAL drivers case ซึ่งหมายความว่า System file, startup file and CMSIS ควรถูกใช้เสมอ.

Note:   เมื่อ the BSP drivers ถูกรวม, the used HAL drivers ที่เกี่ยวข้องกันกับ the BSP functions drivers ควรถูกรวมใน the
            workspace, แม้ว่าพวกมันไม่ถูกใช้โดย the application layer.
Title: Re: STM32F1 HAL
Post by: tha on June 24, 2022, 11:04:46 am
5.2 Mixed use of low-layer APIs and HAL drivers

ในกรณีนี้ the low-layer APIs ถูกใช้ร่วมกันกับ the HAL drivers เพื่อสำเร็จ direct and register level based operations.

การใช้ผสมถูกอนุญาต, อย่างไรก็ตามบาง consideration ควรถูกคำนึงถึง:
•   ขอแนะนำให้หลีกเลี่ยงการใช้ the HAL APIs และ the combination of low-layer APIs พร้อมกันสำหรับ a given peripheral
     instance. หากเป็นกรณีนี้, private fields อย่างน้อยหนึ่งใน the HAL PPP handle structure ควรถูกอัฟเดตสอดคล้องกัน.
•   สำหรับ operations and processes ที่ไม่เปลี่ยนแปลง the handle fields รวมถึง the initialization structure, the HAL
     driver APIs and the low-layer services สามารถถูกใช้ด้วยกันได้สำหรับ the same peripheral instance.
•   The low-layer drivers สามารถถูกใช้โดยไม่มีข้อจำกัดใดๆพร้อมกันกับทุก the HAL drivers ที่ไม่ขึ้นอยู่ handle objects (RCC,
     common HAL, flash and GPIO).

หลายตัวอย่างแสดงวิธีใช้ HAL and LL ใน the same application ถูกจัดให้มีภายใน stm32f1 firmware package (ดูที่ Examples_MIX projects).

Note:   1.  เมื่อ the HAL Init/DeInit APIs ไม่ถูกใช้และถูกแทนที่ด้วย the low-layer macros, the InitMsp() functions ไม่ถูก
                 เรียกและ the MSP initialization ควรถูกทำใน the user application.
           2.   เมื่อ process APIs ไม่ถูกใช้และ the corresponding function ถูกดำเนินการผ่านทาง the low-layer APIs, the
                 callbacks ไม่ถูกเรียกและ post processing หรือ error management ควรถูกทำโดย the user application.
           3.   เมื่อ the LL APIs ถูกใช้สำหรับ process operations, the IRQ handler HAL APIs ไม่สามารถถูกเรียกและ the IRQ
                 ควรถูกจัดให้มีใช้โดย the user application. แต่ละ LL driver จัดให้มีใช้ the macros ที่จำเป็นต้องอ่านและเคลียร์ the
                 associated interrupt flags.