Built-in Routines

The mikroC PRO for PIC32 compiler provides a set of useful built-in utility functions.

The Lo, Hi, Higher, Highest, LoWord, HiWord routines are implemented as macros. If you want to use these functions you must include built_in.h header file (located in the inlclude folder of the compiler) into your project.

The Delay_us and Delay_ms routines are implemented as “inline”; i.e. code is generated in the place of a call, so the call doesn’t count against the nested call limit.

The Vdelay_ms, Vdelay_advanced_ms, Delay_Cyc, Delay_Cyc_Long, Get_Fosc_kHz and Get_Fosc_Per_Cyc are actual C routines. Their sources can be found in Delays.c file located in the uses folder of the compiler.

Lo

Prototype

#define Lo(param) ((char *)&param)[0]

Description

The function returns low byte of param. The function does not interpret bit patterns of param – it merely returns 8 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

Low byte of param, bits 7..0.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = Lo(d);  // Equals 0x78

Lo(d) = 0xAA; // d equals 0x123456AA
Notes

None.

Hi

Prototype

#define Hi(param) ((char *)&param)[1]

Description

The function returns high byte of param. The function does not interpret bit patterns of param – it merely returns 8 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

High byte of param, bits 15..8.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = Hi(d);  // Equals 0x56

Hi(d) = 0xAA; // d equals 0x1234AA78
Notes

None.

Higher

Prototype

#define Higher(param) ((char *)&param)[2]

Description

The function returns higher byte of param. The function does not interpret bit patterns of param – it merely returns 8 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

Higher byte of param, bits 23..16.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = Higher(d);  // Equals 0x34

Higher(d) = 0xAA; // d equals 0x12AA5678
Notes

None.

Highest

Prototype

#define Highest(param) ((char *)&param)[3]

Description

The function returns highest byte of param. The function does not interpret bit patterns of param – it merely returns 8 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

Highest byte of param, bits 31..24.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = Highest(d);  // Equals 0x12

Highest(d) = 0xAA; // d equals 0xAA345678
Notes

None.

LoWord

Prototype

unsigned int LoWord(unsigned long param);

Description

The function returns low word of param. The function does not interpret bit patterns of param – it merely returns 16 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

Low word of param, bits 15..0.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = LoWord(d);  // Equals 0x5678

LoWord(d) = 0xAAAA; // d equals 0x1234AAAA
Notes

None.

HiWord

Prototype

unsigned int HiWord(unsigned long param);

Description

The function returns high word of param. The function does not interpret bit patterns of param – it merely returns 16 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

High word of param, bits 31..16.

Requires

Nothing.

Example
d = 0x12345678; 	
tmp = HiWord(d);  // Equals 0x1234

HiWord(d) = 0xAAAA; // d equals 0xAAAA5678
Notes

None.

LoLongWord

Prototype

#define LoLongWord(param) ((unsigned long*)&param)[0]

Description

The function returns low longword of param. The function does not interpret bit patterns of param – it merely returns 32 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

Low longword of param, bits 31..0.

Requires

Nothing.

Example
d = 0x1122334455667788;
tmp = LoLongWord(d);  // Equals 0x55667788

LoLongWord(d) = 0xAAAAAAAA; // d equals 0x11223344AAAAAAAA
Notes

None.

HiLongWord

Prototype

#define HiLongWord(param) ((unsigned long*)&param)[1]

Description

The function returns high longword of param. The function does not interpret bit patterns of param – it merely returns 32 bits as found in register.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • param: input number.
Returns

High word of param, bits 63..32.

Requires

Nothing.

Example
d = 0x1122334455667788;
tmp = HiLongWord(d);  // Equals 0x11223344

HiLongWord(d) = 0xAAAAAAAA; // d equals 0xAAAAAAAA55667788
Notes

None.

Delay_us

Prototype

void Delay_us(const unsigned long time_in_us);

Description

Creates a software delay in duration of time_in_us microseconds.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • time_in_us: delay time in microseconds. Valid values: constant values, range of applicable constants depends on the oscillator frequency
Returns

Nothing.

Requires

Nothing.

Example
Delay_us(10);  /* Ten microseconds pause */
Notes

None.

