[技术问答] 涨见识了,新塘这是什么函数了

[复制链接]
2873|11
 楼主| niuyaliang 发表于 2014-4-30 16:26 | 显示全部楼层 |阅读模式
  1. #define outpw(port,value)   *((volatile unsigned int *)(port))=value
  2. #define inpw(port)          (*((volatile unsigned int *)(port)))
  3. #define outpb(port,value)   *((volatile unsigned char *)(port))=value
  4. #define inpb(port)          (*((volatile unsigned char *)(port)))
  5. #define outps(port,value)   *((volatile unsigned short *)(port))=value
  6. #define inps(port)          (*((volatile unsigned short *)(port)))

  7. #define outp32(port,value)  *((volatile unsigned int *)(port))=value
  8. #define inp32(port)         (*((volatile unsigned int *)(port)))
  9. #define outp8(port,value)   *((volatile unsigned char *)(port))=value
  10. #define inp8(port)          (*((volatile unsigned char *)(port)))
  11. #define outp16(port,value)  *((volatile unsigned short *)(port))=value
  12. #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

查看全部评分

奔跑的牛 发表于 2014-4-30 16:52 | 显示全部楼层
本帖最后由 奔跑的牛 于 2014-4-30 16:53 编辑
niuyaliang 发表于 2014-4-30 16:44
我是说这个宏定义是什么意思呢要达到什么目的呢


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

评分

参与人数 1威望 +2 收起 理由
niuyaliang + 2

查看全部评分

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

查看全部评分

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

查看全部评分

通宵敲代码 发表于 2014-5-1 15:36 | 显示全部楼层
用定义的写法,在工程里面很常见。

好好分析一下后面式子的含义你就明白了!
tgi8i 发表于 2014-5-1 21:53 | 显示全部楼层
长知识了
heelary 发表于 2014-5-2 22:52 | 显示全部楼层
coslight 发表于 2014-5-4 08:00 | 显示全部楼层
指针访问,其实就是往地址里面写数啊
373810773 发表于 2014-5-5 19:50 | 显示全部楼层
长见识了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部