完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.首先讲讲它的原理
(1)关于单片机的数据传递(CPU方案) 两种方案的对比图 2.再看看它的参考代码 (1)M_adc.c文件 #include u16 adc_get[buff_sizes]; //------------------------------------------ADC校准函数(嵌在ADC_init函数内)-----------------------------------------------------// void ADC_Reset(ADC_TypeDef* ADCx) { ADC_ResetCalibration(ADCx); //复位校准寄存器 寄存器置1 while(ADC_GetResetCalibrationStatus(ADCx)); //等待校准寄存器复位完成 寄存器置0 ADC_StartCalibration(ADCx); //ADC校准 寄存器置1 while(ADC_GetCalibrationStatus(ADCx)); //等待校准完成 寄存器置0 } //------------------------------------------ADC初始化函数-----------------------------------------------------// void adc_init(void) { ADC_InitTypeDef ADC_InitStructure; //结构体_ADC基础-声明 GPIO_InitTypeDef GPIO_InitStructure; //结构体_引脚基础-声明 DMA_InitTypeDef DMA_InitStructure; //结构体_DMA基础-声明 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); //时钟开启_GPIOA,ADC1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //时钟开启_DMA1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //结构体_引脚-PA1 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //结构体_引脚-引脚频率_50Mhz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //结构体_引脚-引脚模式_模拟输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //结构体_引脚_结束配置 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_1_data_address; //设置DMA外设地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&adc_get; //设置DMA内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA方向 -- 外设到内存 DMA_InitStructure.DMA_BufferSize = buff_sizes; //缓存大小 -- 一次大循环要传的数据大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //DMA外设地址-不扩增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //DMA内存地址-扩增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //DMA的外设数据的大小格式-- 1个字 32位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA的外设数据的大小格式-- 半个字 16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA的读取次数,一个周期就结束(无循环) DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA的优先级-中等 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA的内存到内存传输-关闭 DMA_Init(DMA1_Channel1, &DMA_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //结构体_ADC-总模式_独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //结构体_ADC-是否扫描_单通道 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //结构体_ADC-是否连续_单次 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //结构体_ADC-触发方式_软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //结构体_ADC-对齐方式_右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //结构体_ADC-通道个数_单通道 ADC_Init(ADC1, &ADC_InitStructure); //结构体_ADC_结束配置 // RCC_ADCCLKConfig(RCC_PCLK2_Div2); //ADC1-时钟分频配置 PS:原始输入的ADC输入时钟是1/2的系统时钟 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5); //配置内容和ADC外设的具体对接函数 (ADC端口 ,ADC通道 ,转换序号-第几个转换 ,转换的周期) ADC_DMACmd(ADC1,ENABLE); //开关_ADC的DMA通道-开关 DMA_Cmd(DMA1_Channel1,ENABLE); //开关_DMA-开关 ADC_Cmd(ADC1,ENABLE); //开关_ADC-总开关 ADC_Reset(ADC1); //ADC校准函数 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //开启软件转换 } //------------------------------------------ADC运算读取数值函数-----------------------------------------------------// float Read_ADC_data(ADC_TypeDef* ADCx) { float kk=0; ADC_SoftwareStartConvCmd(ADCx,ENABLE); //开关_ADC软件触发-开关 状态寄存器为0 while(!ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC)); //等待转换结束 寄存器置1 kk=(3.3*(((float)ADC_GetConversionValue(ADCx)/4096))); //百分比值转化成电压值, 因为读取了数据寄存器,状态寄存器自动清0 return kk; //返回电压值 } (2)main.c文件 int main(void) { SystemInit(); //初始化系统时钟 自动配置成72Mhz ADC_DeInit(ADC1); //默认化ADC1 adc_init(); //初始化ADC1 while(1); } (3)DMA配置图 PS: STM32固件库里面的结构体配置往往都只是涉及到模式的配置,而并没有开关使能等内容,所以并不是说结构体配置完就可以用了,所以 特意把对应功能的使能命令放在函数的末尾,把涉及到的寄存器放在最上面,方便理解和记忆,一般涉及到哪些寄存器、外设和功能,那么找对应的使能开关,然后使能它们即可。 此次涉及到的开关 1.adc_dam通道-开关 2.dma-总开关 3.adc-总开关 4.adc_校准-开关 5.adc_软件触发-开关 关于dma配置函数内的几个参数的注意点: 1. DMA_BufferSize=是指dma干一次活的量,比如说我想收集100个ad值然后求平均值,那么这个值就设为100,并且对应的内存变量数据个数也要是100个(往往是数组变量,个数为100个) 2. PeripheralDataSize和MemoryDataSize=这两个分别是内存和外设的单个数据的大小,比如说adc外设采集到的一个数据是8位的,那么外设的这个值就是8位(byte),内存端也一样。 3. DMA_Mode=是指dma搬运的次数,比如说是循环模式,那么就是每次搬N (缓存量就是 DMA_BufferSize) 个数据到规定的地方,然后搬完一次后,又从外设拿到新的N个数据,把它们放到规定的地方(覆盖掉上一次的数据),然后一直循环。再比如是正常模式,就是说,cpu给了指令搬运N个数据到指定位置,搬了一趟,就结束搬运,直至cpu再次发送指令。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1865浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
648浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
517浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 11:45 , Processed in 1.145600 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号