C 指针

来源:互联网 发布:正规的网络赚钱平台 编辑:程序博客网 时间:2024/05/24 03:53

代码中直接访问寄存器: *(volatile unsigned short *)的含义

*(volatile unsigned short *)0x20000000 的意义

volatile 表示 禁止编译器优化.

unsigned short * 的意思是定义一个2个字节的地址指针, 连起来就是在0x20000000地址位置上输出一个2个字节长的数据。

( unsigned short * )是声明了一个 指针,
指针本身就是数值,

unsigned short *p = ( unsigned short * )0x20000000;
*p = 0; 与 *( unsigned short * )0x2000000 = 0;是一样的。

(volatile unsigned short *)0x20000000=XXX -->0x20000000被定义成一个指针,指向xxx地址。

*(volatile unsigned short *)0x20000000=XXX -->0x20000000指向的地址的值是xxx。




(*(unsigned short *)0x90002)


* 说白了就是取 XX地址那的值,(unsigned short *)是强制性转换数据类型,只要数据在这范围内的话此句可以不要,简单理解就是上句实际就是 *0x0002,unsigned short为16位即去掉此16进制数最高位9
取出0x0002处的值出来。
#define outpw( address,data) (*(unsigned short *)(address)=(data));
unsigned int inpw(unsigned int address) //读写某一段内存
{
unsigned short data;
data=*(unsigned short*)address;
return data;
}
写寄存器函数如下:
void p645_wreg(unsigned int base_addr,unsigned int rwcom,unsigned int data) //向某个轴的某个寄存器写入数据
{
union udata{
unsigned int ldata;
unsigned short idata[2];
}udt;
udt.ldata = data;
outpw (base_addr 2, udt. idata[0]);
// Delay_Us(1); //就算加了延时也无效
outpw (base_addr 3, udt. idata[1]);
// Delay_Us(1); //就算加了延时也无效
outpw (base_addr, rwcom);
}
//读寄存器函数如下:
unsigned long p645_rreg (unsigned int base_addr,unsigned int rrcom) //读寄存器
{
union udata{
unsigned int ldata;
unsigned short idata[2];
}udt;
outpw(base_addr, rrcom);
// Delay_Us(1);
udt.idata[0] = inpw (base_addr 2);
// Delay_Us(1);
udt.idata[1] = inpw (base_addr 3);
return(udt. ldata);
}

原创粉丝点击