Delay_ms

Prototype

void Delay_ms(const unsigned int time_in_ms);

Description

Creates a software delay in duration of time_in_ms milliseconds.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters
  • time_in_ms: delay time in milliseconds. Valid values: constant values, range of applicable constants depends on the oscillator frequency
Returns

Nothing.

Requires

Nothing.

Example
Delay_ms(1000);  /* One second pause */
Notes

For generating delays with variable as input parameter use the Vdelay_ms routine.

Vdelay_ms

Prototype

void Vdelay_ms(unsigned Time_ms);

Description

Creates a software delay in duration of Time_ms milliseconds. Generated delay is not as precise as the delay created by Delay_ms.

Parameters
  • Time_ms: delay time in milliseconds
Returns

Nothing.

Requires

Nothing.

Example
unsignedpause = 1000;
...
Vdelay_ms(pause);  // ~ one second pause
Notes

Vdelay_ms is a library function rather than a built-in routine; it is presented in this topic for the sake of convenience.

VDelay_Advanced_ms

Prototype

void VDelay_Advanced_ms(unsigned time_in_ms, unsigned Current_Fosc_kHz);

Description

Creates a software delay in duration of time_in_ms milliseconds (a variable), for a given oscillator frequency. Generated delay is not as precise as the delay created by Delay_ms.

Parameters
  • Time_ms: delay time in milliseconds
  • Current_Fosc_kHz: desiredoscillator frequency
Returns

Nothing.

Requires

Nothing.

Example
pause = 1000;
fosc = 10000;

VDelay_Advanced_ms(pause, fosc);  // Generates approximately one second pause, for a oscillator frequency of 10 MHz
Notes

Note that VDelay_Advanced_ms is library function rather than a built-in routine; it is presented in this topic for the sake of convenience.

Delay_Cyc

Prototype

void Delay_Cyc(unsigned int x, unsigned int y);

Description

Creates a delay based on MCU clock. Delay lasts for x*16384 + y MCU clock cycles.

Parameters
  • x: NumberOfCycles divided by 16384
  • y: remainder of the NumberOfCycles/16384 division
Returns

Nothing.

Requires

Nothing.

Example
Delay_Cyc(1, 10);  /* 1x16384 + 10 = 16394 cycles pause */
Notes

Delay_Cyc is a library function rather than a built-in routine; it is presented in this topic for the sake of convenience.

Delay_Cyc_Long

Prototype

void Delay_Cyc_Long(unsigned long CycNo);

Description

Creates a delay based on MCU clock. Delay lasts for CycNo MCU clock cycles.

Parameters
  • CycNo: number of cycles
Returns

Nothing.

Requires

Nothing.

Example
Delay_Cyc_Long(16394);  // 16394 cycles pause
Notes

Delay_Cyc_Long is a library function rather than a built-in routine; it is presented in this topic for the sake of convenience.

Clock_kHz

Prototype

unsigned long Clock_kHz();

Description

Function returns device clock in kHz, rounded to the nearest integer.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters

None.

Returns

Device clock in kHz, rounded to the nearest integer.

Requires

Nothing.

Example
unsigned long clk;
...
clk = Clock_kHz();
Notes

None.

Clock_Mhz

Prototype

unsigned long Clock_MHz();

Description

Function returns device clock in MHz, rounded to the nearest integer.

This is an “inline” routine; code is generated in the place of the call, so the call doesn’t count against the nested call limit.

Parameters

None.

Returns

Device clock in MHz, rounded to the nearest integer.

Requires

Nothing.

Example
unsigned long clk;
...
clk = Clock_Mhz();
Notes

None.

Get_Fosc_kHz

Prototype

unsigned long Get_Fosc_kHz();

Description

Function returns device clock in kHz, rounded to the nearest integer.

Note that Get_Fosc_kHz is library function rather than a built-in routine; it is presented in this topic for the sake of c?nvenience.

Parameters

None.

Returns

Device clock in kHz, rounded to the nearest integer.

Requires

Nothing.

Example
unsigned long clk;
...
clk = Get_Fosc_kHz();
Notes

None.

Get_Fosc_Per_Cyc

Prototype

unsigned int Get_Fosc_Per_Cyc();

