Перейти к содержанию

АЦП и ДМА на stm32vldiscovery


sucess

Рекомендуемые сообщения

Реализовать циклическое измерение напряжения на входе АЦП(ADC1_IN1 соответствует PA1) , цифровой код напряжения записывать в буфер, используя ДМА. Затем передать данные из буфера на ПК по юарт. Кто занет подскажите где в программе не правильно.

#include "stm32f10x.h"
#include "string.h"

const unsigned int N=10;

char rx_buf[10], rx_length=0;
uint16_t adc_res;
uint8_t rx_data;
uint8_t tx_data;
uint16_t adc_temp[10]={0};
uint8_t i;

char RxBuffer[255]="";
char TxBuffer[255]="";

void AdcInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;    // Разрешить тактирование порта PORTA

  GPIOA->CRL   &= ~GPIO_CRL_MODE1;       //Очистить биты MODE
  GPIOA->CRL   &= ~GPIO_CRL_CNF1;        //Очистить биты CNF

  RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;   //подаем тактирование АЦП
  RCC->CFGR    &= ~RCC_CFGR_ADCPRE;      //входной делитель
  ADC1->CR1     =  0;                    //
  ADC1->CR1 |= ADC_CR1_EOCIE;            //enable interruption of eoc
  ADC1->SQR1    =  0;                    //
  ADC1->CR2    |=  ADC_CR2_CAL;          //запуск калибровки
  while (!(ADC1->CR2 & ADC_CR2_CAL)){};  //ждем окончания калибровки
  ADC1->CR2     =  ADC_CR2_EXTSEL;       //выбрать источником запуска разряд  SWSTART
  ADC1->CR2    |=  ADC_CR2_EXTTRIG;      //разр. внешний запуск регулярного канала
  ADC1->CR2    |=  ADC_CR2_CONT;         //режим непрерывного преобразования
  ADC1->SQR3    =  1;                    //загрузить номер канала
  ADC1->CR2    |=  ADC_CR2_ADON;         //включить АЦП
  ADC1->CR2    |=  ADC_CR2_SWSTART;      //запустить процес преобразования

 NVIC_SetPriority(ADC1_IRQn, 2);
  NVIC_EnableIRQ(ADC1_IRQn);

  __enable_irq();
}

void int_tim3(void)
{
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;//Включаем тактирование TIM3
        TIM3->PSC = 0x18;
        TIM3->ARR = 0x64;
        TIM6->DIER |= TIM_DIER_UIE;
        TIM3->CR1 |= TIM_CR1_CEN;
}

void init_dma_adc (void)
{
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    DMA1_Channel1->CPAR |= (uint32_t)&ADC1->DR;
    DMA1_Channel1->CMAR |= (uint32_t)&adc_temp[0];
    DMA1_Channel1->CNDTR = 10;

    DMA1_Channel1->CCR = 0;
    DMA1_Channel1->CCR |= DMA_CCR1_DIR;
    DMA1_Channel1->CCR |= DMA_CCR1_MINC;
    DMA1_Channel1->CCR |= DMA_CCR1_CIRC;

    ADC1->CR2 |= ADC_CR2_DMA;
    DMA1_Channel1->CCR |= DMA_CCR1_EN;

}

void init_uart(void)
{
        RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
        RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
        RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
        GPIOA->CRH &=~(GPIO_CRH_MODE9|GPIO_CRH_CNF9);
        GPIOA->CRH |= (GPIO_CRH_MODE9_1|GPIO_CRH_CNF9_1);
        USART1->BRR = 0x0D0;//0x9C4; // 9600Бит/с
        USART1->CR1 |= USART_CR1_TE; // Включение передатчика USART1
        USART1->CR1 |= USART_CR1_RE; // Включение приемника USART1
        USART1->CR1 |= USART_CR1_RXNEIE;
        USART1->CR1 |= USART_CR1_UE;
        NVIC_EnableIRQ(USART1_IRQn);
}
void USART1_Send(char chr) {
    while (!(USART1->SR& USART_SR_TC));
    USART1->DR = chr;
}

int main(void)
{
    init_uart();
    AdcInit();
    int_tim3();
    init_dma_adc();
    while(1)
    {

    }

}
void ADC1_IRQHandler(void) {
    DMA1_Channel1->CCR &=~ DMA_CCR1_EN;
        for (i=0; i != N;i++){
            adc_res=adc_temp;
            USART1_Send((adc_res) & 0xFF);
            USART1_Send((adc_res >> 8) & 0x0F);
        }
        DMA1_Channel1->CNDTR = 10;
        DMA1_Channel1->CCR |= DMA_CCR1_EN;
}


 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...