4.9. Hardware Abstraction Layer (HAL)

The HAL is used by the MCAF to decouple all knowledge of device-specific hardware registers, via well-known function calls. The HAL is made up of two layers: MPLAB® Code Configurator (MCC) layer and HAF layer. The MCC layer is the base layer where device-specific hardware registers are abstracted out into a series of peripheral driver APIs. The HAF layer then calls functions in the MCC layer to abstract out device specific functionality, enabling the higher level MCAF layers to be device independent.

As long as the HAL function names and semantics are preserved, the HAL component can be swapped out and replaced with an alternative implementation.

4.9.2. Implementation

4.9.2.1. MCC integration

Prior to MCAF R3, generated code was not integrated with MCC; MCAF provided its own HAL completely.

4.9.2.1.1. MCAF R3

In MCAF R3, the following items have been removed from MCAF and made the responsibility of MCC:

  • Configuration bits
  • Oscillator setup

Some aspects of the MCC system module are still present in MCAF. Both MCC and MCAF code executes; the MCAF code runs later and overrides any settings from MCC. The following areas are handled both by MCC and MCAF:

  • GPIO configuration
  • Interrupt initialization
  • CORCON initialization

This overlap is temporary, and these areas are planned to be shifted fully to MCC.

Other modules such as ADC and PWM are configured solely by MCAF, and will be shifted to MCC in a future version of MCAF.

4.9.2.1.2. MCAF R4

In MCAF R4, the following items have been removed from MCAF and made the responsibility of MCC:

  • GPIO configuration
  • Interrupt module
  • CORCON initialization
  • PWM module
  • ADC module
  • Timer module
  • UART module
  • DMA module
  • Watchdog module
  • LEDs module
  • Switches module
  • Pin Management (partially)

MCC handles all peripheral initialization, pin initialization, pin management, and is the base layer for interacting with hardware. Currently, because MCC does not yet support QEI, pin management cannot be fully handled by MCC alone. First, the MCC system module configures all peripherals including device pin management. Then, after the MCC system module is done with configuration, MCAF pin management is run as well to initialize QEI pins. The QEI module is fully handled by MCAF and will be shifted to MCC when QEI support is available in MCC for 16-bit devices.

Most hardware access actions occur through the HAF layer but a few calls to the MCC peripheral layer are made directly from the MCAF application. In the future, all hardware access will be delegated to the HAF layer. This is to avoid coupling between the MCAF application and MCC.

HAL_InterruptVectorNumberGet() is a function that has been added to the HAF layer. This function retrieves the interrupt vector number, and does not directly go through MCC to do so.

More information about MCC configuration in MCAF is available in the MCC Peripheral documentation.

4.9.2.1.3. MCAF R5

  • Added support for dsPIC33CK256MP508.
  • All peripheral and hardware related functions called by MCAF are made through the Hardware Access Functions layer.
  • MCAF requires certain instances of peripherals. Required instances are: PWM, ADC1, TMR1, SCCP1-TMR/TMR2, UART1 and QEI1
  • MCC handles most peripheral generated code except for QEI and clearing of the fault interrupt status bits.

4.9.2.1.4. MCAF R6

  • Added support for dsPIC33CK64MP105, and dsPIC33CK64MC105.
  • MCC now handles all of the peripheral generated code except for QEI.
  • Board service module restructured to split into PWM bootstrap charging and board handler sections

4.9.2.2. HAL errata

  • MCAF_BootstrapChargeStepIsr() includes a soft-start sequence intended to slowly turn on duty cycle and reduce gate drive power supply loading in order to charge up bootstrap capacitors. This sequence starts with duty cycles that are too low, and may produce runt pulses with certain gate drivers. (DB_MC-978; Applicability: MCAF R2 – R6.)