Я начал разбираться с АЦП на STM32F4Discovery.
Вычитал, что у АЦП существуют два метода опроса: регулярные каналы и инжектированные каналы.
Разницу между ними я более менее понял. Первая группа запись данных в один регистр, вторая группа результат можно записать в один из 4-х регистров.
Я стараюсь писать код используя CMSIS.
К порту PA1 прикрутил переменный резистор, и по изменению значения должны зажигаться диоды на PD12, 13, 14, 15 но почему-то не работает, подскажите пожалуйста что не так.
Код:
|
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
uint32_t res;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
//GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем время выборки
ADC1-›CR2 |= ADC_CR2_JEXTSEL; //Преобразование инжектированной группы
ADC1-›CR2 |= ADC_CR2_JEXTEN; //Разрешаем внешний запуск инжектированной группы
ADC1-›CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим
ADC1-›CR1 |= ADC_CR1_JAUTO;
ADC1-›JSQR |= (1‹‹15); //Задаем номер канала - ADC1
ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
ADC1-›CR2 |= ADC_CR2_JSWSTART; //Запуск преобразований
while (!(ADC1-›SR & ADC_SR_JEOC)); //ждем пока первое преобразование завершится
while(1)
{
res = ADC1-›JDR1;
if (res › 1024)
{
GPIOD-›ODR=LED_STATE ;
}
}
} |
Поскольку я разбираюсь в режимах преобразования, то я так же пробовал написать код и для регулярных каналов:
Код:
|
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);
ADC1-›CR2 |= ADC_CR2_EXTSEL;
ADC1-›CR2 |= ADC_CR2_EXTEN;
ADC1-›CR2 |= ADC_CR2_CONT;
ADC1-›SQR1 |= (1‹‹15); //Задаем номер канала - ADC1
ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
ADC1-›CR2 |= ADC_CR2_SWSTART; //Запуск преобразований
while (!(ADC1-›SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
uint32_t res;
while(1)
{
res = ADC1-›DR;
if (res › 1024)
{
GPIOD-›ODR=LED_STATE ;
}
}
} |
Но он тоже не работает(((