折腾了几天了,还没有把DMA弄得明白,现在把自己做的双通道的AD采样记录一下,免得忘得太快了。
上篇文章已经讲得很详细了,对于ADC的采样,有几个结构需要初始化:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 使能 ADC1时钟线
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式
//为了保证单次通道采集不被覆盖,只好委屈求全了,注意这里的两个DISABLE!!!!!
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件控制转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
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 ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
下面就可以进入真正的ADC配置了,双通道示意。
void GetADValue(void)
{
uint8_t i;
for(i=0;i<2;i++)
{
switch(i)
{
case 0:
/* ADC1 regular channel_8,configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); break;//转换时间为17.1US
case 1:
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_55Cycles5); break;//转换时间为17.1US
}
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);//此处与下面的DISABLE呼应,不可省略,虽然前面已经交代过了。
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//我原以为应该是SET,但实际测试结果让我深思良久
//EOC为0表示转换未完成,但重点还是在那个;,只是在告诉我们等待、等待而已!!!!唉。。。
ADCConvertedValue[i]=ADC_GetConversionValue(ADC1);
//数组存储采样值,便于调用查看。
ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除EOC,DMA时读数据,硬件自动清除
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
ADC_Cmd(ADC1, DISABLE);//与上文呼应,完成一次采样,保证准确性。前面加个延时更为妥当。
}
}
写到这里应该就够明显了,最重要的思想已经表露无遗,剩下的无非就是如何使用采集到的值,还是各显神通吧!!
关键字:STM32 DMA模式 AD采样值
引用地址:
STM32非DMA模式下读取多通道AD采样值
推荐阅读最新更新时间:2024-03-16 15:15
stm32---输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。 1. 相关寄存器介绍 1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位 用于捕获/比较通道 1 的控制,而高八位 则用于捕获/比较通道 2 的控制。同
[单片机]
STM32学习之通用定时器的使用
简介:STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器。此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期。还有一个RTC,是一个毫秒定时器,支持秒级中断,用来做实时时钟计数器。看门狗定时器 也可以算一个。 8个定时器中,Timer1 和Timer8是由APB2(输出最高频率为72MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为72MHz。Timer2~Timer7则是由APB1(输出最高频率为36MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为36MHz。 1、如何进行程序编写 这
[单片机]
STM32中,关于中断函数调用全局变量的问题
首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。 void KEY1_IRQHandler(void) { //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) { run_flag=0x01; EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } } void KEY2_IRQHandler
[单片机]
STM32单片机使用RTOS的好处
很多STM32单片机初学者都是从裸机开始的,裸机确实也能开发出好的产品。但是,作为一个嵌入式软件工程师,况且用的并不是51那种低端单片机,如果只会用裸机开发产品,那肯定是不够的。 要从裸机的思维转变到RTOS(Real Time Operating System)的思维,其实需要一个过程,而且开始的一段时间会很痛苦。但过一段时间理解了一些内容,能写一些Demo之后,你会发现其实RTOS也不难,相关demo推荐:使用STM32CubeMx工具,写FreeRTOS的demo程序。 现在FreeRTOS在CubeMX工具中可以直接配置并使用,相当方便。 为什么需要RTOS 为什么我们需要RTOS?就像最开始学C编程时,老师告
[单片机]
stm32专题十四:存储器介绍
存储器通常分为易失性存储器(RAM - random access memory)和非易失性存储器(ROM - read only memory) 易失性存储器 SRAM:Static Random Access Memory(静态随机存储器),基本的存储单元由SR锁存器组成,不需要定时刷新。 DRAM:Dynamic Random Access Memory(静态随机存储器),由电容和晶体管组成,结构非常简单。动态随机存储器 DRAM 的存储单元以电容的电荷来表示数据,有电荷代表 1,无电荷代表 0。但时间一长,代表 1 的电容会放电,代表 0 的电容会吸收电荷,因此它需要定期刷新操作。刷新操作会对电容进行检查,若电
[单片机]
stm32的DMA空闲中断数据配置
对于串口2的示例: void USART2_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(
[单片机]
关于在Bootloader模式下的应用程序下载
1.引言 STM32 MCU 在 bootloader 模式下,可以通过多种可用外设(USART、CAN、USB、I2C、SPI等)将程序下载到内部存储器中,详细内容可参考应用笔记 AN2606《STM32 microcontroller system memory boot mode》。本文档主要介绍利用 STLINK-V3SET 调试/编程工具的 I2C 接口将程序下载到 SDRAM 中并执行的方法。 2.问题描述 问题源自客户的实际需求,希望通过 I2C 接口将程序下载到 SRAM 中执行,进行芯片功能性测试。 3.问题分析与定位 关于在 Bootloader 模式下的应用程序下载,有多篇 LAT 可参考。例如《如何使用
[单片机]
STM32 串口IAP实验
IAP,即在应用编程。很多单片机都支持这个功能,STM32也不例外。在之前的FLASH模拟EEPROM实验里面,我们学习了STM32的FLASH自编程,本章我们将结合FLASH自编程的知识,通过STM32的串口实现一个简单的IAP功能。 48.1 IAP简介 IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码, 第一个项目程序不执行正常的功能操作,而只是通过
[单片机]