OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3074|回复: 11

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

[复制链接]

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
发表于 2017-2-5 23:09:37 | 显示全部楼层 |阅读模式
9金钱
本帖最后由 超级歪 于 2017-2-5 23:46 编辑

在学到ADC一节,想用串口把DAC得到的数据打印出来,结果没有反应,串口的配置用的是原子例程中自带的,并未作出修改,请大家帮我找一下原因 谢谢各位~

最佳答案

查看完整内容[请看2#楼]

啊哈,问题解决了,不是代码问题,可能是编译器当时优化的问题,我重启了一下电脑,从新编译以后,代码又可以正常运行了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-5 23:09:38 | 显示全部楼层
啊哈,问题解决了,不是代码问题,可能是编译器当时优化的问题,我重启了一下电脑,从新编译以后,代码又可以正常运行了
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-5 23:11:48 | 显示全部楼层
本帖最后由 超级歪 于 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\n");
               
                        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;



}

回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2016-11-25
在线时间
37 小时
发表于 2017-2-5 23:39:26 | 显示全部楼层
AD采样数据是16位,串口每次只能发送8位
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-5 23:42:57 | 显示全部楼层
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\n");
               
//                        USART_SendData(USART1, test);//向串口1发送数据
//                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束               
                delay_ms(1000);

        }
}
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-6 00:14:35 | 显示全部楼层
好像是出结果的,但是得等半个多小时串口才开始打印。。求大家告知原理
回复

使用道具 举报

86

主题

567

帖子

0

精华

高级会员

Rank: 4

积分
819
金钱
819
注册时间
2014-9-30
在线时间
139 小时
发表于 2017-2-6 00:23:40 | 显示全部楼层
这种 简单的事件,,用 CubeMX  图形化配置吧。。

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

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-6 10:22:46 | 显示全部楼层
本帖最后由 超级歪 于 2017-2-6 12:52 编辑
caosix 发表于 2017-2-6 00:23
这种 简单的事件,,用 CubeMX  图形化配置吧。。

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

。。stm32f10x支持HAL库??
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-6 12:52:54 | 显示全部楼层
自己顶。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-2-6 18:38:30 | 显示全部楼层
超级歪 发表于 2017-2-6 00:14
好像是出结果的,但是得等半个多小时串口才开始打印。。求大家告知原理

仿真跟踪一下看看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

86

主题

567

帖子

0

精华

高级会员

Rank: 4

积分
819
金钱
819
注册时间
2014-9-30
在线时间
139 小时
发表于 2017-2-8 10:49:09 | 显示全部楼层
本帖最后由 caosix 于 2017-2-8 10:50 编辑
超级歪 发表于 2017-2-6 10:22
。。stm32f10x支持HAL库??

现在 都2017 年了。。

去年 2016 HAL 库 就 回头

支持 STM32 F103 的 芯片了。


恍惚【2015年初 HAL 库 只支持 F4】
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-1-31
在线时间
12 小时
 楼主| 发表于 2017-2-8 13:21:57 | 显示全部楼层
caosix 发表于 2017-2-8 10:49
现在 都2017 年了。。

去年 2016 HAL 库 就 回头来

待我先把标准库过一遍。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 22:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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