Revision 26dead12 source/DW1000/v1/alld_dw1000_v1.c
source/DW1000/v1/alld_dw1000_v1.c | ||
---|---|---|
32 | 32 |
#if (defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)) || defined(__DOXYGEN__) |
33 | 33 |
|
34 | 34 |
#include <v1/alld_dw1000_regs_v1.h> |
35 |
#include <aos_thread.h> |
|
36 | 35 |
#include <assert.h> |
37 | 36 |
#include <string.h> |
38 | 37 |
#include <stdlib.h> |
... | ... | |
241 | 240 |
}; |
242 | 241 |
|
243 | 242 |
|
244 |
#define NUM_16M_OFFSET (37) |
|
245 |
#define NUM_16M_OFFSETWB (68) |
|
246 |
#define NUM_64M_OFFSET (26) |
|
247 |
#define NUM_64M_OFFSETWB (59) |
|
248 |
|
|
249 | 243 |
const uint8_t chan_idxnb[NUM_CH_SUPPORTED] = {0, 0, 1, 2, 0, 3, 0, 0}; //only channels 1,2,3 and 5 are in the narrow band tables |
250 | 244 |
const uint8_t chan_idxwb[NUM_CH_SUPPORTED] = {0, 0, 0, 0, 0, 0, 0, 1}; //only channels 4 and 7 are in in the wide band tables |
251 | 245 |
|
... | ... | |
845 | 839 |
}; // end range25cm64PRFwb |
846 | 840 |
|
847 | 841 |
|
848 |
|
|
849 |
|
|
850 |
|
|
851 | 842 |
/*! ------------------------------------------------------------------------------------------------------------------ |
852 | 843 |
* Function: dwt_getrangebias() |
853 | 844 |
* |
... | ... | |
873 | 864 |
|
874 | 865 |
// NB: note we may get some small negitive values e.g. up to -50 cm. |
875 | 866 |
|
876 |
int rangeint25cm = (int) (range * 4.00) ; // convert range to integer number of 25cm values. |
|
867 |
int rangeint25cm = (int) ((double)range * 4.00) ; // convert range to integer number of 25cm values.
|
|
877 | 868 |
|
878 | 869 |
if (rangeint25cm > 255) rangeint25cm = 255 ; // make sure it matches largest value in table (all tables end in 255 !!!!) |
879 | 870 |
|
... | ... | |
919 | 910 |
} // end else |
920 | 911 |
|
921 | 912 |
|
922 |
mOffset = (float) cmoffseti ; // offset result in centimmetres
|
|
913 |
mOffset = (double) cmoffseti ; // offset result in centimmetres
|
|
923 | 914 |
|
924 | 915 |
mOffset *= 0.01 ; // convert to metres |
925 | 916 |
|
926 | 917 |
return (mOffset) ; |
927 | 918 |
} |
928 | 919 |
|
929 |
|
|
930 |
|
|
931 | 920 |
// ------------------------------------------------------------------------------------------------------------------- |
932 | 921 |
// |
933 | 922 |
// Internal functions for controlling and configuring the device |
... | ... | |
943 | 932 |
// Read non-volatile memory |
944 | 933 |
uint32_t _dwt_otpread(uint32_t address); |
945 | 934 |
// Program the non-volatile memory |
946 |
uint32_t _dwt_otpprogword32(uint32_t data, uint16_t address);
|
|
935 |
int32_t _dwt_otpprogword32(uint32_t data, uint16_t address); |
|
947 | 936 |
// Upload the device configuration into always on memory |
948 | 937 |
void _dwt_aonarrayupload(void); |
949 | 938 |
// ------------------------------------------------------------------------------------------------------------------- |
... | ... | |
1025 | 1014 |
pdw1000local->cbRxTo = NULL; |
1026 | 1015 |
pdw1000local->cbRxErr = NULL; |
1027 | 1016 |
|
1028 |
pdw1000local->driver = drv; // TODO:
|
|
1017 |
pdw1000local->driver = drv; |
|
1029 | 1018 |
|
1030 | 1019 |
// Read and validate device ID return -1 if not recognised |
1031 | 1020 |
if (DWT_DEVICE_ID != dwt_readdevid()) // MP IC ONLY (i.e. DW1000) FOR THIS CODE |
... | ... | |
1346 | 1335 |
pdw1000local->longFrames = config->phrMode ; |
1347 | 1336 |
|
1348 | 1337 |
pdw1000local->sysCFGreg &= ~SYS_CFG_PHR_MODE_11; |
1349 |
pdw1000local->sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (config->phrMode << SYS_CFG_PHR_MODE_SHFT)); |
|
1338 |
pdw1000local->sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (uint32_t)(config->phrMode << SYS_CFG_PHR_MODE_SHFT));
|
|
1350 | 1339 |
|
1351 | 1340 |
dwt_write32bitreg(SYS_CFG_ID,pdw1000local->sysCFGreg) ; |
1352 | 1341 |
// Set the lde_replicaCoeff |
... | ... | |
1413 | 1402 |
nsSfd_result = 3 ; |
1414 | 1403 |
useDWnsSFD = 1 ; |
1415 | 1404 |
} |
1416 |
regval = (CHAN_CTRL_TX_CHAN_MASK & (chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel |
|
1417 |
(CHAN_CTRL_RX_CHAN_MASK & (chan << CHAN_CTRL_RX_CHAN_SHIFT)) | // Receive Channel |
|
1418 |
(CHAN_CTRL_RXFPRF_MASK & (config->prf << CHAN_CTRL_RXFPRF_SHIFT)) | // RX PRF |
|
1419 |
((CHAN_CTRL_TNSSFD|CHAN_CTRL_RNSSFD) & (nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) | // nsSFD enable RX&TX |
|
1420 |
(CHAN_CTRL_DWSFD & (useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) | // Use DW nsSFD |
|
1421 |
(CHAN_CTRL_TX_PCOD_MASK & (config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) | // TX Preamble Code |
|
1422 |
(CHAN_CTRL_RX_PCOD_MASK & (config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT)) ; // RX Preamble Code |
|
1405 |
regval = (CHAN_CTRL_TX_CHAN_MASK & (uint32_t)(chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel
|
|
1406 |
(CHAN_CTRL_RX_CHAN_MASK & (uint32_t)(chan << CHAN_CTRL_RX_CHAN_SHIFT)) | // Receive Channel
|
|
1407 |
(CHAN_CTRL_RXFPRF_MASK & (uint32_t)(config->prf << CHAN_CTRL_RXFPRF_SHIFT)) | // RX PRF
|
|
1408 |
((CHAN_CTRL_TNSSFD|CHAN_CTRL_RNSSFD) & (uint32_t)(nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) | // nsSFD enable RX&TX
|
|
1409 |
(CHAN_CTRL_DWSFD & (uint32_t)(useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) | // Use DW nsSFD
|
|
1410 |
(CHAN_CTRL_TX_PCOD_MASK & (uint32_t)(config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) | // TX Preamble Code
|
|
1411 |
(CHAN_CTRL_RX_PCOD_MASK & (uint32_t)(config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT)) ; // RX Preamble Code
|
|
1423 | 1412 |
|
1424 | 1413 |
dwt_write32bitreg(CHAN_CTRL_ID,regval) ; |
1425 | 1414 |
|
1426 | 1415 |
// Set up TX Preamble Size, PRF and Data Rate |
1427 |
pdw1000local->txFCTRL = ((config->txPreambLength | config->prf) << TX_FCTRL_TXPRF_SHFT) | (config->dataRate << TX_FCTRL_TXBR_SHFT);
|
|
1416 |
pdw1000local->txFCTRL = (uint32_t)(((config->txPreambLength | config->prf) << TX_FCTRL_TXPRF_SHFT) | (config->dataRate << TX_FCTRL_TXBR_SHFT));
|
|
1428 | 1417 |
dwt_write32bitreg(TX_FCTRL_ID, pdw1000local->txFCTRL); |
1429 | 1418 |
|
1430 | 1419 |
// The SFD transmit pattern is initialised by the DW1000 upon a user TX request, but (due to an IC issue) it is not done for an auto-ACK TX. The |
... | ... | |
1538 | 1527 |
|
1539 | 1528 |
// Write the frame length to the TX frame control register |
1540 | 1529 |
// pdw1000local->txFCTRL has kept configured bit rate information |
1541 |
uint32_t reg32 = pdw1000local->txFCTRL | txFrameLength | (txBufferOffset << TX_FCTRL_TXBOFFS_SHFT) | (ranging << TX_FCTRL_TR_SHFT);
|
|
1530 |
uint32_t reg32 = pdw1000local->txFCTRL | txFrameLength | (uint16_t)(txBufferOffset << TX_FCTRL_TXBOFFS_SHFT) | (uint16_t)(ranging << TX_FCTRL_TR_SHFT);
|
|
1542 | 1531 |
dwt_write32bitreg(TX_FCTRL_ID, reg32); |
1543 | 1532 |
} // end dwt_writetxfctrl() |
1544 | 1533 |
|
... | ... | |
1789 | 1778 |
// Write message header selecting WRITE operation and addresses as appropriate (this is one to three bytes long) |
1790 | 1779 |
if (index == 0) // For index of 0, no sub-index is required |
1791 | 1780 |
{ |
1792 |
header[cnt++] = 0x80 | recordNumber ; // Bit-7 is WRITE operation, bit-6 zero=NO sub-addressing, bits 5-0 is reg file id |
|
1781 |
header[cnt++] = 0x80 | (uint8_t)recordNumber ; // Bit-7 is WRITE operation, bit-6 zero=NO sub-addressing, bits 5-0 is reg file id
|
|
1793 | 1782 |
} |
1794 | 1783 |
else |
1795 | 1784 |
{ |
1796 | 1785 |
#ifdef DWT_API_ERROR_CHECK |
1797 | 1786 |
assert((index <= 0x7FFF) && ((index + length) <= 0x7FFF)); // Index and sub-addressable area are limited to 15-bits. |
1798 | 1787 |
#endif |
1799 |
header[cnt++] = 0xC0 | recordNumber ; // Bit-7 is WRITE operation, bit-6 one=sub-address follows, bits 5-0 is reg file id |
|
1788 |
header[cnt++] = 0xC0 | (uint8_t)recordNumber ; // Bit-7 is WRITE operation, bit-6 one=sub-address follows, bits 5-0 is reg file id
|
|
1800 | 1789 |
|
1801 | 1790 |
if (index <= 127) // For non-zero index < 127, just a single sub-index byte is required |
1802 | 1791 |
{ |
... | ... | |
1810 | 1799 |
} |
1811 | 1800 |
|
1812 | 1801 |
// Write it to the SPI |
1813 |
writetospi(cnt,header,length,buffer); |
|
1802 |
writetospi((uint16_t)cnt,header,length,buffer);
|
|
1814 | 1803 |
} // end dwt_writetodevice() |
1815 | 1804 |
|
1816 | 1805 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
1874 | 1863 |
} |
1875 | 1864 |
|
1876 | 1865 |
// Do the read from the SPI |
1877 |
readfromspi(cnt, header, length, buffer); |
|
1866 |
readfromspi((uint16_t)cnt, header, length, buffer);
|
|
1878 | 1867 |
} // end dwt_readfromdevice() |
1879 | 1868 |
|
1880 | 1869 |
|
... | ... | |
1898 | 1887 |
int j ; |
1899 | 1888 |
uint8_t buffer[4] ; |
1900 | 1889 |
|
1901 |
dwt_readfromdevice(regFileID,regOffset,4,buffer); // Read 4 bytes (32-bits) register into buffer
|
|
1890 |
dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset,4,buffer); // Read 4 bytes (32-bits) register into buffer
|
|
1902 | 1891 |
|
1903 | 1892 |
for (j = 3 ; j >= 0 ; j --) |
1904 | 1893 |
{ |
... | ... | |
1926 | 1915 |
uint16_t regval = 0 ; |
1927 | 1916 |
uint8_t buffer[2] ; |
1928 | 1917 |
|
1929 |
dwt_readfromdevice(regFileID,regOffset,2,buffer); // Read 2 bytes (16-bits) register into buffer
|
|
1918 |
dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset,2,buffer); // Read 2 bytes (16-bits) register into buffer
|
|
1930 | 1919 |
|
1931 |
regval = (buffer[1] << 8) + buffer[0] ;
|
|
1920 |
regval = (uint16_t)((buffer[1] << 8) + buffer[0] );
|
|
1932 | 1921 |
return regval ; |
1933 | 1922 |
|
1934 | 1923 |
} // end dwt_read16bitoffsetreg() |
... | ... | |
1950 | 1939 |
{ |
1951 | 1940 |
uint8_t regval; |
1952 | 1941 |
|
1953 |
dwt_readfromdevice(regFileID, regOffset, 1, ®val);
|
|
1942 |
dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset, 1, ®val);
|
|
1954 | 1943 |
|
1955 | 1944 |
return regval ; |
1956 | 1945 |
} |
... | ... | |
1971 | 1960 |
*/ |
1972 | 1961 |
void dwt_write8bitoffsetreg(int regFileID, int regOffset, uint8_t regval) |
1973 | 1962 |
{ |
1974 |
dwt_writetodevice(regFileID, regOffset, 1, ®val);
|
|
1963 |
dwt_writetodevice((uint16_t)regFileID, (uint16_t)regOffset, 1, ®val);
|
|
1975 | 1964 |
} |
1976 | 1965 |
|
1977 | 1966 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
1995 | 1984 |
buffer[0] = regval & 0xFF; |
1996 | 1985 |
buffer[1] = regval >> 8 ; |
1997 | 1986 |
|
1998 |
dwt_writetodevice(regFileID,regOffset,2,buffer);
|
|
1987 |
dwt_writetodevice((uint16_t)regFileID, (uint16_t)regOffset,2,buffer);
|
|
1999 | 1988 |
} // end dwt_write16bitoffsetreg() |
2000 | 1989 |
|
2001 | 1990 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
2023 | 2012 |
regval >>= 8 ; |
2024 | 2013 |
} |
2025 | 2014 |
|
2026 |
dwt_writetodevice(regFileID,regOffset,4,buffer);
|
|
2015 |
dwt_writetodevice((uint16_t)regFileID,(uint16_t)regOffset,4,buffer);
|
|
2027 | 2016 |
} // end dwt_write32bitoffsetreg() |
2028 | 2017 |
|
2029 | 2018 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
2157 | 2146 |
|
2158 | 2147 |
for(i=0; i<length; i++) |
2159 | 2148 |
{ |
2160 |
array[i] = _dwt_otpread(address + i) ; |
|
2149 |
array[i] = _dwt_otpread(address + (uint32_t)i) ;
|
|
2161 | 2150 |
} |
2162 | 2151 |
|
2163 | 2152 |
_dwt_enableclocks(ENABLE_ALL_SEQ); // Restore system clock to PLL |
... | ... | |
2182 | 2171 |
uint32_t ret_data; |
2183 | 2172 |
|
2184 | 2173 |
// Write the address |
2185 |
dwt_write16bitoffsetreg(OTP_IF_ID, OTP_ADDR, address); |
|
2174 |
dwt_write16bitoffsetreg(OTP_IF_ID, OTP_ADDR, (uint16_t)address);
|
|
2186 | 2175 |
|
2187 | 2176 |
// Perform OTP Read - Manual read mode has to be set |
2188 | 2177 |
dwt_write8bitoffsetreg(OTP_IF_ID, OTP_CTRL, OTP_CTRL_OTPREAD | OTP_CTRL_OTPRDEN); |
... | ... | |
2215 | 2204 |
* |
2216 | 2205 |
* returns DWT_SUCCESS for success, or DWT_ERROR for error |
2217 | 2206 |
*/ |
2218 |
uint32_t _dwt_otpsetmrregs(int mode)
|
|
2207 |
int32_t _dwt_otpsetmrregs(int mode) |
|
2219 | 2208 |
{ |
2220 | 2209 |
uint8_t rd_buf[4]; |
2221 | 2210 |
uint8_t wr_buf[4]; |
... | ... | |
2381 | 2370 |
* |
2382 | 2371 |
* returns DWT_SUCCESS for success, or DWT_ERROR for error |
2383 | 2372 |
*/ |
2384 |
uint32_t _dwt_otpprogword32(uint32_t data, uint16_t address)
|
|
2373 |
int32_t _dwt_otpprogword32(uint32_t data, uint16_t address) |
|
2385 | 2374 |
{ |
2386 | 2375 |
uint8_t rd_buf[1]; |
2387 | 2376 |
uint8_t wr_buf[4]; |
... | ... | |
3538 | 3527 |
if (enable) |
3539 | 3528 |
{ |
3540 | 3529 |
/* Configure ON/OFF times and enable PLL2 on/off sequencing by SNIFF mode. */ |
3541 |
uint16_t sniff_reg = ((timeOff << 8) | timeOn) & RX_SNIFF_MASK; |
|
3530 |
uint16_t sniff_reg = (uint16_t)((timeOff << 8) | timeOn) & RX_SNIFF_MASK;
|
|
3542 | 3531 |
dwt_write16bitoffsetreg(RX_SNIFF_ID, RX_SNIFF_OFFSET, sniff_reg); |
3543 | 3532 |
pmsc_reg = dwt_read32bitoffsetreg(PMSC_ID, PMSC_CTRL0_OFFSET); |
3544 | 3533 |
pmsc_reg |= PMSC_CTRL0_PLL2_SEQ_EN; |
... | ... | |
4099 | 4088 |
wr_buf[0] = 0x00; // Clear SAR enable |
4100 | 4089 |
dwt_writetodevice(TX_CAL_ID, TC_SARL_SAR_C,1,wr_buf); |
4101 | 4090 |
|
4102 |
return ((temp_raw<<8)|(vbat_raw)); |
|
4091 |
return (uint16_t)((temp_raw<<8)|(vbat_raw));
|
|
4103 | 4092 |
} |
4104 | 4093 |
|
4105 | 4094 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
4198 | 4187 |
curr_bw = curr_bw | bit_field; |
4199 | 4188 |
|
4200 | 4189 |
// Write bw setting to PG_DELAY register |
4201 |
dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGDELAY_OFFSET, curr_bw);
|
|
4190 |
dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGDELAY_OFFSET,(uint8_t)curr_bw);
|
|
4202 | 4191 |
|
4203 | 4192 |
// Set cal direction and time |
4204 | 4193 |
dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGCCTRL_OFFSET, TC_PGCCTRL_DIR_CONV | TC_PGCCTRL_TMEAS_MASK); |
... | ... | |
4284 | 4273 |
} |
4285 | 4274 |
} |
4286 | 4275 |
|
4287 |
new_da_attn = current_da_attn + da_attn_change; |
|
4288 |
new_mixer_gain = current_mixer_gain + mixer_gain_change; |
|
4276 |
new_da_attn = current_da_attn + (uint8_t)da_attn_change;
|
|
4277 |
new_mixer_gain = current_mixer_gain + (uint8_t)mixer_gain_change;
|
|
4289 | 4278 |
|
4290 | 4279 |
new_regval |= ((uint32_t) ((new_da_attn << 5) | new_mixer_gain)) << (i * 8); |
4291 | 4280 |
} |
... | ... | |
4394 | 4383 |
dwt_write16bitoffsetreg(PMSC_ID, PMSC_CTRL1_OFFSET, old_pmsc_ctrl1); |
4395 | 4384 |
dwt_write32bitreg(RF_CONF_ID, old_rf_conf_txpow_mask); |
4396 | 4385 |
|
4397 |
average_count = (int)(sum_count / NUM_SAMPLES);
|
|
4386 |
average_count = (uint16_t)(sum_count / NUM_SAMPLES);
|
|
4398 | 4387 |
return average_count; |
4399 | 4388 |
} |
4400 | 4389 |
|
... | ... | |
4405 | 4394 |
|
4406 | 4395 |
0xDECA0130 // DW1000 - MP |
4407 | 4396 |
|
4408 |
=============================================================================================== |
|
4409 |
*/ |
|
4397 |
=============================================================================================== */ |
|
4410 | 4398 |
|
4411 | 4399 |
/**************************************************************************************************************************************************** |
4412 | 4400 |
* |
... | ... | |
4429 | 4417 |
*/ |
4430 | 4418 |
#pragma GCC optimize ("O3") |
4431 | 4419 |
static int writetospi(uint16_t headerLength, |
4432 |
const uint8_t *headerBuffer, |
|
4433 |
uint32_t bodyLength, |
|
4434 |
const uint8_t *bodyBuffer) |
|
4435 |
{ |
|
4436 |
|
|
4437 |
uint8_t buffer[bodyLength + 3]; |
|
4438 |
memcpy(buffer, headerBuffer, headerLength); //copy data to buffer |
|
4439 |
memcpy(&buffer[headerLength], bodyBuffer, bodyLength); //copy data to buffer |
|
4440 |
|
|
4441 |
apalSPITransmit(pdw1000local->driver->spid, |
|
4442 |
buffer, |
|
4443 |
bodyLength + headerLength); // send header and data |
|
4444 |
|
|
4445 |
return 0; |
|
4420 |
const uint8_t *headerBuffer, |
|
4421 |
uint32_t bodyLength, |
|
4422 |
const uint8_t *bodyBuffer) |
|
4423 |
{ |
|
4424 |
uint8_t buffer[SPIBUFFLEN]; |
|
4425 |
memcpy(buffer, headerBuffer, headerLength); //copy header (register id no.) to the buffer |
|
4426 |
memcpy(&buffer[headerLength], bodyBuffer, bodyLength); //copy data to the buffer |
|
4427 |
|
|
4428 |
apalSPITransmit(pdw1000local->driver->spid, |
|
4429 |
buffer, |
|
4430 |
bodyLength + headerLength); // send header (register id) and data |
|
4431 |
|
|
4432 |
return 0; |
|
4446 | 4433 |
} // end writetospi() |
4447 | 4434 |
|
4448 | 4435 |
|
... | ... | |
4533 | 4520 |
/*! @brief sleep or idle the thread in millisecond */ |
4534 | 4521 |
void deca_sleep(unsigned int time_ms) |
4535 | 4522 |
{ |
4536 |
aosThdMSleep(time_ms);
|
|
4523 |
usleep(time_ms * 1000);
|
|
4537 | 4524 |
} |
4538 | 4525 |
|
4539 | 4526 |
/*! @brief sleep or idle the thread in millisecond */ |
4540 | 4527 |
void Sleep(unsigned int time_ms) |
4541 | 4528 |
{ |
4542 |
aosThdMSleep(time_ms);
|
|
4529 |
usleep(time_ms * 1000);
|
|
4543 | 4530 |
} |
4544 | 4531 |
|
4545 | 4532 |
|
... | ... | |
4552 | 4539 |
return chVTGetSystemTimeX(); |
4553 | 4540 |
} |
4554 | 4541 |
|
4555 |
//inline uint32_t portGetTickCnt(){ |
|
4556 |
// return (uint32_t) chVTGetSystemTimeX(); |
|
4557 |
//} |
|
4558 |
|
|
4559 |
|
|
4560 | 4542 |
/*! @brief Disable the interrupt handler */ |
4561 | 4543 |
void port_DisableEXT_IRQ(void){ |
4562 | 4544 |
nvicDisableVector(DW1000_EXTI_IRQn); |
4563 |
|
|
4564 | 4545 |
} |
4565 | 4546 |
|
4566 | 4547 |
/*! @brief Enable the interrupt handler */ |
Also available in: Unified diff