新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2019-8-1
- 在线时间
- 19 小时
|
1金钱
- 以下是adc+dma和main里的代码,adc就采一个通道,dma采用双缓冲模式,每次传142个数据,正好一个周波,每次先把dma空闲的那块内存里的量导出来,然后can慢慢发,在上位机上看波形总是乱的,请大神帮忙看一下,多谢。
- void Adc_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_CommonInitTypeDef ADC_CommonInitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- // NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1ÄüADC1ê±Öó
-
- /*************3õê¼»ˉADC ***********/
-
- //Ïè3õê¼»ˉGPIO0,1,5,7 IO¿ú
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN ;//Ä£Äaêäèë
- //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//2»′øéÏÏÂà-
- GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ
- /**************ADC_CommonInit********/
-
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1¸′λ
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //¸′λ½áêø
-
- ADC_CommonInitStructure.ADC_Mode =ADC_Mode_Independent;//Ë«í¨μàí¬2½×a»»Ä£ê½ 1æÔòí¬2½
- //ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//ὸö2éÑù½×¶ÎÖ®¼äμÄÑó3ù5¸öÑóê± ¸ÃéèÖÃÖ»Õë¶Ôóú½»ìæ′¥·¢Ä£ê½
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1 ; //DMAÄ£ê½1
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖÆμ4·ÖÆμ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±Öó×îoÃ2»òa3¬1y36Mhz
- ADC_CommonInit(&ADC_CommonInitStructure);//3õê¼»ˉ
-
- /***********ADC13õê¼»ˉ**********/
-
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;//é¨ÃèÄ£ê½
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿aÆôá¬DøÄ£ê½ ÖØ¸′2éÑù
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//éÏéyÑØ′¥·¢
- //ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë
- ADC_InitStructure.ADC_NbrOfConversion = 1;//2¸ö×a»»Ôú1æÔòDòáDÖD
- ADC_Init(ADC1, &ADC_InitStructure);//ADC13õê¼»ˉ
- ADC_Cmd(ADC1,ENABLE);//ê1ÄüADC
- ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles ); //ADC1_PA0,ADCí¨μà,480¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è
- ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
- ADC_DMACmd(ADC1, ENABLE);
- ADC_SoftwareStartConv(ADC1);<div class="blockcode"><blockquote>u32 i=0;
- void MY_DMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u32 mar1,u16 ndtr)
- {
-
- DMA_InitTypeDef DMA_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
- DMA_DeInit(DMA_Streamx);
-
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA¿éÅäÖÃ
- /* ÅäÖÃ DMA Stream */
- DMA_InitStructure.DMA_Channel = chx; //í¨μàÑ¡Ôñ DMA_Channel_0
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)par;//DMAíaéèμØÖ· ADC12_DR_Address
- DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)mar;//DMA ′æ′¢Æ÷0μØÖ·
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//′æ′¢Æ÷μ½íaéèÄ£ê½
- DMA_InitStructure.DMA_BufferSize = ndtr;//êy¾Y′«êäá¿
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·ÇÔöá¿Ä£ê½
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′æ′¢Æ÷Ôöá¿Ä£ê½
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//íaéèêy¾Y3¤¶è:16λ
- DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;//′æ′¢Æ÷êy¾Y3¤¶è:16λ
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;// ê1óÃÑ-»·Ä£ê½
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;//ÖDμèóÅÏè¼¶
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′æ′¢Æ÷í»·¢μ¥′Î′«êä
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí»·¢μ¥′Î′«êä
- DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)mar1, DMA_Memory_0);
- DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE);
- DMA_Init(DMA_Streamx, &DMA_InitStructure);//3õê¼»ˉDMA_Stream0
- DMA_Cmd(DMA_Streamx, ENABLE);
- //¿aÖD¶Ï
- // DMA_ITConfig(DMA2_Stream0,DMA_IT_HTIF0,ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
- //ADC1,ADC2諾ÖÖD¶Ï
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
- //ÇàÕ¼óÅÏè¼¶ 0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- //Ïìó|óÅÏè¼¶ 1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);//′«êäíê3éÖD¶Ï¿ØÖÆÎ»¿aÆô
- }
- void DMA2_Stream0_IRQHandler(void)
- {
- if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0) != RESET)
- {
-
- DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);//Çå3yÖD¶Ï±ê־λ
- }
- }
-
- <div class="blockcode"><blockquote>
- __IO uint16_t ADC1_ConvertedValue[142]; //ÿÖü2¨2éÑù60¸öμ㣬2éÑùÂêÎa3KHz
- __IO uint16_t ADC1_ConvertedValue1[142];
- __IO uint16_t ADC1_ConvertedValueLocal[142];
- extern u32 i;
- #define ADC_DR_Address ((uint32_t)0x4001204C)
- CanRxMsg RxMessage; //½óêÕ»o3åÇø
- __IO uint32_t my_flag=0 ; //½óêÕ3é1|±êÖ¾
- int main(void)
- {
- u16 j,k=0;//da_8,j,k;
- u8 buff[2],res,s;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
- delay_init(168); //3õê¼»ˉÑóê±oˉêy
- uart_init(115200); //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
- LED_Init(); //3õê¼»ˉLED
- Adc_Init(); //3õê¼»ˉADC
- MY_DMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)ADC_DR_Address ,(u32)ADC1_ConvertedValue,(u32)ADC1_ConvertedValue1,142);
- //TIM2_Int_Init(999,83);//3õê¼»ˉ′¥·¢Æ÷t=(acc+1)*(psc+1)/Fs; F=1/t=500Hz
-
- CAN_Config();
- while (1)
- {
- if(DMA_GetCurrentMemoryTarget(DMA2_Stream0))
- {
-
- for (k=0;k<142;k++)
- {
- ADC1_ConvertedValueLocal[k]=ADC1_ConvertedValue[k];
- }
- }
-
- else
- {
- for (k=0;k<142;k++)
- {
- ADC1_ConvertedValueLocal[k]=ADC1_ConvertedValue[k];
- }
- }
- for(j=0;j<142;j++)
- {
- buff[0]= (uint8_t) (ADC1_ConvertedValueLocal[j]&0xff);
- buff[1]= (uint8_t) ((ADC1_ConvertedValueLocal[j]>>8)&0xff);
- res=CAN1_Send_Msg(buff,2);//CAN·¢Ëí
- }
- }
- }
-
-
-
复制代码
|
|