Description

Function returns device's clock per cycle, rounded to the nearest integer.

Note that Get_Fosc_Per_Cyc is library function rather than a built-in routine; it is presented in this topic for the sake of convenience.

Parameters

None.

Returns

Device's clock per cycle, rounded to the nearest integer.

Requires

Nothing.

Example
unsigned int clk_per_cyc;
...
clk_per_cyc = Get_Fosc_Per_Cyc();
Notes

None.

KVA0_TO_KVA1

Prototype

unsigned long KVA0_TO_KVA1(const unsigned long Address);

Description

Function converts virtual address from KSEG0 to the virtual address in the KSEG1.

Parameters

Desired Virtual address in the KSEG0.

Returns

Virtual address in the KSEG1.

Requires

Nothing.

Example
KVA0_TO_KVA1(0x9FC00000);
Notes

None.

KVA1_TO_KVA0

Prototype

unsigned long KVA1_TO_KVA0(const unsigned long Address);

Description

Function converts virtual address from KSEG1 to the virtual address in the KSEG0.

Parameters

Desired Virtual address in the KSEG1.

Returns

Virtual address in the KSEG0.

Requires

Nothing.

Example
KVA1_TO_KVA0(0xBFC00000);
Notes

None.

KVA_TO_PA

Prototype

unsigned long KVA_TO_PA(const unsigned long Address);

Description

Function converts virtual address from any Kernel segment to the appropriate physical address.

Parameters

Desired Virtual Address.

Returns

Appropriate physical address.

Requires

Nothing.

Example
KVA_TO_PA(0xBFC00000);
Notes

None.

PA_TO_KVA0

Prototype

unsigned long PA_TO_KVA0(const unsigned long Address);

Description

Function converts physical address to the virtual address in the KSEG0.

Parameters

Desired physical address.

Returns

Appropriate virtual address in the KSEG0.

Requires

Nothing.

Example
PA_TO_KVA0(0x1D000000);
Notes

None.

PA_TO_KVA1

Prototype

unsigned long PA_TO_KVA1(const unsigned long Address);

Description

Function converts physical address to the virtual address in the KSEG1.

Parameters

Appropriate virtual address in the KSEG1.

Returns

Virtual address in the KSEG1.

Requires

Nothing.

Example
PA_TO_KVA1(0x1D000000);
Notes

None.

CP0_GET

Prototype

unsigned long CP0_GET(TCPOReg register);

Description

Function returns the value of the coprocessor register or part of the register, based upon the argument entered.

Parameters

Parameter must be a constant from the enumerated built-in constants list, which can be found at the bottom of this page.

Returns

Value of the coprocessor register or part of the register.

Requires

Nothing.

Example
unsigned long register_value;

register_value = CP0_GET(CP0_CONFIG);
Notes

None.

CP0_SET

Prototype

void CP0_SET(TCPOReg register, unsigned long value);

Description

Function sets the value of the coprocessor register or part of the register, based upon the register argument.

Parameters
  • register: Register or register part, must be a constant from the enumerated built-in constants list, which can be found at the bottom of this page.
  • value: Register Value.
Returns

Nothing.

Requires

Nothing.

Example
CP0_SET(CP0_CONFIG, 0x1A2C0000);
Notes

None.

RestoreInterrupts

Prototype

void RestoreInterrupts(unsigned long status);

Description

Restores (enables or disables) interrupt flag based on the last STATUS register value given as a routine parametar.

If the STATUS.B0 = 1 interrupts are enabled, if not, interrupts are disabled.

Parameters

None.

Returns

Returns the value stored in the STATUS register before the interrupts were enabled/disabled.

Requires

Nothing.

Example

Notes

None.

EI

Prototype

function EI() : dword;

Description

Function enables interrupts.

Parameters

None.

Returns

Returns the value stored in the STATUS register before the interrupts were enabled/disabled.

Requires

Nothing.

Example
status_value = EI();
Notes

None.

EnableInterrupts

Prototype

void EnableInterrupts();

Description

Function enables interrupts.

Parameters

None.

Returns

Returns the value stored in the STATUS register before the interrupts were enabled/disabled.

Requires

Nothing.

