stm32 adc双通道+dma+定时器1sdma串口输出

上传人:子 文档编号:42994657 上传时间:2018-06-04 格式:DOC 页数:9 大小:16.71KB
返回 下载 相关 举报
stm32 adc双通道+dma+定时器1sdma串口输出_第1页
第1页 / 共9页
stm32 adc双通道+dma+定时器1sdma串口输出_第2页
第2页 / 共9页
stm32 adc双通道+dma+定时器1sdma串口输出_第3页
第3页 / 共9页
stm32 adc双通道+dma+定时器1sdma串口输出_第4页
第4页 / 共9页
stm32 adc双通道+dma+定时器1sdma串口输出_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《stm32 adc双通道+dma+定时器1sdma串口输出》由会员分享,可在线阅读,更多相关《stm32 adc双通道+dma+定时器1sdma串口输出(9页珍藏版)》请在金锄头文库上搜索。

1、stm32stm32 ADCADC 双通道双通道+DMA+DMA+定时器定时器 1sDMA1sDMA 串口输出串口输出1.void ADC_Configuration()ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /独立模式 ADC_InitStructure.ADC_ScanConvMode =ENABLE; /扫描转换模式ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; /连续转换 ADC_InitStructure.

2、ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /转换不受外界决定 ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; /右对齐 ADC_InitStructure.ADC_NbrOfChannel =2; /2 个通道ADC_Init(ADC1, ADC_RegularChannelConfig(ADC1,ADC_Channel_15, 1,ADC_SampleTime_239Cycles5); /通道 15,因为模拟输入在 PC5上,采样时间为 71.5 周期,1 代表规则通道第 1

3、 个这个 1 是啥意思我不太清楚只有是 1 的时候我的 ADC 才正常。 ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 2,ADC_SampleTime_239Cycles5);/内部温度传感器,接 16 通道,两个采样周期要相同,不然不对称ADC_TempSensorVrefintCmd(ENABLE);/*使能内部温度传感器和参考电压*ADC_DMACmd(ADC1,ENABLE); /*将 ADC1 与 DMA关联*ADC_Cmd (ADC1,ENABLE); /使能或者失能指定的ADC ADC_ResetCalibration(ADC1);

4、/* Enable ADC1 reset calibaration register */ while(ADC_GetResetCalibrationStatus(ADC1);/* Check the end of ADC1 reset calibration register */ADC_StartCalibration(ADC1); /* Start ADC1 calibaration */while(ADC_GetCalibrationStatus(ADC1); /* Check the end of ADC1 calibration */ ADC_SoftwareStartConvCm

5、d(ADC1,ENABLE);/*启动ADC 转换 移到 DMA_Configuration 中*2.RCC_ADCCLKConfig(RCC_PCLK2_Div6);/配置 ADC 时钟=PCLK2/6=12MHzRCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);3.GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPI

6、O_Init(GPIOC, 4.void DMA_Configuration()DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; /ADC1 的 DR 地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) 不加/外设向内存传数据DMA_InitStructure.DMA_BufferSize = N; /DMA 缓存大小DMA_InitStructure.DMA_Pe

7、ripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /目标内存地址自动后移DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址 ADC 不用后移DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize =

8、DMA_MemoryDataSize_HalfWord;/DMA 传送数据尺寸 16 位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/常用循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;/禁止内存到内存模式DMA_Init(DMA1_Channel1, /* Enable DMA1 channel 1 */DMA_Cmd(DMA1_Channel1, ENABLE);ADC_SoftwareS

9、tartConvCmd(ADC1,ENABLE);/*启动ADC 转换 移到这里了*5.全局变量:#define N 20unsigned short ADC_ConvertedValueN;6.main 中 DMA 要在 ADC 配置之后u8 i=0;u32 AD_sum=0;float SOR_sum=0;while(1)for(i=0;iN;+i)AD_sum+=ADC_ConvertedValuei;+i;SOR_sum+=ADC_ConvertedValuei;printf(“AD Value = 0x%04Xn“,AD_sum/10);printf(“SOR_Value = %0.

10、2fn“,( 1.43-(SOR_sum/10)*3.3/4095)*1000/4.3+25 );printf(“=n“);Delay(0xFFFFFF);AD_sum=0;SOR_sum=0;2.void TIMER_Configuration()TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_DeInit(TIM2); /重新将 Timer 设置为缺省值TIM_InternalClockConfig(TIM2);/采用内部时钟给 TIM2 提供时钟源TIM_TimeBaseStructure.TIM_Prescaler = 36000 -

11、 1; /预分频系数为 36000-1,这样计数器时钟为 72MHz/36000 = 2kHzTIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/设置计数器模式为向上计数模式TIM_TimeBaseStructure.TIM_Period = 2000 - 1; /设置计数溢出大小,每计 2000 个数就产生一个更新事件TIM_TimeBaseInit(TIM2, /将配置应用到 TIM2 中TIM_ClearFlag(TI

12、M2, TIM_FLAG_Update); /清除溢出中断标志TIM_ARRPreloadConfig(TIM2, DISABLE); /禁止 ARR 预装载缓冲器TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/开启 TIM2 的中断TIM_Cmd(TIM2,ENABLE); /开启定时器 23.void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure;/* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroup

13、Config(NVIC_PriorityGroup_1);#ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endifNVIC_InitStructure.N

14、VIC_IRQChannel = TIM2_IRQn ; /选择TIM2 的中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /响应式中断优先级设置为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /使能中断NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(4.void TIM2_IRQHandler()DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1

15、_Channel4);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804; /USART1 的 DR 地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;/外设向内存传数据DMA_InitStructure.DMA_BufferSize = 8; /DMA 缓存大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /目标内存地址自动后移DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;/DMA 传送数据尺寸 16 位DMA_InitStructur

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号