野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12800|回复: 6

ADC单通道中断采样,为什么我的串口显示就一个S,跟原程序对比也没发现哪里错了

[复制链接]
发表于 2019-3-5 22:54:22 | 显示全部楼层 |阅读模式
#include "bsp_adc.h"
__IO uint16_t ADC_ConvertedValue;
void ADC_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;

        // 打开串口GPIO的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
               
       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//引脚为第一个引脚PC1
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
  GPIO_Init(GPIOC, &GPIO_InitStruct);       
}

void ADC_Mode_Config(void)
{
                ADC_InitTypeDef ADC_InitStruct;
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx,ENABLE);
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式
          ADC_InitStruct.ADC_ScanConvMode = DISABLE;//单通道模式
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//多次转换
          ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发
          ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
          ADC_InitStruct.ADC_NbrOfChannel =1;//一个通道
          ADC_Init(ADC_x,&ADC_InitStruct);//写入ADC配置
        //打开ADC外设时钟
         
        //ADC时钟8分频APB2总线(9MHz)
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
        //配置规则通道转换顺序
        ADC_RegularChannelConfig(ADC_x,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);
        //配置ADC中断
        ADC_ITConfig(ADC_x,ADC_IT_EOC,ENABLE);
        //使能ADC
        ADC_Cmd(ADC_x,ENABLE);
        ADC_ResetCalibration(ADC_x);//重置ADC校准
        while(ADC_GetResetCalibrationStatus(ADC_x));//ADC复位后跳出循环
        //启用ADC软件触发模式
        // ADC开始校准
        ADC_StartCalibration(ADC_x);
        // 等待校准完成
        while(ADC_GetResetCalibrationStatus(ADC_x))
        {}
                ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
               
}

void ADC_NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);
}


void ADCx_Init(void)
{

        ADC_GPIO_Config();
        ADC_Mode_Config();
        ADC_NVIC_Config();
}
/***********************************************************************/
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_adc.h"

extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值          
float ADC_ConvertedValueLocal;        

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
        void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
int main(void)
{       
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  USART_Config();
        ADCx_Init();

        /* 发送一个字符串 */
        printf("STM32ADC电压采集实验\r\n");/*电脑串口显示只打印出第一个S字母出来,后面程序不执行*/
       
  while(1)
        {                ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
       
                printf("\r\n The current AD value = 0x%04X \r\n",
                       ADC_ConvertedValue);
                printf("\r\n The current AD value = %f V \r\n",
                       ADC_ConvertedValueLocal);
                printf("\r\n\r\n");

                Delay(0xffffee);
        }       
}

/**************************************************************************************/
void ADC_IRQHandler(void)
{       
        if (ADC_GetITStatus(ADC_x,ADC_IT_EOC)==SET)
        {
                // 读取ADC的转换值
                ADC_ConvertedValue = ADC_GetConversionValue(ADC_x);
        }
        ADC_ClearITPendingBit(ADC_x,ADC_IT_EOC);
}


ADC电压采集.zip

5.9 MB, 下载次数: 17

附上程序

回复

使用道具 举报

 楼主| 发表于 2019-3-5 22:56:11 | 显示全部楼层
跪谢,之前的我自己都写出来了,ADC这第一节我找了半天也没找到哪里出错,求大神们帮忙看看
回复 支持 反对

使用道具 举报

发表于 2019-3-6 18:48:02 | 显示全部楼层
感觉这样串口得卡住,中断得加个延时吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 22:36:47 | 显示全部楼层
谢谢啦,我加个延时试一下,确实是串口卡住了,明天我调试下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-12 21:47:28 | 显示全部楼层
已找到问题原因了,我写的中断服务函数名称与启动文件函数名称不一致造成进入死循环
回复 支持 反对

使用道具 举报

发表于 2024-5-6 22:51:09 | 显示全部楼层
同样的程序,如果在将采样时间配置得太短(比如配置成ADC_SampleTime_1Cycles5),会造成程序一直在ADC中断中,执行不到后面的printf函数。
回复 支持 反对

使用道具 举报

发表于 2024-5-7 08:28:01 | 显示全部楼层
~love~ 发表于 2019-3-12 21:47
已找到问题原因了,我写的中断服务函数名称与启动文件函数名称不一致造成进入死循环 ...

具体是怎么写了呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 11:20 , Processed in 0.030452 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表