博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32 ADC 同步规则模式(两通道)
阅读量:7049 次
发布时间:2019-06-28

本文共 6471 字,大约阅读时间需要 21 分钟。

  感觉直接贴代码会好点。。。。。。

  

1 #include "adc.h"  2   3 float AD1_Value[N];  4 float AD2_Value[N];  5 volatile u32 ADCConvertedValue[N];//ADת»»»º³åÇø,Õ¼ÓÃRAM 0.8KB  6   7   8 void  Adc_Init(void)  9 {      10     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 11     ADC_InitTypeDef ADC_InitStructure;  12     GPIO_InitTypeDef GPIO_InitStructure; 13     DMA_InitTypeDef DMA_InitStructure; 14     NVIC_InitTypeDef NVIC_InitStructure; 15       Enable Clock   /// 16     RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M 17     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  18     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );      //ʹÄÜADC1ͨµÀʱÖÓ 19     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC2    , ENABLE );      //ʹÄÜADC2ͨµÀʱÖÓ 20 //    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M         21      22     //PA0.PA1.PA4.PA5 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                          23     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1; 24     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //Ä£ÄâÊäÈëÒý½Å 25     GPIO_Init(GPIOA, &GPIO_InitStructure);     26      27 ////Initialize DMA /     28     DMA_DeInit(DMA1_Channel1); //Reset DMA_Channel_1's Register To Default Value 29     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA Device to ADC's Base Address 30     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address     31 //    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address 32     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //Memory be use to Data Chansminsion's Destination 33     DMA_InitStructure.DMA_BufferSize = N; //DMA Channel's DMA Buffer Size 34     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //Outside Address's Register Is not Change  35     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Buffer Address's Register Is Increasing 36     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //Data size is 16 Bit 37     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //Data Size Is 16 Bit  38     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //Work in Cycle Cache Mode 39  40     DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA Channel X Have The Higest Priority 41     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA Channel X do not set up to Chansmission in Memory to Memory 42     DMA_Init(DMA1_Channel1, &DMA_InitStructure); //According to DMA_InitStruct to Initialize the DMA Channel     43     DMA_Cmd(DMA1_Channel1,ENABLE);                               //ʹÄÜDMA1ͨµÀ1 44  45  46 ////Initialize NVIC /     47     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 48     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; 49     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 50     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 51     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 52     NVIC_Init(&NVIC_InitStructure); 53     DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);            //ʹÄÜDMA CH1ÖÐ¶Ï   64 ////Initialize ADC /     65  66     ADC_DeInit(ADC1);  //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ 67     ADC_DeInit(ADC2);  //¸´Î» ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ 68      69     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;    //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½ 70     ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //ADC Works in Scan Model 71     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //ADC works in Continious Changing Model 72     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC is triggered by sofeware instead of Outside 73     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC Data Right Align 74     ADC_InitStructure.ADC_NbrOfChannel = 1;    //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ 75     ADC_Init(ADC1, &ADC_InitStructure);    //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷    76     ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  1, ADC_SampleTime_1Cycles5 ); 77     ADC_DMACmd(ADC1,ENABLE);                         //ʹÄÜADC1 DMA    84     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;    //ADC¹¤×÷ģʽ:ADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½ 85     ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //ADC Works in Scan Model 86     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //ADC works in Continious Changing Model 87     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC is triggered by sofeware instead of Outside 88     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC Data Right Align 89     ADC_InitStructure.ADC_NbrOfChannel = 1;    //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ 90     ADC_RegularChannelConfig(ADC2, ADC_Channel_2,  1, ADC_SampleTime_1Cycles5 ); 91     ADC_Init(ADC2, &ADC_InitStructure);    //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷        92     ADC_ExternalTrigConvCmd(ADC2, ENABLE);  93      94      95     ADC_DMACmd(ADC1, ENABLE);   96     ADC_Cmd(ADC1, ENABLE);    //ʹÄÜÖ¸¶¨µÄADC1 98      99     ADC_ResetCalibration(ADC1);    //ʹÄܸ´Î»Ð£×¼  100     while(ADC_GetResetCalibrationStatus(ADC1));    //µÈ´ý¸´Î»Ð£×¼½áÊø101     ADC_StartCalibration(ADC1);     //¿ªÆôADУ׼102     while(ADC_GetCalibrationStatus(ADC1));     //µÈ´ýУ׼½áÊø103     104     ADC_Cmd(ADC2, ENABLE);105     ADC_ResetCalibration(ADC2);    //ʹÄܸ´Î»Ð£×¼  106     while(ADC_GetResetCalibrationStatus(ADC2));    //µÈ´ý¸´Î»Ð£×¼½áÊø107     ADC_StartCalibration(ADC2);     //¿ªÆôADУ׼108     while(ADC_GetCalibrationStatus(ADC2));     //µÈ´ýУ׼½áÊø109 110 //    delay_ms(10);111     ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ112 }    113 114 115 void DMA1_Channel1_IRQHandler()116 {  117     u16 i;118     u16 temp1,temp2;119   DMA_ClearFlag(DMA1_FLAG_TC1);    //清除DMA传输完成中断120     DMA_Cmd(DMA1_Channel1,DISABLE);    121     for(i = 0; i < N ; i++)122     {123         temp1 = (ADCConvertedValue[i]<<16)>>16;124         temp2 = ADCConvertedValue[i] >> 16;        125         AD1_Value[i] =((float)temp1)*(3.3/4096); 126         AD2_Value[i] =((float)temp2)*(3.3/4096); 127         Get_tem_buf(i);128     }129     DMA_Cmd(DMA1_Channel1,ENABLE);   131     LED0 = ~LED0;132 }

有些注释直接从Keil5里面粘出来到这里就不支持了。。。。。。。好尴尬。。。。下次码代码注释还是全英算了、、、

哈哈。。有什么问题可以一起来探讨、、、不知道为啥分类不到嵌入式那里只好点Linux那里了。。

转载于:https://www.cnblogs.com/VerilogHDL/p/5959486.html

你可能感兴趣的文章
Linux Rsync
查看>>
Redis实现消息队列
查看>>
2k8 32bit下载
查看>>
密码需要带特殊字符
查看>>
个人收集的java精品网站
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
如何在基于Bytom开发过程中集成IPFS
查看>>
后台管理,给列表页新增查询功能,所遇到的问题及感想
查看>>
GraalVM 社区版 1.0 RC15 发布,新一代高性能跨语言虚拟机
查看>>
阿里架构师眼里JVM可以说的那些事
查看>>
C#实现局部峰值查找,功能对应Matlab中的findpeaks.m
查看>>
响应式编程
查看>>
The Road to learn React书籍学习笔记(第一章)
查看>>
WPF 自定义控件的坑(蠢的:自定义控件内容不显示)
查看>>
Confluence 6 空间标识
查看>>
使用kubeadm安装Kubernetes v1.10以及常见问题解答
查看>>
Linux FTP上传脚本
查看>>
Robot Framework之pymysql数据库查询
查看>>
干货 | 机器学习没有你想的那么复杂
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.1. 简单版
查看>>