打印
[STM32F1]

函数传递参数问题

[复制链接]
1001|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在写stm32与FPGA的通信,用按键来控制数据的大小,并通过按键来确定是否发送。现在遇到一个问题,就是函数的发送函数需要16进制的数,怎样将主函数的参数以16进制的形式传递给子函数。
        *p=a[0]+a[1]*10+a[2]*100;     p是主函数中的。
void Send_data(u8 *w)
{
  //u8 k9,k10,k3,k4,k5,k6,k7,k8;
        //u8 b,c;
        Send_Init();
       
//if((*w&0x01)==0x01)
//                k9=1;
//        if((*w&0x02)==0x02)
//                k10=2;
//        if((*w&0x04)==0x04)
//                k3=4;
//        if((*w&0x08)==0x08)
//                k4=8;
//        if((*w&0x10)==0x10)
//                k5=16;
//        if((*w&0x20)==0x20)
//                k6=32;
//        if((*w&0x40)==0x40)
//                k7=64;
//        if((*w&0x80)==0x80)
//                k8=128;
//        b=k9+k10+k3+k4;
//        c=k5+k6+k7+k8;
//       
        if((*w&0x01)==0x01)
                GPIO_SetBits(GPIOC,GPIO_Pin_0);
          
        if((*w&0x02)==0x02)
                GPIO_SetBits(GPIOC,GPIO_Pin_1);
       
        if((*w&0x04)==0x04)
                GPIO_SetBits(GPIOC,GPIO_Pin_2);
       
        if((*w&0x08)==0x08)
                GPIO_SetBits(GPIOC,GPIO_Pin_3);
       
       
       
        if((*w&0x10)==0x10)
                GPIO_SetBits(GPIOC,GPIO_Pin_4);
       
        if((*w&0x20)==0x20)
                GPIO_SetBits(GPIOC,GPIO_Pin_5);
               
        if((*w&0x40)==0x40)
                GPIO_SetBits(GPIOB,GPIO_Pin_6);
               
        if((*w&0x80)==0x80)
                GPIO_SetBits(GPIOB,GPIO_Pin_7);
}
send_data是在另一个点c文件。w对应的就是p,现在怎样将w转换成16进制?求大神不吝赐教
沙发
yukaigogogo| | 2016-9-5 10:01 | 只看该作者
本帖最后由 yukaigogogo 于 2016-9-5 10:02 编辑

*p=a[0]+a[1]*10+a[2]*100;   //我不明白,P是个指针,*p是这个指针指向的地址中的内容。那到P到底指向了哪里?如果你要使用void Send_data(u8 *w)来发一个数组,那么你把数组名直接给这里的*W就行了。

使用特权

评论回复
板凳
lai832| | 2016-9-5 10:18 | 只看该作者
说明:你的描述是错的,不管P,W都是数据指针,他所指的数(*P、*W)都是一个数,数值的大小与是16进制或是10进制无关,
你应该说:猜*P是16位数(不知是不是,要你自己确认);*W是8位数
*P是16BIT???
void Send_data(u8 *w)-------w是8BIT
{
看了一下,只是发送*w, ---  只发送一个8BIT
}

你要:
方法一:
U8 Buff[2];

Buff[0] = (U8)((*P >> 8) & 0x00FF);
Buff[1] = (U8)((*P) & 0x00FF);

Send_dat(Buff);
Send_dat(&(Buff[1]));

使用特权

评论回复
地板
时光深巷已无她|  楼主 | 2016-9-5 14:49 | 只看该作者
lai832 发表于 2016-9-5 10:18
说明:你的描述是错的,不管P,W都是数据指针,他所指的数(*P、*W)都是一个数,数值的大小与是16进制或是 ...

主函数是mian.c文件。现在按下按键,则执行send_data函数,即进入到send.c文件中,执行send_data函数。现在有8个引脚,分别代表二进制的8位。最大值为255,即此时所有的引脚都为高电平。比如我现在送一个数值8出去,则应该是第三个引脚为高电平。在比较的时候,要将数值8转成16进制的,不然的话现象是错的。所以在send_data()函数的括号里该怎么来填参数呢?send_data(0x01),这样写能使第一个引脚变成高电平,但是send_data(1),这样写就会出错。

使用特权

