STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验

发布者:mmsg3814最新更新时间:2017-09-18 来源: eefocus关键字:STM32F103ZET6  ADC  TIM  DMA  USART 手机看文章 扫描二维码
随时随地手机看文章

1、实验目的

1)使用 TIM1 触发 ADC,ADC 采集的数据通过DMA 传至内存,然后通过串口打印出采集的数据;  

2)学会 DMA 传输数据并将数据进行保存;

3)验证ADC 的采样率与实际设置的是否相符。


2、硬件资源

1)指示灯

2)ADC

3)DMA

4)TIM

5)杜邦线


3、软件设计


  1. void  Adc_Configuration(void)  

  2. {     

  3.   DMA_InitTypeDef DMA_InitStructure;  

  4.   ADC_InitTypeDef   ADC_InitStructure;    

  5.   GPIO_InitTypeDef GPIO_InitStructure;   

  6.   

  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC   | RCC_APB2Periph_AFIO, ENABLE);      

  8.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  

  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  11.   GPIO_Init(GPIOC, &GPIO_InitStructure);  

  12.       


  1.   /* Enable DMA1 clock */  

  2.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  3.       

  4.   DMA_DeInit(DMA1_Channel1);                                        /* 复位DMA1寄存器到缺省状态 */  

  5.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                   /* 选择ADC1的数据寄存器作为源 */  

  6.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Sample.Ch1Buf;                   /* 目标地址 */  

  7.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                            /* 设置DMA传输方向,外设(ADC)作为源 */  

  8.   DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;                              /* 设置缓冲区大小 */  

  9.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;              /* 外设地址不自增 */  

  10.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                       /* 存储器地址需要自增 */  

  11.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   /* 选择外设传输单位:16bit */  

  12.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;           /* 选择内存传输单位:16bit */  

  13.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                 /* 无需循环模式   */  

  14.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;                           /* 选择DMA优先级 */  

  15.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                  /* DMA传输类型,不是内存到内存 */  

  16.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

  17.   

  18.   /* Enable DMA1 channel1 */  

  19.   DMA_Cmd(DMA1_Channel1, ENABLE);  

  20.       

  21.       

  22.  /* 配置ADC1  */  

  23.       

  24.   /* ADCCLK = PCLK2/2 */  

  25.   RCC_ADCCLKConfig(RCC_PCLK2_Div2);     /* ADCCLK = PCLK2/2 = 36MHz */  

  26.   

  27.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  

  28.   

  29.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  

  30.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;  

  31.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                       /* 连续转换静止 */  

  32.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;     /* 选择TIM1的CC3做触发 */  

  33.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                    /* 数据右对齐,高位为0 */  

  34.   ADC_InitStructure.ADC_NbrOfChannel = 1;                                   /* 1个通道 */  

  35.   ADC_Init(ADC1, &ADC_InitStructure);  

  36.   

  37.   /* ADC1 regular channels configuration */  

  38.   ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);  

  39.   

  40.   /* Enable ADC1 external trigger conversion */  

  41.   ADC_ExternalTrigConvCmd(ADC1, ENABLE);  

  42.   

  43.   /* 使能 ADC1 */  

  44.   ADC_Cmd(ADC1, ENABLE);  

  45.   

  46.   /* Enable ADC1 DMA */  

  47.   ADC_DMACmd(ADC1, ENABLE);  

  48.   

  49.   /* 使能 ADC1 复位校准寄存器 */  

  50.   ADC_ResetCalibration(ADC1);  

  51.   /* 检测复位校准寄存器 */  

  52.   while(ADC_GetResetCalibrationStatus(ADC1));  

  53.   

  54.   /* 开始 ADC1 校准 */  

  55.   ADC_StartCalibration(ADC1);  

  56.   /* 等待校准结束 */  

  57.   while(ADC_GetCalibrationStatus(ADC1));  

  58.       

  59.           

  60.   /* 配置采样触发定时器,使用TIM1 CC1 */  

  61.   ADC_SampleRate(ADC_Sample.SampleFreq);    /* 修改采样频率 */  

  62. }                   

  63.   

  64. /* 

  65.  * Function Name  : ADC_SampleRate 

  66.  * Description    : 修改ADC的采样频率 

  67.  * Input          : - freq: 采样频率 单位Hz 

  68.  * Output         : None 

  69.  * Return         : None 

  70.  * Attention          : None 

  71.  */  

  72. void ADC_SampleRate(uint32_t freq)  

  73. {  

  74.   /* 配置定时器1第3通道CC3作为ADC1的触发源 */     

  75.   uint16_t Period;    

  76.   TIM_OCInitTypeDef  TIM_OCInitStructure;  

  77.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

  78.   

  79.   TIM_Cmd(TIM1, DISABLE);  

  80.   

  81.     /* 采样频率计算公式 : period = 72000000 / freq ; 1200 == 60KHz 采样频率 */  

  82.   Period = 72000000 / freq;       

  83.   

  84.   /* Enable TIM1 clock */  

  85.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  

  86.   

  87.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);   

  88.   TIM_TimeBaseStructure.TIM_Period = Period;            

  89.   TIM_TimeBaseStructure.TIM_Prescaler = 0;        /* 计数频率 = 72000 000 / 18 = 4000 000    */  

  90.   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;      

  91.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    

  92.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  

  93.   

  94.   /* TIM1 channel1 configuration in PWM mode */  

  95.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   

  96.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                  

  97.   TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;   

  98.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;           

  99.   TIM_OC3Init(TIM1, &TIM_OCInitStructure);  

  100.   

  101.   /* TIM1 counter enable */  

  102.   TIM_Cmd(TIM1, ENABLE);  

  103.   

  104.   /* TIM1 main Output Enable */  

  105.   TIM_CtrlPWMOutputs(TIM1, ENABLE);    

  106. }  


