stm32ADC得到的数据用串口打印无结果,求大家指点

2019-10-15 04:44发布

本帖最后由 超级歪 于 2017-2-5 23:46 编辑

在学到ADC一节,想用串口把DAC得到的数据打印出来,结果没有反应,串口的配置用的是原子例程中自带的,并未作出修改,请大家帮我找一下原因 谢谢各位~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
超级歪
1楼-- · 2019-10-15 08:52
啊哈,问题解决了,不是代码问题,可能是编译器当时优化的问题,我重启了一下电脑,从新编译以后,代码又可以正常运行了
超级歪
2楼-- · 2019-10-15 14:16
本帖最后由 超级歪 于 2017-2-5 23:40 编辑

代码如下:

main函数部分:


#include "adc.h"
#include "delay.h"
#include "sys.h"

int main(void)
{         int test=0;
        delay_init();                     //延时函数初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级                 
        
        uart_init(115200);         //串口初始化为115200
        adc_init();

          while(1)
        {               
                test=get_adc(ADC_Channel_1);
                printf("the number is ");
               
                        USART_SendData(USART1, test);//向串口1发送数据
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束               
                delay_ms(1000);

        }
}


ADC配置部分:

#include"adc.h"
#include"delay.h"

void adc_init(void)//adc初始化
{
        GPIO_InitTypeDef GPIO_InitStruct;
        ADC_InitTypeDef  ADC_InitStruct;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE);
        
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
        
        ADC_DeInit(ADC1);
        
        ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
        ADC_InitStruct.ADC_ScanConvMode=DISABLE;
        ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
        ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
        ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
        ADC_InitStruct.ADC_NbrOfChannel=1;
        
        ADC_Init(ADC1,&ADC_InitStruct);
        
        
        ADC_ResetCalibration(ADC1);//使能复位校准  
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
        
        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束
        
}
        
u16 get_adc(u8 ch)//获取某一个通道转化结果
{
        ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        
        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
        
        return ADC_GetConversionValue(ADC1);
}


u16 get_adc_average(u8 ch , u8 times)//取平均值
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=get_adc(ch);
                delay_ms(5);
        }
        return temp_val/times;



}

Mylittledonkey
3楼-- · 2019-10-15 20:15
 精彩回答 2  元偷偷看……
超级歪
4楼-- · 2019-10-16 01:07
Mylittledonkey 发表于 2017-2-5 23:39
AD采样数据是16位,串口每次只能发送8位

还有一个很纳闷的问题想请教一下 每当我把adc_init()写出来的时候,即使不发送数据,串口也不能工作 ,而且我这里 PA9 PA10是串口,ADC1中我配置的是PB0

代码如下(只要注释掉adc_init(),串口就能正常工作,很是纳闷)
int main(void)
{        
        // int test=0;
        delay_init();                     //延时函数初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级                 
        
        adc_init();//只要注释掉这行,串口立即正常工作
        uart_init(115200);         //串口初始化为115200

          while(1)
        {               
                //test=get_adc(ADC_Channel_0);
                printf("the number is ");
               
//                        USART_SendData(USART1, test);//向串口1发送数据
//                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束               
                delay_ms(1000);

        }
}
超级歪
5楼-- · 2019-10-16 03:35
好像是出结果的,但是得等半个多小时串口才开始打印。。求大家告知原理
caosix
6楼-- · 2019-10-16 08:41
这种 简单的事件,,用 CubeMX  图形化配置吧。。

用 HAL库 半小时 搞定。。只要你不追求 程序的精细。。

一周热门 更多>