评论回复
5
lai832| | 2016-9-5 15:00 | 只看该作者
你累不累,(开始真没认真看你的SEND——DAT是干什么的)
好像STM32(F系列)的GPIO有BBR BSBR(是不是这样的缩写忘了)置位寄存器
直接=*w就行了

send_data(0x01);
与send_data(1)的结果不一样,是不可能的,

你可以:
send_data(0x01);
暂停
send_data(1);
暂停
看一下,另外你传入的是地址,不是数据,是不是0x01位置的内容别其它中断等改变了,
你就不能改为:
send_data(U8 w); 吗?

使用特权

评论回复
6
时光深巷已无她|  楼主 | 2016-9-5 15:06 | 只看该作者
时光深巷已无她 发表于 2016-9-5 14:49
主函数是mian.c文件。现在按下按键,则执行send_data函数,即进入到send.c文件中,执行send_data函数。现 ...

还有就是stm32中指针的位数可以定义成16位或者8位吧,,我们老师说32中指针都是32位的

使用特权

评论回复
7
时光深巷已无她|  楼主 | 2016-9-5 15:56 | 只看该作者
lai832 发表于 2016-9-5 15:00
你累不累,(开始真没认真看你的SEND——DAT是干什么的)
好像STM32(F系列)的GPIO有BBR BSBR(是不是这样 ...

传递的问题现在解决了,我把他们都定义成了16位的。但是现在我发现在第二次传送的时候,stm32的引脚会保留第一次引脚的高低电平,,郁闷

使用特权

评论回复
8
七颗咖啡豆| | 2016-9-5 16:19 | 只看该作者
DMA+FMSC可以提高发送速度,参考TFT模块驱动方法

使用特权

评论回复
9
zyj9490| | 2016-9-5 16:56 | 只看该作者
yukaigogogo 发表于 2016-9-5 10:01
*p=a[0]+a[1]*10+a[2]*100;   //我不明白,P是个指针,*p是这个指针指向的地址中的内容。那到P到底指向了 ...

*p是指多少,什么类型,是由P的内容决定,类型是定义的类型决定的,U8* p,或U16 *P,如果P=1234;表示在1234地址单元起,*P表示1234字节的内容,后面定义,表示1234后二字节,表示一个16位数。

使用特权

评论回复
10
zyj9490| | 2016-9-5 16:59 | 只看该作者
时光深巷已无她 发表于 2016-9-5 15:06
还有就是stm32中指针的位数可以定义成16位或者8位吧,,我们老师说32中指针都是32位的 ...

指针表示的32位无符号整数。说白了,是内存地址。表示其变量都是以32位来保存指针内容的。

使用特权

评论回复
11
时光深巷已无她|  楼主 | 2016-9-5 19:39 | 只看该作者
七颗咖啡豆 发表于 2016-9-5 16:19
DMA+FMSC可以提高发送速度,参考TFT模块驱动方法

现在写来不急了,马上就要电赛了

使用特权

评论回复
12
时光深巷已无她|  楼主 | 2016-9-5 19:42 | 只看该作者
zyj9490 发表于 2016-9-5 16:59
指针表示的32位无符号整数。说白了,是内存地址。表示其变量都是以32位来保存指针内容的。 ...

懂了,,你能说说为什么我第二次按下按键的时候,它会保留第一次的引脚电平的原因吗?

使用特权

评论回复
13
zyj9490| | 2016-9-5 19:46 | 只看该作者
时光深巷已无她 发表于 2016-9-5 15:56
传递的问题现在解决了,我把他们都定义成了16位的。但是现在我发现在第二次传送的时候,stm32的引脚会保 ...

看下你的扫描键的函数。及判断键的函数。

使用特权

评论回复
14
时光深巷已无她|  楼主 | 2016-9-5 19:52 | 只看该作者
zyj9490 发表于 2016-9-5 19:46
看下你的扫描键的函数。及判断键的函数。

我又发了一个帖子,麻烦你去看看那个贴子,那上面有程序

使用特权

评论回复
15
时光深巷已无她|  楼主 | 2016-9-5 20:00 | 只看该作者
zyj9490 发表于 2016-9-5 19:46
看下你的扫描键的函数。及判断键的函数。

我知道了,,,谢谢

使用特权

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

本版积分规则

46

主题

247

帖子

4

粉丝