[信息] STM32学习笔记之ADC--DMA方式

[复制链接]
 楼主| mintspring 发表于 2013-11-30 20:34 | 显示全部楼层 |阅读模式
  1. STM32学习笔记之ADC--DMA方式
  2. STM32学习 2010-10-11 16:17:38 阅读24 评论0  字号:大中小
  3. 程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据:

  4. STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。
  5. /************************************************************************
  6.     文 件 名: main.c            
  7. 说    明: 将ADC转换值通过串口发送到PC端         
  8. 主要硬件:      
  9. 编译环境: MDK3.10            
  10. 当前版本: 1.0              
  11. ************************************************************************/
  12. #i nclude <stm32f10x_lib.h>
  13. #i nclude <stdio.h>
  14. #define ADC1_DR_Address    ((u32)0x4001244C)
  15. #ifdef __GNUC__
  16.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  17.      set to 'Yes') calls __io_putchar() */
  18.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  19. #else
  20.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  21. #endif /* __GNUC__ */
  22. vu16 ADC_ConvertedValue;
  23. void RCC_Config(void);
  24. void GPIO_Config(void);
  25. void USART_Config(void);
  26. void DMA_Config(void);
  27. void ADC_Config(void);
  28. void Put_String(u8 *p);
  29. void Delay(vu32 nCount);
  30. int main(void)
  31. {
  32. RCC_Config();
  33. GPIO_Config();
  34. USART_Config();
  35. DMA_Config();
  36. ADC_Config();

  37. while(1)
  38. {

  39.   Delay(0x8FFFF);
  40.    printf("ADC = %X Volt = %d mv\r\n", ADC_ConvertedValue, ADC_ConvertedValue*3300/4096);

  41. }
  42. }
  43. /*************************************************
  44. 函数: void RCC_Config(void)
  45. 功能: 配置系统时钟
  46. 参数: 无
  47. 返回: 无
  48. **************************************************/
  49. void RCC_Config(void)
  50. {
  51. ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
  52. RCC_DeInit();//复位RCC外部设备寄存器到默认值
  53. RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
  54. HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
  55. if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好
  56.     {
  57.    RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
  58.    RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟
  59.    RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)钟=AHB 1/2时钟
  60.       RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟=PCLK2 1/4
  61.      
  62.    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  63.    //配置PLL时钟 == 外部高速晶体时钟*9
  64.    RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟= PCLK2/4
  65.       RCC_PLLCmd(ENABLE);//使能PLL时钟
  66.    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
  67.        {
  68.        }
  69.       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟

  70.       while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
  71.        {
  72.        }
  73.   }
  74.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);//使能DMA时钟
  75.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  76.   //使能ADC1,GPIOC时钟
  77.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  78.   //打开GPIOD和AFIO时钟
  79.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2时钟
  80. }
  81. /*************************************************
  82. 函数: void GPIO_Config(void)
  83. 功能: GPIO配置
  84. 参数: 无
  85. 返回: 无
  86. **************************************************/
  87. void GPIO_Config(void)
  88. {
  89. //设置RTS(PD.04),Tx(PD.05)为推拉输出模式
  90. GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
  91. GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
  92. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//选择PIN4 PIN5
  93. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚频率50M
  94. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚设置推拉输出
  95. GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD
  96. //配置CTS (PD.03),USART2 Rx (PD.06)为浮点输入模式
  97. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  99. GPIO_Init(GPIOD, &GPIO_InitStructure);
  100. //配置PC4为模拟输入
  101. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  102. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  103. GPIO_Init(GPIOC, &GPIO_InitStructure);
  104. }
  105. /*************************************************
  106. 函数: void DMA_Config(void)
  107. 功能: DMA配置
  108. 参数: 无
  109. 返回: 无
  110. **************************************************/
  111. void DMA_Config(void)
  112. {
  113. DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体
  114. DMA_DeInit(DMA_Channel1);//复位DMA通道1
  115. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address
  116. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址
  117. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
  118. DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小1
  119. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
  120. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址不变
  121. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
  122. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
  123. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
  124. DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
  125. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
  126. DMA_Init(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道1
  127. DMA_Cmd(DMA_Channel1, ENABLE); //使能DMA通道1
  128. }
  129. /*************************************************
  130. 函数: void ADC_Config(void)
  131. 功能: ADC配置
  132. 参数: 无
  133. 返回: 无
  134. **************************************************/
  135. void ADC_Config(void)
  136. {
  137.   ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量
  138.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
  139.   ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描
  140.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
  141.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
  142.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  143.   ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1
  144.   ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
  145.   ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
  146.   //ADC1选择信道14,音序器等级1,采样时间239.5个周期
  147.   ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
  148.   ADC_Cmd(ADC1, ENABLE);//使能ADC1
  149.   ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
  150.   while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
  151.   ADC_StartCalibration(ADC1);//开始ADC1校准
  152.   while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
  153.   ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
  154. }
  155. /*************************************************
  156. 函数: void USART_Config(void)
  157. 功能: USART配置
  158. 参数: 无
  159. 返回: 无
  160. **************************************************/
  161. void USART_Config(void)
  162. {
  163. USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
  164. USART_InitStructure.USART_BaudRate = 115200;//波特率9600
  165. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
  166. USART_InitStructure.USART_StopBits = USART_StopBits_1;//1个停止位
  167. USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位
  168. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  169. //禁用RTSCTS硬件流控制
  170. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收
  171. USART_InitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止
  172. USART_InitStructure.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
  173. USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
  174. USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
  175. //最后数据位的时钟脉冲不输出到SCLK引脚
  176. USART_Init(USART2, &USART_InitStructure);//初始化串口2
  177. USART_Cmd(USART2, ENABLE);//串口2使能
  178. }
  179. /*************************************************
  180. 函数: void Put_String(void)
  181. 功能: 向串口输出字符串
  182. 参数: 无
  183. 返回: 无
  184. **************************************************/
  185. void Put_String(u8 *p)
  186. {
  187. while(*p)
  188. {
  189.   USART_SendData(USART2, *p++);
  190.   while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
  191.   {
  192.   
  193.   }
  194. }
  195. }
  196. /*****************************************************
  197. 函数: void Delay(vu32 nCount)
  198. 功能: 延时指定时间
  199. 参数: vu32 nCount 延时指定时间
  200. 返回: 无
  201. ******************************************************/
  202. void Delay(vu32 nCount)
  203. {
  204.   for(; nCount != 0; nCount--);
  205. }
  206. /*****************************************************
  207. 函数:PUTCHAR_PROTOTYPE
  208. 功能: 重定向C库printf函数
  209. 参数: 无
  210. 返回: 无
  211. *****************************************************/
  212. PUTCHAR_PROTOTYPE
  213. {
  214. USART_SendData(USART2, (u8) ch);//发送一字节数据
  215. while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
  216. {
  217. }//等待发送完成
  218. return ch;
  219. }

  220. 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  221. void ADC_Configuration(void)
  222. {
  223.    ADC_InitTypeDef ADC_InitStructure;
  224.   /* ADC1 Configuration ------------------------------------------------------*/
  225.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  226.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  227.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  228.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  229.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  230.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  231.   ADC_Init(ADC1, &ADC_InitStructure);
  232.   /* ADC1 regular channel14 configuration */
  233.   ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);
  234.   /* Enable ADC1 */
  235.   ADC_Cmd(ADC1, ENABLE);
  236.   /* Start ADC1 Software Conversion */
  237.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  238. }
  239. ADCVal = ADC_GetConversionValue(ADC1);   //查询方式


您需要登录后才可以回帖 登录 | 注册

本版积分规则

302

主题

4962

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部

302

主题

4962

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部