Merhaba, bir kartımda STM32F030 işlemci kullanıyorum stm'den nuvotona geçiş yapmak istedim ADC hariç bütün her şey doğru çalışıyor. ADC değerlerini yanlış ölçüyorum extend sample time ekleyerek de denemeler yaptım ama sonuç aynı, Aşağıdaki yazılımda ADC yapılandırması için doğru mu?
*HIRC=48Mhz
*HIRC=48Mhz
C:
void InitADC(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/* ADC clock source is PCLK1, set divider to 1 */
CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL2_ADCSEL_HIRC, CLK_CLKDIV0_ADC(2));
/* Select Timer 0 module clock source as HIRC */
CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1SEL_HIRC, 0);
/* Enable Timer 0 module clock */
CLK_EnableModuleClock(TMR1_MODULE);
/* Enable ADC module clock */
CLK_EnableModuleClock(ADC_MODULE);
/* Set input mode */
GPIO_SetMode(PB, BIT0|BIT1|BIT7|BIT8, GPIO_MODE_INPUT);
/* Configure the PB.0 - PB.3 ADC analog input pins. */
SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk | SYS_GPB_MFPL_PB7MFP_Msk)) |
(SYS_GPB_MFPL_PB0MFP_ADC0_CH0 | SYS_GPB_MFPL_PB1MFP_ADC0_CH1 | SYS_GPB_MFPL_PB7MFP_ADC0_CH7);
SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB8MFP_Msk)) | (SYS_GPB_MFPH_PB8MFP_ADC0_CH8);
/* Disable the digital input path to avoid the leakage current. */
GPIO_DISABLE_DIGITAL_PATH(PB, BIT0|BIT1|BIT7|BIT8);
/* Lock protected registers */
SYS_LockReg();
/* Set timer1 periodic time-out frequency is 10KHz */
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, 10000);
/* Enable timer interrupt trigger ADC */
TIMER_SetTriggerSource(TIMER1, TIMER_TRGSRC_TIMEOUT_EVENT);
TIMER_SetTriggerTarget(TIMER1, TIMER_TRG_TO_ADC);
/* Enable ADC converter */
ADC_POWER_ON(ADC);
/* Set input mode as single-end, and Single mode*/
ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_CONTINUOUS, BIT0|BIT1|BIT7|BIT8);
/* Configure the sample module and enable TIMER trigger source */
ADC_EnableHWTrigger(ADC, ADC_ADCR_TRGS_TIMER, 0);
/* Clear the A/D interrupt flag for safe */
ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
/* Enable the sample module interrupt */
ADC_ENABLE_INT(ADC, ADC_ADF_INT);
/* Enable sample module A/D interrupt. */
NVIC_EnableIRQ(ADC_IRQn);
TIMER_Start(TIMER1);
}
C:
void ADC_IRQHandler(void)
{
if(ADC_GET_INT_FLAG(ADC, ADC_ADF_INT))
{
ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
ConversionADC();
}
}
C:
void ConversionADC(void)
{
/* Get the conversion result */
ADCvalues[0] = ADC_GET_CONVERSION_DATA(ADC, 0);
ADCvalues[1] = ADC_GET_CONVERSION_DATA(ADC, 1);
ADCvalues[2] = ADC_GET_CONVERSION_DATA(ADC, 7);
ADCvalues[3] = ADC_GET_CONVERSION_DATA(ADC, 8);
}
C:
void InitCoreClock(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/* Enable HIRC */
CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
/* Waiting for HIRC clock ready */
CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
/* Switch HCLK clock source to HIRC */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
/* Set both PCLK0 and PCLK1 as HCLK/1 */
CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1);
/* Update System Core Clock */
/* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
SystemCoreClockUpdate();
/* Lock protected registers */
SYS_LockReg();
}


