OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7910|回复: 8

新人 请教一个关于c语言的问题

[复制链接]

34

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2012-9-10
在线时间
5 小时
发表于 2012-9-16 06:55:09 | 显示全部楼层 |阅读模式

有什么方法  将5个函数的功能用一个函数代替了
 #include<stm32f10x_lib.h>
#include"gpio.h"
//GPIO模式设置函数  MODE详情见 gpio.h 当为输入模式时 speed 为0

void GPIOA_CONF(u8 n,u8 mode,u8 speed)
{
 u8 temp=n;
 if(n<8)
 {
  n=n*4;
  BIT_ADDR(GPIOA_CRL_Addr,n) = speed;
  BIT_ADDR(GPIOA_CRL_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOA_CRL_Addr,n+2) = mode;
  BIT_ADDR(GPIOA_CRL_Addr,n+3) = mode>>1; 
  if(mode>0x04)
  {
   Aout(temp)=mode>>2;
  }
 }
 else
 {
  n=(n-8)*4;
  BIT_ADDR(GPIOA_CRH_Addr,n) = speed;
  BIT_ADDR(GPIOA_CRH_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOA_CRH_Addr,n+2) = mode;
  BIT_ADDR(GPIOA_CRH_Addr,n+3) = mode>>1;  
 }
 if(mode>0x04)
  {
   Aout(temp)=mode>>2;
  }
}
void GPIOB_CONF(u8 n,u8 mode,u8 speed)
{
 u8 temp=n;
 if(n<8)
 {
  n=n*4;
  BIT_ADDR(GPIOB_CRL_Addr,n) = speed;
  BIT_ADDR(GPIOB_CRL_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOB_CRL_Addr,n+2) = mode;
  BIT_ADDR(GPIOB_CRL_Addr,n+3) = mode>>1; 
  if(mode>0x04)
  {
   Bout(temp)=mode>>2;
  }
 }
 else
 {
  n=(n-8)*4;
  BIT_ADDR(GPIOB_CRH_Addr,n) = speed;
  BIT_ADDR(GPIOB_CRH_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOB_CRH_Addr,n+2) = mode;
  BIT_ADDR(GPIOB_CRH_Addr,n+3) = mode>>1;  
 }
 if(mode>0x04)
  {
   Bout(temp)=mode>>2;
  }
}
void GPIOC_CONF(u8 n,u8 mode,u8 speed)
{
 u8 temp=n;
 if(n<8)
 {
  n=n*4;
  BIT_ADDR(GPIOC_CRL_Addr,n) = speed;
  BIT_ADDR(GPIOC_CRL_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOC_CRL_Addr,n+2) = mode;
  BIT_ADDR(GPIOC_CRL_Addr,n+3) = mode>>1; 
  if(mode>0x04)
  {
   Cout(temp)=mode>>2;
  }
 }
 else
 {
  n=(n-8)*4;
  BIT_ADDR(GPIOC_CRH_Addr,n) = speed;
  BIT_ADDR(GPIOC_CRH_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOC_CRH_Addr,n+2) = mode;
  BIT_ADDR(GPIOC_CRH_Addr,n+3) = mode>>1;  
 }
 if(mode>0x04)
  {
   Cout(temp)=mode>>2;
  }
}
void GPIOD_CONF(u8 n,u8 mode,u8 speed)
{
 u8 temp=n;
 if(n<8)
 {
  n=n*4;
  BIT_ADDR(GPIOD_CRL_Addr,n) = speed;
  BIT_ADDR(GPIOD_CRL_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOD_CRL_Addr,n+2) = mode;
  BIT_ADDR(GPIOD_CRL_Addr,n+3) = mode>>1; 
  if(mode>0x04)
  {
   Dout(temp)=mode>>2;
  }
 }
 else
 {
  n=(n-8)*4;
  BIT_ADDR(GPIOD_CRH_Addr,n) = speed;
  BIT_ADDR(GPIOD_CRH_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOD_CRH_Addr,n+2) = mode;
  BIT_ADDR(GPIOD_CRH_Addr,n+3) = mode>>1;  
 }
 if(mode>0x04)
  {
   Dout(temp)=mode>>2;
  }
}
void GPIOE_CONF(u8 n,u8 mode,u8 speed)
{
 u8 temp=n;
 if(n<8)
 {
  n=n*4;
  BIT_ADDR(GPIOE_CRL_Addr,n) = speed;
  BIT_ADDR(GPIOE_CRL_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOE_CRL_Addr,n+2) = mode;
  BIT_ADDR(GPIOE_CRL_Addr,n+3) = mode>>1; 
  if(mode>0x04)
  {
   Eout(temp)=mode>>2;
  }
 }
 else
 {
  n=(n-8)*4;
  BIT_ADDR(GPIOE_CRH_Addr,n) = speed;
  BIT_ADDR(GPIOE_CRH_Addr,n+1) = speed>>1;
  BIT_ADDR(GPIOE_CRH_Addr,n+2) = mode;
  BIT_ADDR(GPIOE_CRH_Addr,n+3) = mode>>1;  
 }
 if(mode>0x04)
  {
   Eout(temp)=mode>>2;
  }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-9-16 09:36:02 | 显示全部楼层
可以 ,不过不是你这样操作的,而是对地址进行操作的
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-16 11:21:55 | 显示全部楼层
找到共同点和不同点,分开处理即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2011-8-18
在线时间
0 小时
发表于 2012-9-16 16:16:52 | 显示全部楼层
寄存器宏定义当个参数穿进去不就行了
回复 支持 反对

使用道具 举报

34

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2012-9-10
在线时间
5 小时
 楼主| 发表于 2012-9-18 04:00:50 | 显示全部楼层
回复【4楼】神之箭:
寄存器宏定义当个参数穿进去不就行了
---------------------------------
我试过啊 不好用才发帖子问 不要想当然好吧
回复 支持 反对

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-9-18 10:40:42 | 显示全部楼层
指针
回复 支持 反对

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-9-18 10:55:03 | 显示全部楼层
int add(int x,int y)
{
   int m;
   m=x+y;
   return m;
}

int max(int x,int y)
{
   int m;
   m=x>y?x:y;
   return m;
}

int p(int x,int y,int(*fun)(int,int))
{
   int m;
   m=int(*fun)(int,int);
}
main()
{
  int x=3,y=4,z,k;
  z=p(x,y,int(*add)(int,int));
  k=p(x,y,int(*max)(int,int));

}好像是这样的,详细的你再查查相关资料,记不太清了!
回复 支持 反对

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-9-19 10:38:29 | 显示全部楼层
int p(int x,int y,int(*fun)(int,int)) 

   int m; 
   m=(*fun)(int,int); 

main() 

  int x=3,y=4,z,k; 
  z=p(x,y,add); 
  k=p(x,y,max); 是这样的……
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-9-19 11:25:58 | 显示全部楼层
回复【5楼】canglang:
---------------------------------
可以采用一个参数判断GPIO,这个参数可以使用宏定义。并且采用条件编译,减少代码量。
从心所欲
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 23:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表