打印
[STM32F1]

STM 32 模拟 SPI

[复制链接]
2173|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lin13a321|  楼主 | 2015-12-15 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,求高人指点!!!我现在是 用BIT9来设置高低电平,这样的话每次都要给BSRR 写0x0100来置位!!假如我要发送0x01,那就得先或一个16位的0,再左移7位来跟写入BSRR的0x0100来按位与!!!请问这样是正确的吗!!!正确的话对于发送一个字节,操作就麻烦点!!!求高人指点方法!!!还有STM32F103,单独操作一位,必须给BSRR写一个16位的数吗??能不能单独操作,比如直接就PA9=1,这样设置!!!!
沙发
lin13a321|  楼主 | 2015-12-15 11:30 | 只看该作者
快来人啊  急死了

使用特权

评论回复
板凳
yklstudent| | 2015-12-15 12:12 | 只看该作者
1、首先定义位变量结构体
typedef union
{
        unsigned int ALL;
        struct
        {
                unsigned int LED01        :1;
                unsigned int LED01        :1;
                unsigned int LED02        :1;
                unsigned int LED03        :1;
                unsigned int LED04        :1;
                unsigned int LED05        :1;
                unsigned int LED06        :1;
                unsigned int LED07        :1;
                unsigned int LED08        :1;
                unsigned int LED09        :1;
                unsigned int LED10        :1;
                unsigned int LED11        :1;
                unsigned int LED12        :1;
                unsigned int LED13        :1;
                unsigned int LED14        :1;
                unsigned int LED15        :1;
                unsigned int reserver :16;
        }BIT;
}LEDbits_t;
2、定义位结构体变量,并且定义变量到STM32F070的GPIOC->ODR寄存器处:
LEDbits_t LEDPort __attribute__ ((at(0x48000814)));
3、然后通过如下方式控制引脚电平实现翻转功能:
        LEDPort.BIT.LED05 ^= 1;
        LEDPort.BIT.LED06 ^= 1;
        LEDPort.BIT.LED08 ^= 1;
        LEDPort.BIT.LED09 ^= 1;

使用特权

评论回复
评论
jar1866 2015-12-18 11:06 回复TA
……写错,点评不能编辑 
jar1866 2015-12-18 11:05 回复TA
LEDPort.BIT.LED05 ^= 1; LEDPort.BIT.LED06 ^= 1; LEDPort.BIT.LED08 ^= 1; LEDPort.BIT.LED09 ^= 1; ^= 用错,应该是|= 或者直接 = 
地板
mmuuss586| | 2015-12-15 12:19 | 只看该作者

可以STM32的位操作函数啊;

使用特权

评论回复
5
lin13a321|  楼主 | 2015-12-15 13:07 | 只看该作者
yklstudent 发表于 2015-12-15 12:12 1、首先定义位变量结构体 typedef union {

那我如果要用第九位来做模拟串行输出,我发一个一节0x45,都要移位再与0x0100来相或吧,跟我前面说的意思一样啊

使用特权

评论回复
6
lin13a321|  楼主 | 2015-12-15 13:14 | 只看该作者
lin13a321 发表于 2015-12-15 13:07 那我如果要用第九位来做模拟串行输出,我发一个一节0x45,都要移位再与0x0100来相或吧,跟我前面说的意思 ...

哦,不对是相与

使用特权

评论回复
7
lin13a321|  楼主 | 2015-12-15 14:11 | 只看该作者
yklstudent 发表于 2015-12-15 12:12 1、首先定义位变量结构体 typedef union {

还有个问题,比如我只需要用这一位,并且这16位都设置为输出,我要输出串行数据而不影响其他位。如果按我那种移位相与,就有可能改变其他位的输出,因为每次都是赋的是十六位值

使用特权

评论回复
8
leonliu_1128| | 2015-12-15 16:36 | 只看该作者
网上下载个例程,研究一下.

使用特权

评论回复
9
玄德| | 2015-12-15 17:06 | 只看该作者

位带没用过,一般用宏定义。


使用特权

评论回复
10
yklstudent| | 2015-12-15 17:51 | 只看该作者
lin13a321 发表于 2015-12-15 14:11
还有个问题,比如我只需要用这一位,并且这16位都设置为输出,我要输出串行数据而不影响其他位。如果按我 ...

与或针对某一位进行修改好了,又不会影响其它引脚

使用特权

评论回复
11
北极星405| | 2015-12-16 09:07 | 只看该作者
你不改其他脚怎么会影响其他脚,你右移n位又不是每移一次都刷新一次IO口,而是你移位完成后才赋值!还不明白吗?

使用特权

评论回复
12
lin13a321|  楼主 | 2015-12-17 10:45 | 只看该作者
北极星405 发表于 2015-12-16 09:07 你不改其他脚怎么会影响其他脚,你右移n位又不是每移一次都刷新一次IO口,而是你移位完成后才赋值!还不明 ...

我的意思是,每次都是给BSRR;或者ODR赋的16位值啊,操作第九位的时候,其他15位也一并操作了啊

使用特权

评论回复
13
lin13a321|  楼主 | 2015-12-17 10:47 | 只看该作者
yklstudent 发表于 2015-12-15 17:51 与或针对某一位进行修改好了,又不会影响其它引脚

但是我要用其他位啊,我就是想在改变第九位输出状态的时候,不影响第八位的任何输出状态

使用特权

评论回复
14
yklstudent| | 2015-12-17 12:34 | 只看该作者
楼主的思维已经进入死胡同

使用特权

评论回复
15
lin13a321|  楼主 | 2015-12-17 13:20 | 只看该作者
yklstudent 发表于 2015-12-17 12:34 楼主的思维已经进入死胡同

帮我看看这个模拟发送8位,数据位会不会影响时钟,谢谢
for(i=1;i<=8i++)
GPIO_SetBit(GPIOB,GPIO_Pin_5);
GPIO_SetBit(GPIOB,(0x0100&(DATA<<I);
GPIO_Reset(GPIOB,GPIO_Pin_5);
手机打字,请只看语句

使用特权

评论回复
16
handleMessage| | 2015-12-17 15:03 | 只看该作者
看看,楼主可以说下自己是怎么想的吗?

使用特权

评论回复
17
lin13a321|  楼主 | 2015-12-17 15:27 | 只看该作者
handleMessage 发表于 2015-12-17 15:03 看看,楼主可以说下自己是怎么想的吗?

我总觉得这样每次,赋16位值,并不是操作一个引脚,而是操做16个引脚

使用特权

评论回复
18
lin13a321|  楼主 | 2015-12-17 15:31 | 只看该作者
lin13a321 发表于 2015-12-17 13:20 帮我看看这个模拟发送8位,数据位会不会影响时钟,谢谢 for(i=1;i

哦,忘了,GPIO_Pin_5=0x0020

使用特权

评论回复
19
sourceInsight| | 2015-12-17 15:31 | 只看该作者
这种结构体变量的设置会不会有什么问题啊!!!

使用特权

评论回复
20
CallReceiver| | 2015-12-17 15:52 | 只看该作者
看看,挺奇怪的,为什么每移一次都刷新一次IO口呢

使用特权

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

本版积分规则

18

主题

85

帖子

1

粉丝