OpenEdv-开源电子网

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

stm8s103f3 adc一个非常奇怪的问题,去掉串口发送,ADC1_GetConversionValue()就不赋值

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-3-25
在线时间
11 小时
发表于 2015-3-30 20:44:54 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]代码见下面,stvd用swim调试,只要注释掉adc_value = ADC1_GetConversionValue();后面的3个串口发送语句,adc_value = ADC1_GetConversionValue();这一句函数返回值就不能赋给adc_value。加上一句串口发送的语句就行,把adc_value定义为全局变量,放在main之外定义,也能正确赋值。以上所有的adc寄存器值是没有问题的。这个例子是文档自己带的。有人知道为什么吗?其他的调用Init_UART1,Init_ADC定义也在后面给出来了[/mw_shl_code] [mw_shl_code=c,true]void main(void) {     u16 adc_value;  FlagStatus flag_status;        Init_UART1();     Init_ADC();  /* Infinite loop */   while (1)   { //Send(0xf0); ADC1_StartConversion();     flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);     while(flag_status == SET); // SET or RESET     adc_value = ADC1_GetConversionValue(); //UART1_sendhex((adc_value>>8));        //UART1_sendhex((adc_value&0xff));       //UART1_sendstr("\r\n");   }    }  uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};    void Init_UART1(void)  {  UART1_DeInit();  UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TX_ENABLE);  // UART1_Cmd(ENABLE);  }  void Send(uint8_t dat)  {    while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));    UART1_SendData8(dat);    }  void Init_ADC(void)  {  GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);  ADC1_DeInit();  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_2, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL2, ENABLE);  ADC1_Cmd(ENABLE);        }  void UART1_sendhex(unsigned char dat)  {  Send('0');  Send('x');  Send(HexTable[dat>>4]);  Send(HexTable[dat&0x0f]);  Send(' ');  }  void UART1_sendstr(unsigned char *dat)  {  while(*dat!='\0')  {  Send(*dat);  dat++;  //delay2us();  }  }   [/mw_shl_code]

最佳答案

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

要是我没有猜错的话,就和我之前碰到的问题一样,就是因为编译器优化掉了,你如果在下面加一句adc_value -= 1; 应该就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-4-7
在线时间
0 小时
发表于 2015-3-30 20:44:55 | 显示全部楼层
要是我没有猜错的话,就和我之前碰到的问题一样,就是因为编译器优化掉了,你如果在下面加一句adc_value -= 1; 应该就可以了
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165051
金钱
165051
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-3-30 23:35:17 | 显示全部楼层
表示很纠结。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-3-25
在线时间
11 小时
 楼主| 发表于 2015-3-31 19:33:13 | 显示全部楼层
不好意思。发帖要审核,根本不知道是效果是怎么样的。重新编辑了下。上面的例子ADC1的DR寄存器值没有问题。是正确的,就是去掉串口发送的语句就不能赋值。
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165051
金钱
165051
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-3-31 22:47:40 | 显示全部楼层
回复【3楼】wuping8229:
---------------------------------
直接写串口代码,测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-3-25
在线时间
11 小时
 楼主| 发表于 2015-4-1 08:25:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
不明白你的意思。我的意思是为什么去掉串口发送就不用ADC1_GetConversionValue();取回ADC1转换的值呢,尽管ADC1寄存器里面的值是正确的,我跟踪到ADC1_GetConversionValue()里面,最后return xx中变量值也是正确的,就是不能赋值给adc_value。加上串口发送就能赋值了,或者adc_value定义为全局变量也行。要是这样的话,运行过程中不需要串口发送是不是很容易出问题。。。
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165051
金钱
165051
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-4-2 00:27:47 | 显示全部楼层
回复【5楼】wuping8229:
---------------------------------
就是让你测试下串口通信是否正常。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-3-25
在线时间
10 小时
发表于 2015-4-2 17:22:25 | 显示全部楼层
我的ADC初始化好像不用初始化IO口也可以
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-3-25
在线时间
11 小时
 楼主| 发表于 2015-4-3 18:13:36 | 显示全部楼层
---------------------------------
回复【6楼】正点原子:
---------------------------------
串口通讯是数据是正常的,swim调试看ADC1_GetConversionValue();的值是正确的。但是不加串口发送语句就不赋值给adc_value
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165051
金钱
165051
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-4-3 22:46:12 | 显示全部楼层
回复【8楼】wuping8229:
---------------------------------
没遇到过这么诡异的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-3-25
在线时间
11 小时
 楼主| 发表于 2015-4-9 22:37:29 | 显示全部楼层
回复【10楼】wxd28759:
----------------------------
谢谢,我去试试。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-7-8
在线时间
0 小时
发表于 2016-2-7 03:58:00 | 显示全部楼层
flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
while(flag_status == SET); // SET or RESET;

你这句的SET代表什么值?0还是1?如果代表1反而逻辑不对。没有ADC还没转换好,你就开始读了。

while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC));  这样就好了,ADC正在转换时返回0则阻塞在此,ADC转换完成后返回1则跳出循环,读取ADC结果。清除EOC标志位。。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-7-1 09:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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