Example
EnableInterrupts();
Notes

None.

DI

Prototype

void DI();

Description

Function disables interrupts.

Parameters

None.

Returns

Returns the value stored in the STATUS register before the interrupts were enabled/disabled.

Requires

Nothing.

Example
DisableInterrupts();
Notes

None.

DisableInterrupts

Prototype

void DisableInterrupts();

Description

Function disables interrupts.

Parameters

Returns the value stored in the STATUS register before the interrupts were enabled/disabled.

Returns

Nothing.

Requires

Nothing.

Example
DisableInterrupts();
Notes

None.

Reset

Prototype

void Reset();

Description

This procedure is equal to assembler instruction reset.

Parameters

None.

Returns

Nothing.

Requires

Nothing.

Example
Reset(); // Resets the MCU
Notes

None.

DmaSuspend

Prototype

unsigned long DmaSuspend();

Description

Function suspends the DMA controller.

Parameters

None.

Returns
  • 1 if the DMA was previously suspended.
  • 0 otherwise.
Requires

Nothing.

Example

Notes

This routine is used only if the MCU possesses the DMA controller.

DmaResume

Prototype

void DmaResume(unsigned long susp);

Description

Restores the DMA controller activity to the previous, suspended state.

Parameters
  • susp: desired DMA suspended state.
Returns

Nothing.

Requires

Nothing.

Example


          
Notes

This routine is used only if the MCU possesses the DMA controller.

SystemUnlock

Prototype

void SystemUnlock(unsigned long *intStat, unsigned long *dmaSusp);

Description

Procedure unlocks the system, setting the interrupts disabled and the DMA operation suspended.

Parameters
  • intStat: desired DMA state.
  • dmaSusp: desired interrupt state.
Returns

Nothing.

Requires

Nothing.

Example

Notes

If the DMA controller is not present, the dmaSusp parameter doesn't exist.

SystemLock

Prototype

void SystemLock(unsigned long intStat, unsigned long dmaSusp);

Description

Procedure locks the system, setting the interrupts and the DMA controller from the passed parameters.

Parameters
  • intStat: desired DMA state.
  • dmaSusp: desired interrupt state.
Returns

Nothing.

Requires

Nothing.

Example

Notes

If the DMA controller is not present, the dmaSusp parameter doesn't exist.

Coprocessor Registers
CP0_HWRENA CP0_BADVADDR CP0_COUNT CP0_COMPARE CP0_STATUS
CP0_INTCTL CP0_SRSCTL CP0_SRSMAP CP0_CAUSE CP0_EPC
CP0_PRID CP0_EBASE CP0_CONFIG CP0_CONFIG1 CP0_CONFIG2
CP0_CONFIG3 CP0_DEBUG CP0_TRACECONTROL CP0_TRACECONTROL2 CP0_USERTRACEDATA
CP0_TRACEBPC CP0_DEBUG2 CP0_DEPC CP0_ERROREPC CP0_DESAVE

