mirror of
https://github.com/esp8266/Arduino.git
synced 2025-10-15 11:26:40 +03:00
@@ -46,7 +46,7 @@ extern "C" {
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if SAM3S_SERIES || SAM4S_SERIES || SAM3N_SERIES || SAM3XA_SERIES
|
||||
#if SAM3S_SERIES || SAM4S_SERIES || SAM3N_SERIES
|
||||
/**
|
||||
* \brief Initialize the given ADC with the specified ADC clock and startup time.
|
||||
*
|
||||
@@ -80,6 +80,55 @@ uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck,
|
||||
ADC_MR_STARTUP_Msk);
|
||||
return 0;
|
||||
}
|
||||
#elif SAM3XA_SERIES
|
||||
/**
|
||||
* \brief Initialize the given ADC with the specified ADC clock and startup time.
|
||||
*
|
||||
* \param p_adc Pointer to an ADC instance.
|
||||
* \param ul_mck Main clock of the device (value in Hz).
|
||||
* \param ul_adc_clock Analog-to-Digital conversion clock (value in Hz).
|
||||
* \param uc_startup ADC start up time. Please refer to the product datasheet
|
||||
* for details.
|
||||
*
|
||||
* \return 0 on success.
|
||||
*/
|
||||
uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck,
|
||||
const uint32_t ul_adc_clock, const uint8_t uc_startuptime)
|
||||
{
|
||||
uint32_t startup_table[] = { 0, 8, 16, 24, 64, 80, 96, 112, 512, 576, 640, 704, 768, 832, 896, 960 };
|
||||
uint32_t ul_prescal, ul_startup, ul_mr_startup, ul_real_adc_clock;
|
||||
p_adc->ADC_CR = ADC_CR_SWRST;
|
||||
|
||||
/* Reset Mode Register. */
|
||||
p_adc->ADC_MR = 0;
|
||||
|
||||
/* Reset PDC transfer. */
|
||||
p_adc->ADC_PTCR = (ADC_PTCR_RXTDIS | ADC_PTCR_TXTDIS);
|
||||
p_adc->ADC_RCR = 0;
|
||||
p_adc->ADC_RNCR = 0;
|
||||
if (ul_mck % (2 * ul_adc_clock)) {
|
||||
// Division with reminder
|
||||
ul_prescal = ul_mck / (2 * ul_adc_clock);
|
||||
} else {
|
||||
// Whole division
|
||||
ul_prescal = ul_mck / (2 * ul_adc_clock) - 1;
|
||||
}
|
||||
ul_real_adc_clock = ul_mck / (2 * (ul_prescal + 1));
|
||||
|
||||
// ADC clocks needed to get ul_startuptime uS
|
||||
ul_startup = (ul_real_adc_clock / 1000000) * uc_startuptime;
|
||||
|
||||
// Find correct MR_STARTUP value from conversion table
|
||||
for (ul_mr_startup=0; ul_mr_startup<16; ul_mr_startup++) {
|
||||
if (startup_table[ul_mr_startup] >= ul_startup)
|
||||
break;
|
||||
}
|
||||
if (ul_mr_startup==16)
|
||||
return -1;
|
||||
p_adc->ADC_MR |= ADC_MR_PRESCAL(ul_prescal) |
|
||||
((ul_mr_startup << ADC_MR_STARTUP_Pos) & ADC_MR_STARTUP_Msk);
|
||||
return 0;
|
||||
}
|
||||
#elif SAM3U_SERIES
|
||||
/**
|
||||
* \brief Initialize the given ADC with the specified ADC clock and startup time.
|
||||
|
Reference in New Issue
Block a user