Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)
Показаны сообщения с ярлыком ADC. Показать все сообщения
Показаны сообщения с ярлыком ADC. Показать все сообщения

пятница, 21 октября 2016 г.

STM32F ADC with DMA on CMSIS

void DMA2_Stream4_IRQHandler(void)
{
        
GPIOD->ODR        ^=((1<<12)|(1<<13)|(1<<14)|(1<<15));
}
uint16_t BUFF[100];int main(void)
{
    
SystemInit();
//*********************GPIO*************************
        
RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;
        
RCC->AHB1ENR    |= RCC_AHB1ENR_GPIODEN;
        
GPIOA->MODER    |= GPIO_MODER_MODER6;        //ADC1 CH6 PA6


//*********************TIM3*************************
        
RCC->APB1ENR    |= RCC_APB1ENR_TIM3EN;        // тактирование таймера
        
TIM3->PSC         160-1;                    // предделитель
        
TIM3->ARR         1000-1;                    // переполнение
        
TIM3->CR2         |= TIM_CR2_MMS_1;            // output (TRGO)
        
TIM3->DIER         |= TIM_DIER_UDE;
        
TIM3->CR1         |= TIM_CR1_CEN;                //запуск счета


//********************DMA***************************
        
RCC->AHB1ENR    |= RCC_AHB1ENR_DMA2EN;
        
DMA2_Stream4->CR&=~ DMA_SxCR_CHSEL;            // 000: channel 0 selected
        
DMA2_Stream4->PAR= (uint32_t)&ADC1->DR;     //
        
DMA2_Stream4->M0AR=(uint32_t)&BUFF[0];        // Массив
        
DMA2_Stream4->NDTR=100;                        // Длина буфера
        
DMA2_Stream4->CR|= DMA_SxCR_MINC;            // Инкремент адреса
        
DMA2_Stream4->CR|= DMA_SxCR_MSIZE_0;        // 16 бит
        
DMA2_Stream4->CR|= DMA_SxCR_PSIZE_0;        // 16 бит
        
DMA2_Stream4->CR|= DMA_SxCR_CIRC;            // Непрерывный режим
        
DMA2_Stream4->CR&=~ DMA_SxCR_DIR;            // 01: peripheral-to-Memory
        
DMA2_Stream4->CR|= DMA_SxCR_PL;                // 11: Very high приоритет
        
DMA2_Stream4->CR|= DMA_SxCR_TCIE;            // Transfer complete interrupt enable
        
DMA2_Stream4->CR|= DMA_SxCR_EN;                 // Вкл. передачу
        
NVIC_EnableIRQ(DMA2_Stream4_IRQn);
        
NVIC_SetPriority(DMA2_Stream4_IRQn,5);

//********************ADC1**CH6 PA6***************
        
RCC->APB2ENR    |= RCC_APB2ENR_ADC1EN;
        
ADC1->CR1         |=ADC_CR1_SCAN;                // Scan mode
        
ADC1->CR2        |=(ADC_CR2_EXTSEL_3);        //tim 3 (TRGO)
        
ADC1->SQR3        =6;                            //выбор канала PA6
        
ADC1->CR2         |=ADC_CR2_DMA;                //разрешаем рабуту DMA
        
ADC1->CR2         |=ADC_CR2_DDS;                //DMA disable selection (for single ADC mode)
        
ADC1->CR2        &=~ADC_CR2_CONT;            //Continuous conversion
        
ADC1->CR2        |=ADC_CR2_EXTEN_0;            //01: Trigger detection on the rising edge
        
ADC1->CR2        |= ADC_CR2_EOCS;            //разрешаем прерывания
        
ADC1->CR2         |=ADC_CR2_ADON;                //Вкл. переобразования  

понедельник, 19 сентября 2016 г.

STM32F051 Continuous mode and Discontinuous mode explanation for the sequence conversion

The following illustrations present the differences among various configuration for continuous mode and discontinuous mode for 2 channels:

With both modes disabled: the conversion sequence start from the first channel until the last channel and then stop. Each time the channel conversion is done, the End of Conversion (EOC) interrupt flag will be triggered until the last channel, End of sequence (EOS) will be on.

 continuous mode disabled, and discontinuous mode disabled

With continuous mode enabled, and discontinuous mode disabled: similarly to single channel, the conversion process will be restarted automatically when the last channel is finished.

continuous mode enabled, and discontinuous mode disabled

With continuous mode disabled, and discontinuous mode enabled: Everytime the channel conversion is done, we need to trigger the start of ADC module again to move on to the next channel in the sequence.
continuous mode disabled, and discontinuous mode enabled


вторник, 13 сентября 2016 г.

STM32F ADC config (CMSIS, HAL SPL)

CMSIS

Настройка преобразования первых 8ми регулярных каналов АЦП по запуску из программы с использованием канала DMA

// настройка ADC1
        RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //  такты на ADC1

        ADC1->SMPR2 |= ADC_SMPR2_SMP0 | ADC_SMPR2_SMP1
        | ADC_SMPR2_SMP2 | ADC_SMPR2_SMP3 | ADC_SMPR2_SMP4
        | ADC_SMPR2_SMP5 | ADC_SMPR2_SMP6 | ADC_SMPR2_SMP7;       // количество циклов преобразования 239.5

        ADC1->SQR1 |= ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0; // длина последовательности регулярных каналов = 8;
        // добавление в последовательность каналов
        ADC1->SQR2 |= ADC_SQR2_SQ8_2 | ADC_SQR2_SQ8_1 | ADC_SQR2_SQ8_0 //канал 7
        | ADC_SQR2_SQ7_2 | ADC_SQR2_SQ7_1;                             // канал 6

        ADC1->SQR3 |=  ADC_SQR3_SQ6_2 | ADC_SQR3_SQ6_0                 //канал 5
        | ADC_SQR3_SQ5_2                                               //канал 4
        | ADC_SQR3_SQ4_1 | ADC_SQR3_SQ4_0                              //канал 3
        | ADC_SQR3_SQ3_1                                               //канал 2
        | ADC_SQR3_SQ2_0;                                              // канал 1
        //канал 0 включен по умолчанию т.к. в младших битах SQ3 0

//      ADC1->CR2 |= ADC_CR2_CONT;      // включаем если нужно непрерывное преобразование последовательности в цикле

        ADC1->CR2 |= ADC_CR2_DMA //включаем работу с DMA
        | ADC_CR2_EXTTRIG //включаем работу от внешнего события
        | ADC_CR2_EXTSEL //выбираем триггером запуска регулярной последовательности событие SWSTART
        | ADC_CR2_JEXTSEL; // выбираем триггером запуска выделенной последовательности событие JSWSTART дабы эти каналы не отнимали у мк времени
        ADC1->CR1 |= ADC_CR1_SCAN; // включаем автоматический перебор всех каналов в последовательности

//макросы для включения/выключения АЦП с DMA
#define ADC_ON ADC1->CR2 |= ADC_CR2_ADON;  \
                                ADC1->CR2 |= ADC_CR2_SWSTART; \
                                DMA1_Channel1->CCR |= DMA_CCR1_TCIE | DMA_CCR1_EN;      //включаем преобразование прерывание DMA
#define ADC_OFF ADC->CR2 &= (~(ADC_CR2_ADON)); \
                                DMA1_Channel1->CCR &= (~(DMA_CCR1_TCIE | DMA_CCR1_EN)); //выключаем преобразование и прерывание DMA
     

===============================================================

вторник, 23 декабря 2014 г.

ADC АЦП SPL инициализация

Запуск единичного преобразования с порта A1 и чтение значения по прерыванию


// Подача тактовые импульсы на АЦП.
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// Сброс настройки
ADC_DeInit(ADC1);
// Объявление структуры ADC_InitTypeDef,
ADC_InitTypeDef  ADC_InitStructure;
// Заполнил значения. Имена констант нашел в том же stm32f10x_adc.h,

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
// Инициализация АЦП заполненной структурой
ADC_Init(ADC1, &ADC_InitStructure);
// Включение АЦП 
ADC_Cmd(ADC1, ENABLE);
// Разрешение прерывания по окончанию преобразования
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
// Калибровка
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)) { };
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)) { };

// Настройка группы приоритета прерываний 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// Создал структуру NVIC и заполнение ее значениями
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//Обработчик прерывания
void ADC1_IRQHandler(void) {
    if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
// Чтение значения АЦП
        val = ADC_GetConversionValue(ADC1);
    };
};
//Запуск преобразования
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);