中级会员
 
- 积分
- 273
- 金钱
- 273
- 注册时间
- 2016-12-30
- 在线时间
- 37 小时
|
1金钱
使用STM32F4点HAL库做ADC功能,开发板例子(ADC实验)里面只有单次采集的,我想做成连续采集,但是一直没成功.求指导.
下面是部分代码:
void MY_ADC_Init(void)
{
ADC1_Handler.Instance = ADC1;
ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;
ADC1_Handler.Init.ScanConvMode = ENABLE;
ADC1_Handler.Init.ContinuousConvMode = ENABLE;
ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;
ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
ADC1_Handler.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT;
ADC1_Handler.Init.NbrOfConversion = 1;
ADC1_Handler.Init.DMAContinuousRequests = DISABLE;
ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;//ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&ADC1_Handler);
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
ADC_ChannelConfTypeDef ADC1_ChanConf;
GPIO_InitTypeDef GPIO_Initure;
if(hadc->Instance==ADC1)
{
__HAL_RCC_ADC1_CLK_ENABLE(); //使能ADC1时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_5; //PA5
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
ADC1_ChanConf.Channel=ADC_CHANNEL_5; //通道
ADC1_ChanConf.Rank=1; //第1个序列,序列1
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC_IRQn);
HAL_ADC_Start_IT(&ADC1_Handler); //开启ADC
//HAL_ADC_PollForConversion(&ADC1_Handler,10); //轮询转换
}
}
void ADC_IRQHandler(void)
{
HAL_ADC_IRQHandler(&ADC1_Handler);
}
u16 Get_Adc(u32 ch)
{
return (u16)HAL_ADC_GetValue(&ADC1_Handler); //返回最近一次ADC1规则组的转换结果
}
|
最佳答案
查看完整内容[请看2#楼]
首先这个程序是别人搞得time1触发采样的。要改。从新设置adc独立规则模式,dma设置好。
另外定义一个多维数组
__IO uint16_t ADC1_Reg_Value[10][8];
HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t*)&ADC1_Reg_Value, 80)
如要中断方式自己写dma2strem0的中断。
但是要注意不管什么方法,处理时候要关闭各种adc,dma中断,否则规则通道数值会错位。
我这个数组用于一次采10组8个通道de数据。
|