GPIO操作问题
void P0 (unsigned char dat){
unsigned char ax;
unsigned char i=0;
for(i=0;i<8;i++)
{
if(dat&(1<<i))
ax = 1;
else
ax = 0;
}
GpioDataRegs.GPBDAT.bit.GPIO39 = ax;
GpioDataRegs.GPADAT.bit.GPIO30 = ax;
GpioDataRegs.GPADAT.bit.GPIO1 = ax;
GpioDataRegs.GPADAT.bit.GPIO3 = ax;
GpioDataRegs.GPBDAT.bit.GPIO49 = ax;
GpioDataRegs.GPBDAT.bit.GPIO51 = ax;
GpioDataRegs.GPCDAT.bit.GPIO71 = ax;
GpioDataRegs.GPCDAT.bit.GPIO73 = ax;
}
如上子函数,我想实现给一个8位的字节数据,然后将各位分配给各个IO口,实现8位并行数据处理。但是,全速运行的时候,用LED检测这8个IO口,结果是错误的,但是我断点单步调试调试时,一步一步走下去,8个IO的结果却对了。这是什么原因?单步调试结果对,全速运行或直接调用一次这个子函数,然后其他的操作结果却是错的。 void InitGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPAMUX2.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPAPUD.all = 0x00000000;// A组0-31使能上拉
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // A组0-31配置输出
GpioCtrlRegs.GPBMUX1.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPBMUX2.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPBPUD.all = 0x00000000;// A组0-31使能上拉
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // A组0-31配置输出
GpioCtrlRegs.GPCMUX1.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPCMUX2.all = 0x00000000;// A组0-15配置为数字
GpioCtrlRegs.GPCPUD.all = 0x00000000;// A组0-31使能上拉
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // A组0-31配置输出
/*
GpioDataRegs.GPASET.all = 0xFFFFFFFF;
GpioDataRegs.GPBSET.all = 0xFFFFFFFF;
GpioDataRegs.GPCSET.all = 0xFFFFFFFF;
*/
EDIS;
}这是我的GPIO初始化。 void P0 (unsigned char dat)
{
/* unsigned char ax;
unsigned char i=0;
for(i=0;i<8;i++)
{
if(dat&(1<<i))
ax = 1;
else
ax = 0;
}
GpioDataRegs.GPBDAT.bit.GPIO39 = ax;
GpioDataRegs.GPADAT.bit.GPIO30 = ax;
GpioDataRegs.GPADAT.bit.GPIO1 = ax;
GpioDataRegs.GPADAT.bit.GPIO3 = ax;
GpioDataRegs.GPBDAT.bit.GPIO49 = ax;
GpioDataRegs.GPBDAT.bit.GPIO51 = ax;
GpioDataRegs.GPCDAT.bit.GPIO71 = ax;
GpioDataRegs.GPCDAT.bit.GPIO73 = ax;
*/
GpioDataRegs.GPBDAT.bit.GPIO39 = dat&0x01;
GpioDataRegs.GPADAT.bit.GPIO30 = dat&0x02;
GpioDataRegs.GPADAT.bit.GPIO1 = dat&0x04;
GpioDataRegs.GPADAT.bit.GPIO3 = dat&0x08;
GpioDataRegs.GPBDAT.bit.GPIO49 = dat&0x10;
GpioDataRegs.GPBDAT.bit.GPIO51 = dat&0x20;
GpioDataRegs.GPCDAT.bit.GPIO71 = dat&0x40;
GpioDataRegs.GPCDAT.bit.GPIO73 = dat&0x80;
}
这是我原始的子函数,发现这样语句并没有任何报错,但是结果却也是不行。 加延时,或者用SET、CLEAR
时序。
玄德 发表于 2016-9-1 11:30
时序。
时序?什么意思 JY-DX-JY 发表于 2016-9-1 10:36
加延时,或者用SET、CLEAR
为什么你们都说要加延时呢?用SET或CLEAR这个我要知道我给的是0或1才能处理,整体耗时又增加了。
用LED检测这8个IO口
怎么检测的?
玄德 发表于 2016-9-1 13:52
用LED检测这8个IO口
怎么检测的?
你焊8个LED啊共阳接法 然后阳极接在D3.3V阴极接在相应的GPIO上 mark 等待解决办法
全速运行的时候,用LED检测这8个IO口,结果是错误的
我想知道,这个检测过程是怎么操作的,送的什么数,灯是什么效果。
这里可能情况太多。
估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了 IO的执行速度是很慢的,如果很快的话,那要总线干什么? 主要的还是在while哪里 本帖最后由 lnulibin 于 2016-9-1 23:06 编辑
把一个无符号的字节型变量,赋值给一个位,一般是将该字节的最低位送至目标。
处理时,要仔细。例如,DAT=0XF0;
下面的程序
GpioDataRegs.GPBDAT.bit.GPIO39 = dat&0x01;
GpioDataRegs.GPADAT.bit.GPIO30 = dat&0x02;
GpioDataRegs.GPADAT.bit.GPIO1 = dat&0x04;
GpioDataRegs.GPADAT.bit.GPIO3 = dat&0x08;
GpioDataRegs.GPBDAT.bit.GPIO49 = dat&0x10;
GpioDataRegs.GPBDAT.bit.GPIO51 = dat&0x20;
GpioDataRegs.GPCDAT.bit.GPIO71 = dat&0x40;
GpioDataRegs.GPCDAT.bit.GPIO73 = dat&0x80;
相当于
GpioDataRegs.GPBDAT.bit.GPIO39 = 0;
GpioDataRegs.GPADAT.bit.GPIO30 = 0;
GpioDataRegs.GPADAT.bit.GPIO1 = 0;
GpioDataRegs.GPADAT.bit.GPIO3 = 0;
GpioDataRegs.GPBDAT.bit.GPIO49 = 0;
GpioDataRegs.GPBDAT.bit.GPIO51 = 0;
GpioDataRegs.GPCDAT.bit.GPIO71 = 0;
GpioDataRegs.GPCDAT.bit.GPIO73 = 0;
28335吗?
你的这种赋值方式,赋值前CPU会回读端口状态,然后位与/位或完成bit操作。
全速运行的时候一个设定指令运行完成,到CPU回读状态时,IO口翻转确没有完成,所以就错了。 玄德 发表于 2016-9-1 15:13
全速运行的时候,用LED检测这8个IO口,结果是错误的
我想知道,这个检测过程是怎么操作的,送的什么数, ...
比如我送0x55那么就是2 4 6 8这四个LED量 其他四个熄灭 Harvard 发表于 2016-9-1 18:28
估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了 ...
应该是这样 charrijon 发表于 2016-9-1 21:38
IO的执行速度是很慢的,如果很快的话,那要总线干什么?
速度很快啊 150M怎么会慢呢 zhangmangui 发表于 2016-9-1 22:41
主要的还是在while哪里
我已经把while改了
页:
[1]
2