Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f1 cmsis ADC-DMA-PWM

Вт апр 14, 2020 13:27:56

Как запустить данные АЦП через ДМА и управлять ШИМом ?Вот исходник вроде всё правильно но не работает.
void adc1_init(void)
{

RCC->CFGR &=~ RCC_CFGR_ADCPRE;

RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
GPIOA->CRL&=~GPIO_CRL_CNF1;
GPIOA->CRL&=~ GPIO_CRL_MODE1;
GPIOA->CRL&=~GPIO_CRL_CNF2;
GPIOA->CRL&=~ GPIO_CRL_MODE2;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;

//RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;

//подаем тактирование АЦП
ADC1->CR2 |= ADC_CR2_RSTCAL;
while (!(ADC1->CR2 & ADC_CR2_RSTCAL))
{
}

ADC1->CR2 |= ADC_CR2_CAL;
// while (!(ADC1->CR2 & ADC_CR2_CAL));
// {
// }

ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП
ADC1->CR2 |= ADC_CR2_EXTSEL;
// ADC1->CR1|=ADC_CR1_SCAN ;
ADC1->CR2 |= ADC_CR2_EXTTRIG;
// ADC1->CR1&=~ADC_CR1_DUALMOD;
ADC1->SMPR2&=~ ADC_SMPR2_SMP1_0; //1
ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1
ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1

ADC1->SQR3 |= ADC_SQR3_SQ1_0; //1 IN1
ADC1->SQR3 &= ~ ADC_SQR3_SQ1_1; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0
ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ1_4;
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART;
//}
//void adc2_init(void)
//{
//RCC->CFGR &=~ RCC_CFGR_ADCPRE;
//RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
// GPIOA->CRL&=~GPIO_CRL_CNF2;
// GPIOA->CRL&=~ GPIO_CRL_MODE2;
// RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;
// RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
// ADC2->CR2 |= ADC_CR2_RSTCAL;
// while (!(ADC2->CR2 & ADC_CR2_RSTCAL))
// {
// }

// ADC2->CR2 |= ADC_CR2_CAL;
//ADC2->CR2 |=ADC_CR2_CONT;//включить АЦП
//ADC2->CR2 |= ADC_CR2_EXTSEL;
// ADC2->CR2 |= ADC_CR2_EXTTRIG;
//ADC2->SMPR2&=~ ADC_SMPR2_SMP2_0; //1
// ADC2->SMPR2&=~ADC_SMPR2_SMP2_1; //1
// ADC2->SMPR2 &=~ ADC_SMPR2_SMP2_2; //1
// ADC2->SQR3 &=~ ADC_SQR3_SQ1_0; //1 IN1
// ADC2->SQR3 |= ADC_SQR3_SQ1_1; //0
// ADC2->SQR3 &= ~ADC_SQR3_SQ1_2; //0
// ADC2->SQR3 &=~ ADC_SQR3_SQ1_3; //0
// ADC2->SQR3 &= ~ADC_SQR3_SQ1_4;
// ADC2->CR2 |= ADC_CR2_ADON;
}
void init_pwm_timer4(void)
{

RCC->APB2ENR|=RCC_APB2ENR_IOPBEN ;

GPIOB->CRL|=GPIO_CRL_CNF6_1;
GPIOB->CRL&=~GPIO_CRL_CNF6_0;
GPIOB->CRL|= GPIO_CRL_MODE6_1;
GPIOB->CRL|= GPIO_CRL_MODE6_0;
//--настройка второго канала шим-порт7------//
GPIOB->CRL|=GPIO_CRL_CNF7_1;
GPIOB->CRL&=~GPIO_CRL_CNF7_0;
GPIOB->CRL|= GPIO_CRL_MODE7_1;
GPIOB->CRL|= GPIO_CRL_MODE7_0;
RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;
AFIO->MAPR&=~AFIO_MAPR_TIM4_REMAP;
RCC->APB1ENR|= RCC_APB1ENR_TIM4EN ;
TIM4->PSC= 0;
TIM4->ARR= 65535;
TIM4->CCMR1&=~TIM_CCMR1_CC1S;//настройка канала 1 на выход.
TIM4->CCMR1&=~TIM_CCMR1_CC2S;//настройка канала 2 на выход.
TIM4->CR1&=~TIM_CR1_DIR;
TIM4->CCMR1|= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;//|TIM_CCMR1_OC1M_0;//;//
TIM4->CCMR1|= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;//|TIM_CCMR1_OC2M_0;//

TIM4->CCMR1|=TIM_CCMR1_OC1PE;
TIM4->CCMR1|=TIM_CCMR1_OC2PE;




TIM4->CCER |=TIM_CCER_CC1E;
TIM4->CCER |=TIM_CCER_CC2E;
TIM4->CCER &=~TIM_CCER_CC1P;
TIM4->CCER &=~TIM_CCER_CC2P;
TIM4->CR1|=TIM_CR1_ARPE;
TIM4->EGR|= TIM_EGR_UG;
// TIM4->CCR1=30000;
TIM4->CR1|= TIM_CR1_CEN;
}

void DMA_init(void)
{
RCC->AHBENR|=RCC_AHBENR_DMA1EN;
DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR;
DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR2;
DMA1_Channel1->CNDTR=1;
DMA1_Channel1->CCR|=DMA_CCR_CIRC;
DMA1_Channel1->CCR&=~DMA_CCR_PINC ;
DMA1_Channel1->CCR&=~DMA_CCR_MINC;
DMA1_Channel1->CCR|=DMA_CCR_PSIZE_0 ;
DMA1_Channel1->CCR|=DMA_CCR_MSIZE_0;
DMA1_Channel1->CCR&=~DMA_CCR_DIR ;

ADC1->CR2|=ADC_CR2_DMA;
}
int main(void)
{

//GPIOAB_init();

GPIOC_init();

IWDT_init();
timer1_init();
timer2_init();
timer3_init();
init_pwm_timer4();

adc1_init();
DMA_init();
Ответить