采样率的确定:

由两部分组成:ADC 转换时间 + 定时器的触发需要的时间


4、验证

验证程序是自己通过 DAC 产生一个正弦波,频率为 10KHz,设置ADC的采样频率为900KHz,通过串口打印出来的数据,可以确定一个周期的点数在90个左右,符合要求。 


关键字:STM32F103ZET6  ADC  TIM  DMA  USART 引用地址:STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验

上一篇:STM32F207核心版的LwIP例程的心得
下一篇:网络通信之UIP在STM32上的移植

推荐阅读最新更新时间:2024-03-16 15:37

STM32的PWM输入模式设置并用DMA接收数据
环境: 主机:WIN7 开发环境:MDK4.72 MCU:STM32F103 说明: 项目中需要进行红外学习,如果采用输入捕获的方式,因为定时器只能捕获上升沿或者下降沿,所以只能获得周期,而不能得到具体的红外波的高低电平的时间.所以采用PWM输入的方式进行捕获. 采用的是PA8脚,对应TIM1的通道1. 源代码: /********************************************************************* * 函数 ***********************************************************
[单片机]
STM32F103ZET6 ADC+TIM+DMA+USART 综合实验
1、实验目的 1)使用 TIM1 触发 ADC,ADC 采集的数据通过DMA 传至内存,然后通过串口打印出采集的数据; 2)学会 DMA 传输数据并将数据进行保存; 3)验证ADC 的采样率与实际设置的是否相符。 2、硬件资源 1)指示灯 2)ADC 3)DMA 4)TIM 5)杜邦线 3、软件设计 void Adc_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
[单片机]
【菜鸟入门】stm32 iic
纠结了两天,终于重新开始写了,这两天一直卡在硬件iic上,由于硬件iic是比较难啃的一块骨头,问题一大堆,明明感觉配置好,测试时,一会出这个问题,一会出那个问题,哎,说多了都是泪。。。。 最后木有办法了,总不能吊死在一棵树上吧,然后就写了个模拟的iic的,由于对iic研究和应用的比较多(我们实验室的设备都是iic通信的,所有设备的驱动都是我来写的),所以在搞这个的时候得心应手,一个小时就把所有的搞定了,有花了1个小时把eeprom(at24c02)调通; 我大致测了下,我的板子上的eeprom电路类似这个: 所以我要做的是就是把PB6配置称时钟线SCL,PB7配置成数据线SDA 这里我们再配置输出的时候,要把管脚配
[单片机]
【菜鸟入门】stm32 <font color='red'>之</font> iic
MSP430 ADC12模块的组成_ADC12寄存器说明
  一、简单介绍:   ADC12模块中是由以下部分组成:输入的16路模拟开关(外部8路,内部4路),ADC内部电压参考源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等组成。   四种采样模式:   (1)单通道单次转换模式   (2)序列通道单词转换模式   (3)单通道多次转换模式   (4)序列通道多次转换模式   个人觉得(3)模式应该是使用较多的,   对选定的通道进行多次转换,直到关闭该功能或ENC=0。进行如下设置:   x=CSStartAdd,指向转换开始地址   ADC12MEMx存放转换结果   ADC12MCTLx 寄存器 中定义了通道和参考电压
[单片机]
MSP430 <font color='red'>ADC</font>12模块的组成_<font color='red'>ADC</font>12寄存器说明
stm32的TIM定时器HAL库函数的使用
相关具体内容参考 stm32f4xx_hal_time.h 几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。 /****** xxx使用上述几种模式的英文替换即可*******/ HAL_TIM_xxx_Init HAL_TIM_xxx_DeInit HAL_TIM_xxx_MspInit HAL_TIM_xxx_MspDeInit /***轮询方式启动/停止/ HAL_TIM_xxx_Start HAL_TIM_xxx_Stop /***中断方式启动/停止/ HAL_TIM_xxx_Start_IT HAL_TIM
[单片机]
通富微电:公司系联发科国内封测业务最主要的合作厂商
8月13日,通富微电在互动平台表示,公司是联发科在国内封测业务最主要的合作厂商之一。 通富微电致力于集成电路封装测试业务,2018年、2019年连续两年收入规模位列国内第二、全球第六。 此外,针对网友“华为海思要求封测设备要进行国产替代”的问题,通富微电表示,国产替代大趋势下,公司会优先采购性价比高的国产设备。
[手机便携]
通富微电:公司系联发科国内封测业务最主要的合作厂商<font color='red'>之</font>
从ELEXCON 2010看电子产业升级转型机遇
2010年8月,距离第十二届高交会电子展(ELEXCON2010)召开的日子还有三个多月,全部展位就已经销售一空,主办方创意时代在同期举办的高交会电子展市场大会和第七届中国手机制造技术论坛(CMMF 2010)等一系列活动的筹备工作也进展迅速,诸多来自电子制造设备、电子元器件和电子材料等领域的厂商早早就做好了参展计划和准备,火热的情形几乎让人无法相信电子行业刚刚遭遇过一场全球性的经济危机。 “经历过经济危机的洗礼,更多电子企业对今后的发展道路进行了反思和变革,开始着手进行产品技术含量和企业品牌价值的提升;而深圳人力资源成本和城市定位的不断变化,也让更多企业开始提高自动化生产程度和更新制造设备与工艺;再加上近年来LED
[其他]
从ELEXCON 2010看电子产业升级转型<font color='red'>之</font>机遇
STM32的ADC单次转换设计
下面分别为库函数和直接操作寄存器的两个范便,我都已测试通过 使用此程序前必要对GPIO设好为模拟输入方式 =====================================库函数版========================================= void AD_CONFIG_SINGLE(void ) { //先配置IO口: ADC_InitTypeDef adcInitStruct; ////PB1 作为模拟通道输入引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);//使能ADC和GPIOC时钟 //配置ADC: //将ADC配置成非
[单片机]
STM32的<font color='red'>ADC</font>单次转换设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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