STM32 配置AD,配置DMA

发布者:kappa20最新更新时间:2019-06-29 来源: eefocus关键字:STM32  配置AD  配置DMA 手机看文章 扫描二维码
随时随地手机看文章

STM32f105rct6:配置AD,配置DMA 两路AD取值通道: 

配置AD:


void ADC_Configuration(void)

{

    ADC_InitTypeDef ADC_InitStructure;

    ADC_StructInit(&ADC_InitStructure);

    /* ADC1 configuration ------------------------------------------------------*/

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = ENABLE;

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件启动

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 2; // 通道数目

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel14 configuration */

    //ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);

    //ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);

    //ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 4, ADC_SampleTime_55Cycles5);

//  假设你定义channle1  的rank=1,channle2 的rank=2,

//那么对应你在DMA缓存空间的变量数组AdcDMA[0] 就i是channle1的转换结果,

//AdcDMA[1]就是通道2的转换结果。

    /* Enable ADC1 DMA */

    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */

    ADC_Cmd(ADC1, ENABLE);

    /* Enable ADC1 reset calibaration register */

    ADC_ResetCalibration(ADC1);

    /* Check the end of ADC1 reset calibration register */

    while (ADC_GetResetCalibrationStatus(ADC1));

    /* Start ADC1 calibaration */

    ADC_StartCalibration(ADC1);

    /* Check the end of ADC2 calibration */

    while (ADC_GetCalibrationStatus(ADC1));

    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换

}



配置DMA: 

芯片里的寄存器基地址: 

//#define SPI1_DR_Address 0x4001300C 

//#define SPI2_DR_Address 0x4000380C


//#define ADC1_DR_Address 0x4001244C 

//#define USART1_DR_Base 0x40013804 

//#define USART2_DR_Base 0x40004404


void DMA_Configuration(void)

{

    DMA_InitTypeDef DMA_InitStructure;

    DMA_StructInit(&DMA_InitStructure);

    DMA_DeInit(DMA1_Channel1);

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//DMA外设ADC基地址

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_stuKEY.KeyAD;//DMA内存基地址  数组:g_stuKEY.KeyAD[2]

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向

    DMA_InitStructure.DMA_BufferSize = 2;// 2//DMA通道的DMA缓存的大小

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //16 bit

    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, &DMA_InitStructure);

    //DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

    /* Enable DMA1 channel1 */

    DMA_Cmd(DMA1_Channel1, ENABLE);


}


直接使用数组里的数据,已经通过DMA 转化存放好


u16 GetVotFromAD(g_stuKEY.KeyAD[0])

{

    //u16 int_part,float_part;

    u16 temp;

    temp = u16AD;

    //把采集到的数据转换成电压值

    temp = (u16)((((u32)temp) * 3300) >> 12);

    //int_part   = temp/1000;

    //float_part = temp%1000;

    return temp;

}



关键字:STM32  配置AD  配置DMA 引用地址:STM32 配置AD,配置DMA

上一篇:STM32 FSMC机制flash拓展
下一篇:STM CAN filter配置纪要

推荐阅读最新更新时间:2024-11-12 10:29

42.485通信实验
一。485接口原理 二。485电路芯片SP3485 一般2,3脚连在一起,当2,3脚为低电平时,使能RO端,当2,3脚为高电平时,使能DI端。 三。电路 采用UART2接口,PA2为USART2_TX,PA3为USART2_RX PA2接SP3485的4脚DI端 PA3接SP3485的1脚RO端 四。程序 串口2初始化 //初始化IO 串口2 //pclk1:PCLK1时钟频率(Mhz) //bound:波特率 void RS485_Init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART
[单片机]
42.485通信实验
STM32配置IIC接口通信方式参考源码
最近在读取SHT3x系列sensor的温度和湿度,用到的是IIC接口。 顺便写了一下STM32的IIC接口。 这次配置的是STM32内部的IIC接口。 注意:读的时候,怎么发送Ack, 和 NAck信号,参考stm的设计文档。 #include Dev_SHT3X.h #include globalDef.h #include stdio.h #define I2C1_OWN_ADDRESS7 0x0A #define I2C_Speed 40000 #define SHT3X_ADDRESS 0x44 /* read out command */ #define CMD_READH_SHX
[单片机]
STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法
@STM32踩坑记录(1) 使用的软件及硬件: 硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器 软件平台:keil5 使用的是标准库+freertos。 ##遇到问题时的场景 在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时 ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。 ##:遇到的问题: 因为板载的BMI088上有两个外部中断引脚,分别为INT1
[单片机]
<font color='red'>STM32</font>踩坑记录(1):编写代码时遇到<font color='red'>STM32</font>无法进入外部中断的原因及解决方法
STM32时钟系统概述
STM32时钟框图如下: 重要的时钟: 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。   ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。   ③、LSI是低速内部时钟,RC振荡
[单片机]
<font color='red'>STM32</font>时钟系统概述
STM32之时钟树笔记
1 STM32有五个时钟源:HSI、HSE、LSI、LSE、PLL 1.1 HSI:高速内部时钟、RC振荡器、频率为8MHz、时钟精度较差,可作为备用时钟源(时钟安全系统CSS)。 1.2 HSE:高速外部时钟、可接外部晶体/陶瓷谐振器(4MHz~16MHz)或外部时钟源(HSE旁路,Max 25MHz)。 1.3 LSI:低速内部时钟、RC振荡器、频率为40kHz,大容量MCU可进行LSI时钟校准。 1.4 LSE:低速外部时钟、接频率为32.768kHz的外部晶体/陶瓷谐振器。 1.5 PLL:锁相环倍频输出,时钟输入源可选择HSI/2、HSE或HSE/2。倍频可选择为2~16倍,最大输出72MHz。 用户可通过多
[单片机]
STM32】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电压
项目场景: 因为项目的一个功能需求,需要输出一个高电平为5V的PWM。 问题描述: 发现输出的PWM高电平最高只有4V不到的样子,很接近于4V。实测过普通开漏输出,高电平完全可以达到外部上拉的5V。HAL库也试过了,也是完全可以达到5V的,但是标准库的配置一直上不去。 原因分析: 仔细对比发现没啥异常,配的都是对的,但是可以肯定的是,肯定还是配置,因为HAL库可以实现,那就说明一定还是某个地方配的有问题。最后才知道开漏输出脚必须配置为浮空,不配置的话实测默认的是内部上拉。 1.内部下拉: 2.内部上拉: 3.浮空: 解决方案: 一句话:GPIO_InitStructure.GPIO_PuPd = GPIO_
[单片机]
【<font color='red'>STM32</font>】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电压
STM32 上电后的启动过程
微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然
[单片机]
STM32之一 建立工程及led闪烁
摸索了好久,今天终于实现了自己的工程模板,首先看下我的工程结构: 我的工程文件夹建立了五个文件夹,CMSIS、Libraries、Project、Startup、USER。里面分别存放了各自的初始文件, 关于MDK中的工程树情况如上图,分别在各自的文件夹下存放各自的文件,我们采用的是模块化编程,例如编写led程序就建立led.h和led.c文件,添加至工程,另外建立了延时函数文件,即delay.c和delay.h文件,而且这文件以后都可以用在其他工程中,led灯闪烁即led.c中, 首先要建立GPIO对象,然后首先要进行时钟使能,然后对GPIO进行初始化,下面来看led.h文件: 关键是中间的两个宏定义,定义ledon代表了
[单片机]
<font color='red'>STM32</font>之一 建立工程及led闪烁
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved