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 *)¶m)[0] |
---|---|
Description |
The function returns low byte of 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 |
|
Returns |
Low byte of |
Requires |
Nothing. |
Example |
d = 0x12345678; tmp = Lo(d); // Equals 0x78 Lo(d) = 0xAA; // d equals 0x123456AA |
Notes |
None. |
Hi
Prototype |
#define Hi(param) ((char *)¶m)[1] |
---|---|
Description |
The function returns high byte of 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 |
|
Returns |
High byte of |
Requires |
Nothing. |
Example |
d = 0x12345678; tmp = Hi(d); // Equals 0x56 Hi(d) = 0xAA; // d equals 0x1234AA78 |
Notes |
None. |
Higher
Prototype |
#define Higher(param) ((char *)¶m)[2] |
---|---|
Description |
The function returns higher byte of 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 |
|
Returns |
Higher byte of |
Requires |
Nothing. |
Example |
d = 0x12345678; tmp = Higher(d); // Equals 0x34 Higher(d) = 0xAA; // d equals 0x12AA5678 |
Notes |
None. |
Highest
Prototype |
#define Highest(param) ((char *)¶m)[3] |
---|---|
Description |
The function returns highest byte of 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 |
|
Returns |
Highest byte of |
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 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 |
|
Returns |
Low word of |
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 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 |
|
Returns |
High word of |
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*)¶m)[0] |
---|---|
Description |
The function returns low longword of 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 |
|
Returns |
Low longword of |
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*)¶m)[1] |
---|---|
Description |
The function returns high longword of 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 |
|
Returns |
High word of |
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 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 |
|
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 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 |
|
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 |
Parameters |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
unsignedpause = 1000; ... Vdelay_ms(pause); // ~ one second pause |
Notes |
|
VDelay_Advanced_ms
Prototype |
void VDelay_Advanced_ms(unsigned time_in_ms, unsigned Current_Fosc_kHz); |
---|---|
Description |
Creates a software delay in duration of |
Parameters |
|
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 |
Delay_Cyc
Prototype |
void Delay_Cyc(unsigned int x, unsigned int y); |
---|---|
Description |
Creates a delay based on MCU clock. Delay lasts for |
Parameters |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
Delay_Cyc(1, 10); /* 1x16384 + 10 = 16394 cycles pause */ |
Notes |
|
Delay_Cyc_Long
Prototype |
void Delay_Cyc_Long(unsigned long CycNo); |
---|---|
Description |
Creates a delay based on MCU clock. Delay lasts for |
Parameters |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
Delay_Cyc_Long(16394); // 16394 cycles pause |
Notes |
|
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 |
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 |
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 |
Parameters |
|
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 |
|
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 |
|
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 |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
|
Notes |
If the DMA controller is not present, the |
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 |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
|
Notes |
If the DMA controller is not present, the |
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 |
What do you think about this topic ? Send us feedback!