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. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC   | RCC_APB2Periph_AFIO, ENABLE);
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOC, &GPIO_InitStructure);
  1. /* Enable DMA1 clock */
  2. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  3. DMA_DeInit(DMA1_Channel1);                                        /* 复位DMA1寄存器到缺省状态 */
  4. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                   /* 选择ADC1的数据寄存器作为源 */
  5. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Sample.Ch1Buf;                   /* 目标地址 */
  6. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                            /* 设置DMA传输方向,外设(ADC)作为源 */
  7. DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;                              /* 设置缓冲区大小 */
  8. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;              /* 外设地址不自增 */
  9. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                       /* 存储器地址需要自增 */
  10. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   /* 选择外设传输单位:16bit */
  11. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;           /* 选择内存传输单位:16bit */
  12. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                 /* 无需循环模式   */
  13. DMA_InitStructure.DMA_Priority = DMA_Priority_High;                           /* 选择DMA优先级 */
  14. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                  /* DMA传输类型,不是内存到内存 */
  15. DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  16. /* Enable DMA1 channel1 */
  17. DMA_Cmd(DMA1_Channel1, ENABLE);
  18. /* 配置ADC1  */
  19. /* ADCCLK = PCLK2/2 */
  20. RCC_ADCCLKConfig(RCC_PCLK2_Div2);     /* ADCCLK = PCLK2/2 = 36MHz */
  21. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  22. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  23. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  24. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                       /* 连续转换静止 */
  25. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;     /* 选择TIM1的CC3做触发 */
  26. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                    /* 数据右对齐,高位为0 */
  27. ADC_InitStructure.ADC_NbrOfChannel = 1;                                   /* 1个通道 */
  28. ADC_Init(ADC1, &ADC_InitStructure);
  29. /* ADC1 regular channels configuration */
  30. ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);
  31. /* Enable ADC1 external trigger conversion */
  32. ADC_ExternalTrigConvCmd(ADC1, ENABLE);
  33. /* 使能 ADC1 */
  34. ADC_Cmd(ADC1, ENABLE);
  35. /* Enable ADC1 DMA */
  36. ADC_DMACmd(ADC1, ENABLE);
  37. /* 使能 ADC1 复位校准寄存器 */
  38. ADC_ResetCalibration(ADC1);
  39. /* 检测复位校准寄存器 */
  40. while(ADC_GetResetCalibrationStatus(ADC1));
  41. /* 开始 ADC1 校准 */
  42. ADC_StartCalibration(ADC1);
  43. /* 等待校准结束 */
  44. while(ADC_GetCalibrationStatus(ADC1));
  45. /* 配置采样触发定时器,使用TIM1 CC1 */
  46. ADC_SampleRate(ADC_Sample.SampleFreq);    /* 修改采样频率 */
  47. }
  48. /*
  49. * Function Name  : ADC_SampleRate
  50. * Description    : 修改ADC的采样频率
  51. * Input          : - freq: 采样频率 单位Hz
  52. * Output         : None
  53. * Return         : None
  54. * Attention          : None
  55. */
  56. void ADC_SampleRate(uint32_t freq)
  57. {
  58. /* 配置定时器1第3通道CC3作为ADC1的触发源 */
  59. uint16_t Period;
  60. TIM_OCInitTypeDef  TIM_OCInitStructure;
  61. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  62. TIM_Cmd(TIM1, DISABLE);
  63. /* 采样频率计算公式 : period = 72000000 / freq ; 1200 == 60KHz 采样频率 */
  64. Period = 72000000 / freq;
  65. /* Enable TIM1 clock */
  66. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  67. TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  68. TIM_TimeBaseStructure.TIM_Period = Period;
  69. TIM_TimeBaseStructure.TIM_Prescaler = 0;        /* 计数频率 = 72000 000 / 18 = 4000 000    */
  70. TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  71. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  72. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  73. /* TIM1 channel1 configuration in PWM mode */
  74. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  75. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  76. TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;
  77. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  78. TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  79. /* TIM1 counter enable */
  80. TIM_Cmd(TIM1, ENABLE);
  81. /* TIM1 main Output Enable */
  82. TIM_CtrlPWMOutputs(TIM1, ENABLE);
  83. }

采样率的确定:

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

4、验证

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

STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验的更多相关文章

  1. STM32 DMA USART ADC

    转载自:http://www.cnblogs.com/UQYT/articles/2949794.html 这是一个综合的例子,演示了ADC模块.DMA模块和USART模块的基本使用. 我们在这里设置 ...

  2. 【Linux程序设计】之环境系统函数综合实验

    这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的.贴出来纯粹是聊胜于无. 实验题目:Linux环境下系统函数综合实验 实验目的:熟悉并掌握Linux环境下数学函 ...

  3. CCNP第四天 OSPF综合实验(1)

    ospf综合实验(1) 本实验主要考察ospf中的接口上的多种工作方式 实验如图所示: 所用拓扑为CCNP标准版,如图: --------------------------------------- ...

  4. (6综合实验)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  5. 华为路由交换综合实验 ---IA阶段

    目录 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 根据拓扑合理规划IP地址以及VLANIf地址(PC1属于运营部,PC2属于市场 ...

  6. CCNA 之 综合实验

    CCNA 综合实验 需要:根据下列图中的网路拓扑,搭建环境; PC1属于VLAN10:PC2属于VLAN20:网关均在OR_C2811: VLAN10.20对应的网段分别为192.168.10.0.2 ...

  7. OSPF与ACL综合实验

    OSPF与ACL综合实验 1.实验内容 (1)企业内网运行OSPF路由协议,区域规划如拓扑图所示(见3.实验拓扑图): (2)财务和研发所在的区域不受其他区域链路不稳定性影响: (3)R1.R2.R3 ...

  8. ACL与OSPF综合实验

    OSPF与ACL 综合实验   拓扑图如下: 分析: 配置基本配置: R1: R2: R3: 2.配置OSPF: R1: R2: R3: IT: 设置IT的ip 并划分到ospf2区域 3.配置ACL ...

  9. LVS综合实验

    LVS综合实验 1.环境准备 提前准备:Mysql8.0.30安装包.Mysql安装脚本.shopxo2.3.0安装包.DNS脚本 服务器 IP地址 作用 系统版本 Mysql-master 10.0 ...

随机推荐

  1. hql查询后释放内存

    Session session=getSession(); //进行session查询,取得前16个数据 Query q=session.createQuery(hql).setFirstResult ...

  2. Wamp下安装Memcached

    最近的项目要用到memcache,所以要在本地安装,安装过程中很遇到一些问题,在这里记录下. 我使用的是wamp集成环境,各个版本如下: WampServer Version 2.2 Apache V ...

  3. JVM调优总结 -Xms -Xmx -Xmn -Xss(转)

    堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...

  4. jmeter测试服务器压力

    http://blog.csdn.net/BobChao0730/article/details/51352768 http://blog.csdn.net/u011943953/article/de ...

  5. Python爬虫实例:糗百

    看了下python爬虫用法,正则匹配过滤对应字段,这里进行最强外功:copy大法实践 一开始是直接从参考链接复制粘贴的,发现由于糗百改版导致失败,这里对新版html分析后进行了简单改进,把整理过程记录 ...

  6. 咖啡之约--体验 SourceAnywhere

    http://www.damingsoft.com/campaign/school-campaign-coffee-code.aspx 必备技能:代码版本控制 不论你是菜鸟还是大牛,想要获得高薪水和高 ...

  7. 删除weblogic应用缓存,weblogic 缓存的删除方法

    security (注意:security目录下为安全认证文件,切不可删除!) 正常情况下只需删除tmp目录下缓存文件(不同的工程在tmp下面有不同的路径,如果不清楚的话可以一起删除). 个别情况下会 ...

  8. Excel分组快速自动填充编号

    在Excel自动填充很简单,但如果按分组等条件进行填充就有点麻烦了 说麻烦可能是你并没有搞清楚到底如何才能实现你的需求   下图是客户提供的Excel数据,我需要将下面的数据导入到数据库中,因为客户在 ...

  9. Nginx反向代理WebSocket

    http { upstream websocket { server 192.168.1.1:8010; } server { listen 8020; location / { proxy_pass ...

  10. 设置nginx和php-fpm更改上传文件大小限制

    Nginx和php默认不支持上传过大的文件.假如我们要求上传的文件大小为20M,默认配置就不允许上传了. 下面我们更改nginx和php配置,设定上传的限制为20M. Nginx配置更改 如果上传文件 ...