OpenEdv-开源电子网

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

奇怪的现象,仿真正常,运行不正常

[复制链接]

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-8-17 17:41:22 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 学习stm32f4 于 2018-8-17 17:43 编辑

如下面的简单程序:
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"

int main(void)
{
        delay_init(168);
        uart_init(115200);
        led_init();
       while(1)
      {
                PFout(9)=0;
                printf("LED0=%d\r\n",(int)PFin(9));
                delay_ms(1000);
                PFout(9)=1;
                printf("LED0=%d\r\n",(int)PFin(9));
                PFout(10)=0;
                delay_ms(1000);
                PFout(10)=1;
        }
}[/mw_shl_code]
仿真时,串口打印正常,XCOM交替显示LED0=0与LED0=1,如图1所示。

但是单片机运行时,XCOM却一直显示LED0=0,如图2所示。

怎样解释这一现象呢?

1.jpg
2.jpg

Template.rar

439.97 KB, 下载次数: 46

最佳答案

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

额,PFin()这个是直接读取GPIO口的输入寄存器吧,如果没有把引脚设置为输入模式,实际上这个寄存器的内容是不是连接在这个引脚上的,这样做可靠吗? 还有楼主想实现这个功能的话可以直接读PFout()的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-17 17:41:23 | 显示全部楼层
学习stm32f4 发表于 2018-8-17 19:26
这使用了原子哥的位带操作,在sys.h里。
PFout(9)是使GPIOF9口输出0或1,而PFin(9)是读取GPIOF9引脚上的 ...

额,PFin()这个是直接读取GPIO口的输入寄存器吧,如果没有把引脚设置为输入模式,实际上这个寄存器的内容是不是连接在这个引脚上的,这样做可靠吗?

还有楼主想实现这个功能的话可以直接读PFout()的。
十六进制带我飞。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-17 19:16:45 | 显示全部楼层
表示同样不明白楼主遇到的神奇现象,帮顶。

不过我有个疑问,为什么要显示的内容是PFin(9)而不是PFout(9)呢?
十六进制带我飞。
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2018-8-17 19:26:49 | 显示全部楼层
DreamWaterPro 发表于 2018-8-17 19:16
表示同样不明白楼主遇到的神奇现象,帮顶。

不过我有个疑问,为什么要显示的内容是PFin(9)而不是PFout(9 ...

这使用了原子哥的位带操作,在sys.h里。
PFout(9)是使GPIOF9口输出0或1,而PFin(9)是读取GPIOF9引脚上的电平。
位带操作很方便。
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2018-8-17 19:30:04 | 显示全部楼层
另外,在第二个pirntf前加一句重复的代码,结果串口打印正常了,莫名其妙。
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"

int main(void)
{
        delay_init(168);
        uart_init(115200);
        led_init();
       while(1)
      {
                PFout(9)=0;
                printf("LED0=%d\r\n",(int)PFin(9));
                delay_ms(1000);
                PFout(9)=1;
                PFout(9)=1;//重复一下,结果串口打印正常了,真是莫名其妙
                printf("LED0=%d\r\n",(int)PFin(9));
                PFout(10)=0;
                delay_ms(1000);
                PFout(10)=1;
        }
}[/mw_shl_code]
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2018-8-17 20:11:30 | 显示全部楼层
DreamWaterPro 发表于 2018-8-17 19:53
额,PFin()这个是直接读取GPIO口的输入寄存器吧,如果没有把引脚设置为输入模式,实际上这个寄存器的内容 ...

多谢关注,您说的对,在没有设置输入输出模式之前,盲目使用位带操作容易出错。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 20:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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