Coprocessor Register Fields
CP0_HWRENA_MASK CP0_STATUS_IE CP0_STATUS_EXL CP0_STATUS_ERL CP0_STATUS_UM
CP0_STATUS_IM0 CP0_STATUS_IM1 CP0_STATUS_IPL CP0_STATUS_IM2 CP0_STATUS_IM3
CP0_STATUS_IM4 CP0_STATUS_IM5 CP0_STATUS_IM6 CP0_STATUS_IM7 CP0_STATUS_CEE
CP0_STATUS_NMI _CPO_STATUS_SR CP0_STATUS_TS CP0_STATUS_BEV CP0_STATUS_RE
CP0_STATUS_FR CP0_STATUS_RP CP0_STATUS_CU0 CP0_STATUS_CU1 CP0_STATUS_CU2
CP0_STATUS_CU3 CP0_INTCTL_VS CP0_INTCTL_IPPCI CP0_INTCTL_IPTI CP0_SRSCTL_CSS
CP0_SRSCTL_PSS CP0_SRSCTL_ESS CP0_SRSCTL_EICSS CP0_SRSCTL_HSS CP0_SRSMAP_SSV0
CP0_SRSMAP_SSV1 CP0_SRSMAP_SSV2 CP0_SRSMAP_SSV3 CP0_SRSMAP_SSV4 CP0_SRSMAP_SSV5
CP0_SRSMAP_SSV6 CP0_SRSMAP_SSV7 CP0_CAUSE_EXCCODE CP0_CAUSE_IP0 CP0_CAUSE_IP1
CP0_CAUSE_RIPL CP0_CAUSE_IP2 CP0_CAUSE_IP3 CP0_CAUSE_IP4 CP0_CAUSE_IP5
CP0_CAUSE_IP6 CP0_CAUSE_IP7 CP0_CAUSE_WP CP0_CAUSE_IV CP0_CAUSE_PCI
CP0_CAUSE_DC CP0_CAUSE_CE CP0_CAUSE_TI CP0_CAUSE_BD CP0_PRID_REVISION
CP0_PRID_PATCHREV CP0_PRID_MINORREV CP0_PRID_MAJORREV CP0_PRID_PROCESSORID CP0_PRID_COMPANYID
CP0_EBASE_CPUNUM CP0_EBASE_EBASE CP0_CONFIG_K0 CP0_CONFIG_MT CP0_CONFIG_AR
CP0_CONFIG_AT CP0_CONFIG_BE CP0_CONFIG_DS CP0_CONFIG_MDU CP0_CONFIG_SB
CP0_CONFIG_UDI CP0_CONFIG_KU CP0_CONFIG_M CP0_CONFIG1_FP CP0_CONFIG1_EP
CP0_CONFIG1_CA CP0_CONFIG1_WR CP0_CONFIG1_PC CP0_CONFIG1_MD CP0_CONFIG1_C2
CP0_CONFIG1_DA CP0_CONFIG1_DL CP0_CONFIG1_DS CP0_CONFIG1_IA CP0_CONFIG1_IL
CP0_CONFIG1_IS CP0_CONFIG1_MMUSIZE CP0_CONFIG1_M CP0_CONFIG2_M CP0_CONFIG3_TL
CP0_CONFIG3_SM CP0_CONFIG3_SP CP0_CONFIG3_VINT CP0_CONFIG3_VEIC CP0_CONFIG3_ITL
CP0_CONFIG3_M CP0_DEBUG_DSS CP0_DEBUG_DBP CP0_DEBUG_DDBL CP0_DEBUG_DDBS
CP0_DEBUG_DIB CP0_DEBUG_DINT CP0_DEBUG_DIBIMPR CP0_DEBUG_R CP0_DEBUG_SST
CP0_DEBUG_NOSST CP0_DEBUG_DEXCCODE CP0_DEBUG_VER CP0_DEBUG_DDBLIMPR CP0_DEBUG_DDBSIMPR
CP0_DEBUG_IEXI CP0_DEBUG_DBUSEP CP0_DEBUG_CACHEEP CP0_DEBUG_MCHECKP CP0_DEBUG_IBUSEP
CP0_DEBUG_COUNTDM CP0_DEBUG_HALT CP0_DEBUG_DOZE CP0_DEBUG_LSNM CP0_DEBUG_NODCR
CP0_DEBUG_DM CP0_DEBUG_DBD CP0_TRACECONTROL_ON CP0_TRACECONTROL_MODE CP0_TRACECONTROL_G
CP0_TRACECONTROL_ASID CP0_TRACECONTROL_U CP0_TRACECONTROL_0 CP0_TRACECONTROL_K CP0_TRACECONTROL_E
CP0_TRACECONTROL_D CP0_TRACECONTROL_IO CP0_TRACECONTROL_TB CP0_TRACECONTROL_UT CP0_TRACECONTROL_TS
CP0_TRACECONTROL2_SYP CP0_TRACECONTROL2_TBU CP0_TRACECONTROL2_TBI CP0_TRACECONTROL2_VALIDMODES CP0_USERTRACEDATA_DATA
CP0_TRACEBPC_IBPON CP0_TRACEBPC_IE CP0_TRACEBPC_DBPON CP0_TRACEBPC_DE CP0_DEBUG2_PACO
CP0_DEBUG2_TUP CP0_DEBUG2_DQ CP0_DEBUG2_PRM
Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code