Hallo zusammen
ich versuche gerade den ADC meines stm32L443 zum laufen zu bekommen
(erstmal ohne DMA und mit normalen Interrupt und externer VREF). Mit den
internen Kanälen für VBAT und VTemp funktioniert das auch alles
wurderbar, aber sobald ich einen externen Pin benutzen will klappt das
nicht mehr. Der Interrupt wird nicht mehr aufgerufen aber die Bits in
den Registern sagen mir, dass der ADC läuft.
1 | void MD_ADC_ADCConfig(void)
|
2 | {
|
3 | MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_ADC, ENABLE);
|
4 | MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_GPIOA, ENABLE);
|
5 | MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_GPIOB, ENABLE);
|
6 | GPIOA->MODER = (GPIOA->MODER | GPIO_MODER_MODER0 | GPIO_MODER_MODER2 | GPIO_MODER_MODER3 | GPIO_MODER_MODER6 | GPIO_MODER_MODER7);
|
7 | GPIOB->MODER = (GPIOB->MODER | GPIO_MODER_MODER0 | GPIO_MODER_MODER1);
|
8 | ADC1_COMMON->CCR = (((ADC1_COMMON->CCR | ADC_CCR_TSEN | ADC_CCR_VBATEN) & ~ADC_CCR_VREFEN) | ADC_CCR_PRESC_2 | ADC_CCR_PRESC_1);
|
9 | ADC1->CFGR = ((ADC1->CFGR & ~ADC_CFGR_ALIGN) & ~ADC_CFGR_RES);
|
10 | ADC1->SQR1 = (0x0000009U | (0x00000005U << 6) | (0x00000012U << 12) | (0x00000011U << 18) | (0x00000012U << 24));
|
11 | ADC1->SQR2 = (0x00000011U | (0x00000012U << 6) | (0x00000011U << 12) | (0x00000012U << 18) | (0x00000011U << 24));
|
12 | ADC1->SMPR1 |= 0x3FFFFFFF;
|
13 |
|
14 | NVIC_SetPriority(ADC1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 6, 0));
|
15 | NVIC_EnableIRQ(ADC1_IRQn);
|
16 |
|
17 | ADC1->CFGR |= ADC_CFGR_DISCEN;
|
18 | ADC1->CFGR &= ~ADC_CFGR_CONT;
|
19 | ADC1->CR &= ~ADC_CR_DEEPPWD;
|
20 | ADC1->CR |= ADC_CR_ADVREGEN;
|
21 | ADC1->CR |= ADC_CR_ADEN;
|
22 | ADC1->IER |= (ADC_IER_EOCIE);
|
23 | ADC1->CR |= ADC_CR_ADSTART;
|
24 | }
|
25 |
|
26 | void ADC1_IRQHandler(void)
|
27 | {
|
28 | static uint8_t Counter = 1;
|
29 | uint8_t ui8_DataArrayPosition;
|
30 | if(!(ADC1->ISR & ADC_ISR_EOS))
|
31 | {
|
32 | ui8_DataArrayPosition = ui8_ConversionSequence[Counter-1];
|
33 | if(ui8_DataArrayPosition <= 18)
|
34 | {
|
35 | ADCData.ui8_ADCDataArray[ui8_DataArrayPosition] = ADC1->DR;
|
36 | }
|
37 | else
|
38 | {
|
39 | ;
|
40 | }
|
41 | if(Counter >= (ADC1->SQR1 & ADC_SQR1_L))
|
42 | {
|
43 | Counter = 1;
|
44 | }
|
45 | else
|
46 | {
|
47 | Counter++;
|
48 | }
|
49 | }
|
50 | else
|
51 | {
|
52 | Counter = 1;
|
53 | }
|
54 | ADC1->ISR &= ~ADC_ISR_EOC;
|
55 | ADC1->ISR &= ~ADC_ISR_EOS;
|
56 | asm("nop");
|
57 | }
|
Habe ich zufällig etwas vergessen zu konfigurieren ?
Gruß
Benni