[STM32F1] ADC转换完成标志位的问题

[复制链接]
2534|3
 楼主| xiashengcheng 发表于 2016-1-26 18:02 | 显示全部楼层 |阅读模式
ADC转换启动后就一直停在这个转换完成标志位查了两天了没查出问题所在,请大神指点一二
  1. #include "stm32f10x.h"
  2. #define run0                 GPIO_ResetBits(GPIOA,GPIO_Pin_15);//动行指示   打开
  3. #define spwm0         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//脉冲调节
  4. #define pwmon0         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//脉冲输出打开
  5. #define km0                 GPIO_ResetBits(GPIOB,GPIO_Pin_7);//主接触器吸合

  6. #define run1                 GPIO_SetBits(GPIOA,GPIO_Pin_15);
  7. #define spwm1         GPIO_SetBits(GPIOA,GPIO_Pin_4);
  8. #define pwmon1         GPIO_SetBits(GPIOB,GPIO_Pin_5);
  9. #define km1                 GPIO_SetBits(GPIOB,GPIO_Pin_7);
  10. unsigned char data_GLBIT;//过流标志
  11. unsigned char data_GYBIT;//过压标志
  12. unsigned char data_CWBIT;//超温标志
  13. unsigned char data_TZBIT;//停止标志
  14. unsigned int data_tim_km;//主接触器上处时上电时间定时
  15. unsigned int data_Tickcnt1;                        //TICK10次计数
  16. unsigned int        data_Tickcnt10;                //TICK10次计数加一
  17. unsigned int         data_DLset;                //电流设定值
  18. unsigned int         data_DYset;        //电压设定值
  19. unsigned int         data_DLadc;//电流采样值
  20. unsigned int         data_DYadc;//电压采样值


  21. void GPIO_Configuration(void)        //IO初始化
  22. {
  23.         GPIO_InitTypeDef GPIO_InitPAIN;
  24.         GPIO_InitTypeDef GPIO_InitPBIN;
  25.         GPIO_InitTypeDef GPIO_InitPAOUT;
  26.         GPIO_InitTypeDef GPIO_InitPBOUT;
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOA|GPIOB时钟
  28. //RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  29.                 GPIO_InitPAIN.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;                                                                                                                                                                                                                                                //选(pin1 pll-3)/(Pin2 pll-1)/(Pin3 GL)/锁相环频率锁相过流输入
  30.                 GPIO_InitPAIN.GPIO_Mode=GPIO_Mode_IPU;                                                                                        //上拉输入模式
  31.                 GPIO_InitPAIN.GPIO_Speed=GPIO_Speed_50MHz;                                                                        //输出频率50MHz
  32.                 GPIO_Init(GPIOA,&GPIO_InitPAIN);                                                                                                //PA接口初始化
  33.                 GPIO_InitPBIN.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6;                                                                                                                                                                                                                                                //选中(Pin3 QD)/(PB4 TZ)/(Pin6 CW)启动停止超温输入
  34.                 GPIO_InitPBIN.GPIO_Mode=GPIO_Mode_IPU;                                                                //上拉输入模式
  35.                 GPIO_InitPBIN.GPIO_Speed=GPIO_Speed_50MHz;                                                //输入模式可以不写
  36.                 GPIO_Init(GPIOB,&GPIO_InitPBIN);                                                                        //PB接品初始化
  37.                 GPIO_InitPAOUT.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_15;                                                                                                                                                                                                                                                                                        //(pin-4pwm-set)/(PIN-15run)脉冲调频,动行指示输出
  38.                 GPIO_InitPAOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                        //开漏输 出模式
  39.                 GPIO_InitPAOUT.GPIO_Speed=GPIO_Speed_50MHz;
  40.                 GPIO_Init(GPIOA,&GPIO_InitPAOUT);       
  41.                 GPIO_InitPBOUT.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;                                                                                                                                                                                                                                                                                        //(PIN_5pwm-on0/(PIN_7out-km)脉冲输出打开 主接触器吸合
  42.                 GPIO_InitPBOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                //开漏输出模式
  43.                 GPIO_InitPBOUT.GPIO_Speed=GPIO_Speed_50MHz;
  44.                 GPIO_Init(GPIOB,&GPIO_InitPBOUT);
  45.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  46.                 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  47. }
  48. //------------------------------------------------
  49. void input(void)
  50. {
  51.         //判断启动
  52. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==0)
  53.                 {//判断接触器吸合后才能工作PB7=KM
  54.                         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0)
  55.                         {
  56.                         spwm0;
  57.                         pwmon0;
  58.                         }
  59.                 }
  60. //判断停止
  61. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
  62.                 {
  63.                         if(data_GLBIT==1)
  64.                         {
  65.                         data_GLBIT=0;
  66.                         km0;
  67.                         }
  68.                         else
  69.                         {
  70.                         spwm1;
  71.                         pwmon1;
  72.                         }
  73.                        

  74.                 }
  75. //判断超温输入信号
  76. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
  77.                 {
  78.                         spwm1;
  79.                         pwmon1;
  80.                         km1;
  81.                         data_CWBIT=1;
  82.                 }

  83. }
  84. //+++++++++++++++++++Tick定时器+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  85. void Delay (u16 m)
  86. {
  87. SysTick->LOAD=m*9000;
  88. SysTick->CTRL|=0X03;       
  89. }
  90. //+++++++++++++++++比较ADC转换结果电压和电流值是否超限++++++++++++++++++++++++++++++++++++++++++++
  91. void CMPadc(void)
  92. {
  93. if(data_DLadc>data_DLset)
  94. {

  95. }
  96. if(data_DYadc>data_DYset)
  97. {

  98. }


  99. }
  100. void NVIC_Configuration(void)
  101. {
  102.   NVIC_InitTypeDef NVIC_InitStructure;
  103.   //* Set the Vector Table base location at 0x08004000
  104.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置 中断优先级
  105.   //* Enable the EXTI1 Interrupt
  106.   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //设置 中断通道
  107.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定抢占式优先级别
  108.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //次优先级别为0
  109.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //中断通道使能
  110.   NVIC_Init(&NVIC_InitStructure);                  //初始化中断
  111. }
  112. void EXIT3_Configuration(void)
  113. {
  114.   EXTI_InitTypeDef EXTI_InitStructure;
  115. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); //将EXTI线1连接到端口GPIOA的第在3脚
  116. EXTI_InitStructure.EXTI_Line = EXTI_Line3; //如果配置的是1号针脚那么必须是EXTI——LINE3
  117. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  118. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  119. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  120. EXTI_Init(&EXTI_InitStructure);    //初始化中断
  121. }       
  122. void km_config(void)
  123. {//判断是否过流过流后不再吸合接触器
  124. if(data_GLBIT==0)
  125. {
  126.         if(data_Tickcnt10>data_tim_km)
  127.         {
  128.                 km0;
  129.                         }
  130.                                 }
  131. }

  132. /* USART初始化 */
  133. //void USART1_Init(void)
  134. //{
  135. //        GPIO_InitTypeDef GPIO_InitStructure;
  136. //        USART_InitTypeDef USART_InitStructure;
  137. //       
  138. //        RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA的时钟
  139. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART的时钟
  140. //        /* USART1的端口配置 *///
  141. //        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA9成第二功能引脚        TX
  142. //        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA10成第二功能引脚  RX       

  143. //        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  144. //        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  145. //        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  146. //        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  147. //        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  148. //        GPIO_Init(GPIOA, &GPIO_InitStructure);
  149. //       

  150. //        /* USART1的基本配置 */
  151. //        USART_InitStructure.USART_BaudRate = 115200;              //波特率
  152. //        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  153. //        USART_InitStructure.USART_StopBits = USART_StopBits_1;
  154. //        USART_InitStructure.USART_Parity = USART_Parity_No;
  155. //        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  156. //        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  157. //        USART_Init(USART1, &USART_InitStructure);               
  158. //        USART_Cmd(USART1, ENABLE);                             //使能USART1
  159. //       
  160. //                               
  161. //}
  162. //void USART_ENABLE_REV(void)
  163. //{        NVIC_InitTypeDef NVIC_InitStruct;
  164. //        NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
  165. //        NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
  166. //        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  167. //        NVIC_Init(&NVIC_InitStruct);
  168. //        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);         
  169. //}
  170. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  171. //+++++++++++++++++主程序+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  172. /*******************************************************************************
  173. * 函数名  : ADC1_Init_Config
  174. * 描述    : ADC1初始化配置
  175. * 输入    : 无
  176. * 输出    : 无
  177. * 返回    : 无
  178. * 说明    : 只是初始化了ADC1但未启动ADC1转换
  179. *******************************************************************************/                                                                                                                                  
  180. void ADC1_Init_Config(void)
  181. {        
  182.         ADC_InitTypeDef ADC_InitStructure;
  183.         GPIO_InitTypeDef GPIO_InitStructure;
  184.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE ); //使能ADC1和GPIOA外设时钟
  185.         RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟分频因子为6(72M/6=12M),ADC最大工作频率为14M
  186.         /*设置PA0模拟通道输入引脚*/
  187.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;                        //选择要初始化的GPIOA的PA5|PA6引脚
  188.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //工作模式为模拟输入
  189.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHz
  190.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                //调用库函数中的GPIO初始化函数,初始化GPIOB中的PB5,PB6,PB7,PB8引脚

  191.         /*初始化配置ADC1*/
  192.         ADC_DeInit(ADC1); //复位ADC1,即将ADC1的所有寄存器设置为缺省值
  193.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
  194.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                                        //ADC1工作在独立模式
  195.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;                                                //扫描模式设置,多通道下使用使能,单通道下使用失能
  196.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                        //模数转换工作在单次转换模式
  197.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //由软件来触发转换启动,也可以设置成外设启动
  198.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                //ADC数据右对齐
  199.         ADC_InitStructure.ADC_NbrOfChannel = 1;                                                                //顺序进行规则转换的ADC通道的数目
  200.         ADC_Init(ADC1, &ADC_InitStructure);                                                                        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  
  201. // ADC_DMACmd(ADC1,DISABLE);//关闭DMA请求
  202.         ADC_Cmd(ADC1, ENABLE);                                                //使能ADC1,但还没启动ADC1
  203.        
  204.         ADC_ResetCalibration(ADC1);                                        //使能ADC1复位校准寄存器         
  205.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位完成       
  206.         ADC_StartCalibration(ADC1);                                        //开启AD校准
  207.         while(ADC_GetCalibrationStatus(ADC1));                //等待校准完成
  208.         //ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
  209. }
  210. u16 ADC1_Get_AdcValue(u8 ch)   
  211. {
  212.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //设置ADC1的转换通道ch,一个序列,采样时间为1.5周期                                       
  213.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                                                //软件启动ADC1开始转换       
  214.          
  215.         while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )==RESET);                                                //等待AD转换结束
  216.         return ADC_GetConversionValue(ADC1);                                                                //返回最近一次ADC1规则组转换的AD值
  217. }

  218. int main(void)
  219. {
  220.         GPIO_Configuration();//GPIO初始化
  221.         run1;//GPIOA p15
  222.         spwm1;//GPIOA p4
  223.         pwmon1;//GPIOB p5
  224.         km1;//GPIOB p7
  225.         Delay(100);
  226.         NVIC_Configuration();
  227.         EXIT3_Configuration();
  228. //初始化数据
  229.         data_tim_km=0;                       
  230.         data_Tickcnt1=0;
  231.         data_Tickcnt10=0;
  232.         data_GLBIT=data_GYBIT=data_CWBIT=data_TZBIT=0;
  233.         data_DYset=data_DLset=200;
  234.         data_tim_km=data_Tickcnt10+5;
  235.        
  236. while(1)
  237. {
  238.        
  239.         data_DLadc = ADC1_Get_AdcValue(5); //读取并返回ADC对应通道的AD转换值
  240.         data_DYadc = ADC1_Get_AdcValue(6);
  241.         input();//启停超温过流检测
  242.         CMPadc();
  243.         km_config();


  244. }
  245. }
 楼主| xiashengcheng 发表于 2016-1-26 18:09 | 显示全部楼层
停在230行
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )==RESET);
quray1985 发表于 2016-1-26 20:23 | 显示全部楼层
你这个问题确实没遇到过,和我现在用的程序是一样的
中白菜 发表于 2019-8-1 10:24 | 显示全部楼层
楼主解决了吗  我也遇到了同样的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

107

帖子

1

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