안녕 하세요.
제가 STM32 칩으로 ADC 입력을 받아서 시리얼로 데이터를 보내고 싶은데 동작을 안 하네요,
고수님들 조언 좀 해 주세요.
초기 함수
/*------------------------------------------------------------------------------
ADC_Init
*------------------------------------------------------------------------------*/
void ADC_HardInit(void)
{
// Clock signal for ADC1 unit have to be enables
RCC->APB2ENR |= 0x0100; // Port1 ADC1
// Configure PA1 (ADC Channel 10) as analog input
GPIOA->CRL &= 0xFFFFF00F;
// ADC1 Congiguration
ADC1->CR1 &= 0xFFF0FFFF; // Independent mode
ADC1->CR1 &= 0xFFFFFEFF; // Scan conversion mode disable
ADC1->CR2 &= 0xFFFFFFFD; // Continuous conversion mode disable
ADC1->CR2 &= 0xFFEFFFFF; // External triger conversion disable
ADC1->CR2 &= 0xFFFFF7FF; // Data alignment right
ADC1->SQR1 &= 0xFF0FFFFF; // # of channel = 1
// ADC1 regular channel 14 configuration
ADC1->SMPR1 |= 0x38000000; // Sample time 239,5 cycles
ADC1->SQR3 &= 0xFFFFFFE0; // mask ans set 9th chanel as first
ADC1->SQR3 |= 0x00000009;
// Enable ADC1
ADC1->CR2 |= 0x00000001;
// Enable ADC1 reset calibaration register
ADC1->CR2 |= 0x00000008;
// Check the and of ADC1 reset calibration register
while(ADC1->CR2 & 0x00000008);
// Start ADC1 calibaration
ADC1->CR2 |= 0x0000004;
// Check the and of ADC1 calibration
while(ADC1->CR2 & 0x00000004);
} 메인 함수 int main() { unsigned char data; whlie(1) { ADC1->CR2 |= 0x00000001; // Start ADC1
while(!(ADC1->SR & 0x0002)); // wait until conversion is done
data = ADC1->DR; // read result
printf ("Mode 1 - Memory Save Only = '%x'", data);
putchar('\n');
putchar('\r');
delay(1000000); }
} 문제는 메인 함수에 whlie 문을 넣으면 통신을 안하는 먹통이 되어 버리네요. 제가 할려고 하는것은 STM32F103R8T6 칩에 ADC0번 핀(PA0)의 값을 읽어서 그 값을 시리얼로 PC로 보내는 겁니다. 많은 조언 부탁 드립니다.
ADC_Init
*------------------------------------------------------------------------------*/
void ADC_HardInit(void)
{
// Clock signal for ADC1 unit have to be enables
RCC->APB2ENR |= 0x0100; // Port1 ADC1
// Configure PA1 (ADC Channel 10) as analog input
GPIOA->CRL &= 0xFFFFF00F;
// ADC1 Congiguration
ADC1->CR1 &= 0xFFF0FFFF; // Independent mode
ADC1->CR1 &= 0xFFFFFEFF; // Scan conversion mode disable
ADC1->CR2 &= 0xFFFFFFFD; // Continuous conversion mode disable
ADC1->CR2 &= 0xFFEFFFFF; // External triger conversion disable
ADC1->CR2 &= 0xFFFFF7FF; // Data alignment right
ADC1->SQR1 &= 0xFF0FFFFF; // # of channel = 1
// ADC1 regular channel 14 configuration
ADC1->SMPR1 |= 0x38000000; // Sample time 239,5 cycles
ADC1->SQR3 &= 0xFFFFFFE0; // mask ans set 9th chanel as first
ADC1->SQR3 |= 0x00000009;
// Enable ADC1
ADC1->CR2 |= 0x00000001;
// Enable ADC1 reset calibaration register
ADC1->CR2 |= 0x00000008;
// Check the and of ADC1 reset calibration register
while(ADC1->CR2 & 0x00000008);
// Start ADC1 calibaration
ADC1->CR2 |= 0x0000004;
// Check the and of ADC1 calibration
while(ADC1->CR2 & 0x00000004);
} 메인 함수 int main() { unsigned char data; whlie(1) { ADC1->CR2 |= 0x00000001; // Start ADC1
while(!(ADC1->SR & 0x0002)); // wait until conversion is done
data = ADC1->DR; // read result
printf ("Mode 1 - Memory Save Only = '%x'", data);
putchar('\n');
putchar('\r');
delay(1000000); }
} 문제는 메인 함수에 whlie 문을 넣으면 통신을 안하는 먹통이 되어 버리네요. 제가 할려고 하는것은 STM32F103R8T6 칩에 ADC0번 핀(PA0)의 값을 읽어서 그 값을 시리얼로 PC로 보내는 겁니다. 많은 조언 부탁 드립니다.
부분쯤에 스타트하기 위해서는 .. ADC1->CR2 |= 0x00000001; 같은 경우는 초기화에 넣어야 할 거 같은데요.. ADC를 켜겠다는 의미 입니다.. 스타트는.. ADC1->CR2 |=1 << 22; 입니다..