帮我想个办法吧,关于写寄存器的时序问题。

fineshang 2010-01-14 07:35:16
加精
int i = 7;
for (; i >= 0; i--){
while ((GPEDAT & (1 << 13)) == 0){;}; //等待上升沿
if ((GPEDAT & (1 << 12)) != 0){
printk("here is in loop\n");
temp = temp + power;
power = power * 2;
}
while ((GPEDAT & (1 << 13)) != 0){;}; //等待下降沿
}
就是这一段,我想实现在GPE13管脚的上升沿采样,现在是程序老师死循环,怎么修改呢,谢谢!
...全文
716 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
y452181221 2010-10-27
  • 打赏
  • 举报
回复
i 不明白
Kyph 2010-03-18
  • 打赏
  • 举报
回复
old_value=?? //采样

do {
new_value=?? //采样
if(new_value==1&&old_value==1)
break;
old_value=new_value;
} while(1);

//上面的代码行吗?!
ij111223 2010-01-20
  • 打赏
  • 举报
回复
滴水穿石中
fjc04091125 2010-01-20
  • 打赏
  • 举报
回复
顶顶顶啊
nanji001 2010-01-19
  • 打赏
  • 举报
回复
学习了 哈哈 谢谢
ivfangwang_long 2010-01-19
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~~~~~~~
ij111223 2010-01-17
  • 打赏
  • 举报
回复
正想着
cnliming 2010-01-17
  • 打赏
  • 举报
回复
up
lisazc 2010-01-17
  • 打赏
  • 举报
回复
学习
q845980395 2010-01-17
  • 打赏
  • 举报
回复
这是怎么回师
wxb192837 2010-01-16
  • 打赏
  • 举报
回复
有点复杂 帮顶
kondykuang 2010-01-16
  • 打赏
  • 举报
回复
while ((GPEDAT & (1 < < 13)) != 0){;}; //等待下降沿
这里 ,你能保证ARM 运行到这里的时候,外部信号还维持着高电平吗????

我觉得把等待 上升沿 和等待下降沿 两个while 放在一起
之后再处理其他的问题
kondykuang 2010-01-16
  • 打赏
  • 举报
回复
printk() linux的驱动
kondykuang 2010-01-16
  • 打赏
  • 举报
回复
while ((GPEDAT & (1 < < 13)) == 0){;}; //等待上升沿

改为while ((GPEDAT & (1 < < 13)) == 0)
{
点亮一个灯;
}
关闭这个灯; //等待上升沿

你是调ARM wince 驱动??? 你这样写了 看看,是不是由于没有采样而造成了死循环。
还有 GPIO 都有方向的,在这之前 你要把GPECON 配置成输入····
oldCanISoftware 2010-01-16
  • 打赏
  • 举报
回复
up
msdn2009_2010 2010-01-16
  • 打赏
  • 举报
回复
up
bcl258586301 2010-01-16
  • 打赏
  • 举报
回复
学习
Wenxy1 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fineshang 的回复:]
用的是linux,底层驱动处理的,关键就是要在下位机发送的采样信号来到时,采样数据。可是linux一运行起来,下位机来的方波,类似于下面这种:
SCK:_____-_-_-_-_-_________
Data:_____--__------________(B10111)
现在我想在SCK的上升沿采集,必须控制一下时钟的问题。
我的时钟管脚是GPE13,直接和下位机相连。
[/Quote]

按你的硬件文档来做,贴上访问 此寄存器的时序要求吧。

你用循环计算来同步,也要多试验,调整才能同步。

在中断服务程序中,要注意中断处理来不及的可能性。可能会在处理一个中断时,下一个中断又来了,会覆盖之前的数据而导致丢失。
liubo_24020209 2010-01-15
  • 打赏
  • 举报
回复
寄存器设定很难啊
沙沙的吹 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fineshang 的回复:]
我就是找你说的意思做了,不过上面程序仍然出了问题,这次不是死循环的问题,而是数据不对。
下位机8个时钟触发了8次中断,每次中断都更新dataSPI,可是我发送的数据和接收到的数据不一致,下位机发送B00000110,我应该收到 0*1+0*2+0*4+0*8+0*16+1*32+1*64+0*128=96,却收到了24
[/Quote]
这里必须明确一点,就是Linux不是一个实时操作系统。
系统不实时就带来一个问题,它有不确定的中断关断时间。例如在处理其它中断的时候,所有的中断处理其实都是关闭的。当然,关闭中断的地方很多,所以完全不能依靠处理器的中断来响应你的中断请求,因为偶尔有几次没有来得及响应是很正常的现象。
加载更多回复(20)

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