打印
[技术问答]

涨见识了,新塘这是什么函数了

[复制链接]
2225|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-4-30 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define outpw(port,value)   *((volatile unsigned int *)(port))=value
#define inpw(port)          (*((volatile unsigned int *)(port)))
#define outpb(port,value)   *((volatile unsigned char *)(port))=value
#define inpb(port)          (*((volatile unsigned char *)(port)))
#define outps(port,value)   *((volatile unsigned short *)(port))=value
#define inps(port)          (*((volatile unsigned short *)(port)))

#define outp32(port,value)  *((volatile unsigned int *)(port))=value
#define inp32(port)         (*((volatile unsigned int *)(port)))
#define outp8(port,value)   *((volatile unsigned char *)(port))=value
#define inp8(port)          (*((volatile unsigned char *)(port)))
#define outp16(port,value)  *((volatile unsigned short *)(port))=value
#define inp16(port)         (*((volatile unsigned short *)(port)))
搞不懂这是什么东东
沙发
msblast| | 2014-4-30 16:29 | 只看该作者
宏定义

使用特权

评论回复
板凳
niuyaliang|  楼主 | 2014-4-30 16:44 | 只看该作者
msblast 发表于 2014-4-30 16:29
宏定义

我是说这个宏定义是什么意思呢要达到什么目的呢

使用特权

评论回复
地板
witant| | 2014-4-30 16:51 | 只看该作者
是用宏定义实现的对寄存器的赋值操作而已,几乎所有厂商或开发平台提供的代码库都是这个形式的。
比如stm32f103系列的单片机对IO口的定义是这样的:
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
其中GPIOA_BASE 也是宏定义(定义为一个寄存器的地址,相当于新唐代码中的“port”),
GPIO_TypeDef的结构如下(相当于新唐代码中的“*((volatile unsigned int *)”):
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  ...
  __IO uint32_t LCKR;
} GPIO_TypeDef;

原理都是将地址(就是一个数值)强制转换成某一数据类型并进行操作,不是很高端的东西,把指针弄明白了就懂了

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
niuyaliang + 2
5
奔跑的牛| | 2014-4-30 16:52 | 只看该作者
本帖最后由 奔跑的牛 于 2014-4-30 16:53 编辑
niuyaliang 发表于 2014-4-30 16:44
我是说这个宏定义是什么意思呢要达到什么目的呢


port是 寄存器地址
目的:通过指针  直接 往port 寄存器写数据。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
niuyaliang + 2
6
msblast| | 2014-4-30 17:01 | 只看该作者
本帖最后由 msblast 于 2014-4-30 17:14 编辑

//port对应一个端口寄存器地址
//将value输出到port
#define outpw(port,value)   *((volatile unsigned int *)(port))=value
//从port读取输入信号,比如unsigned int val=inpw(port);
#define inpw(port)          (*((volatile unsigned int *)(port)))

//out-输出 p-端口 w-word,字,32位 b-8位 s-16位
//in-输入 p-端口 w-word,字,32位 b-8位 s-16位

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
niuyaliang + 2
7
witant| | 2014-4-30 17:17 | 只看该作者
niuyaliang 发表于 2014-4-30 16:44
我是说这个宏定义是什么意思呢要达到什么目的呢

建议你先看看C语言教程中宏定义相关的知识
宏定义就是在编译器在编译代码时将一个字符串替换为另一个字符串
比如
#define outpw(port,value)   *((volatile unsigned int *)(port))=value
在你代码中写
outpw(P1,0x5F)
的时候,就相当于写了
*((volatile unsigned int *)(P1))=0x5F
这是宏定义的一种用法,有点类似于函数,但还是有本质的区别的
简单的宏定义如
#define PI 3.1416
在代码里写PI的话就相当于写了3.1416。
这都是C语言基础知识,自己搜索一下答案会比提问效率高的多

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
niuyaliang + 2
8
通宵敲代码| | 2014-5-1 15:36 | 只看该作者
用定义的写法,在工程里面很常见。

好好分析一下后面式子的含义你就明白了!

使用特权

评论回复
9
tgi8i| | 2014-5-1 21:53 | 只看该作者
长知识了

使用特权

评论回复
10
heelary| | 2014-5-2 22:52 | 只看该作者

使用特权

评论回复
11
coslight| | 2014-5-4 08:00 | 只看该作者
指针访问,其实就是往地址里面写数啊

使用特权

评论回复
12
373810773| | 2014-5-5 19:50 | 只看该作者
长见识了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