[STM32F1] STM 32 模拟 SPI

[复制链接]
2560|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;

评论

……写错,点评不能编辑  发表于 2015-12-18 11:06
LEDPort.BIT.LED05 ^= 1; LEDPort.BIT.LED06 ^= 1; LEDPort.BIT.LED08 ^= 1; LEDPort.BIT.LED09 ^= 1; ^= 用错,应该是|= 或者直接 =  发表于 2015-12-18 11:05
mmuuss586 发表于 2015-12-15 12:19 | 显示全部楼层

可以STM32的位操作函数啊;
 楼主| lin13a321 发表于 2015-12-15 13:07 来自手机 | 显示全部楼层
yklstudent 发表于 2015-12-15 12:12 1、首先定义位变量结构体 typedef union {

那我如果要用第九位来做模拟串行输出,我发一个一节0x45,都要移位再与0x0100来相或吧,跟我前面说的意思一样啊
 楼主| lin13a321 发表于 2015-12-15 13:14 来自手机 | 显示全部楼层
lin13a321 发表于 2015-12-15 13:07 那我如果要用第九位来做模拟串行输出,我发一个一节0x45,都要移位再与0x0100来相或吧,跟我前面说的意思 ...

哦,不对是相与
 楼主| lin13a321 发表于 2015-12-15 14:11 来自手机 | 显示全部楼层
yklstudent 发表于 2015-12-15 12:12 1、首先定义位变量结构体 typedef union {

还有个问题,比如我只需要用这一位,并且这16位都设置为输出,我要输出串行数据而不影响其他位。如果按我那种移位相与,就有可能改变其他位的输出,因为每次都是赋的是十六位值
leonliu_1128 发表于 2015-12-15 16:36 | 显示全部楼层
网上下载个例程,研究一下.
玄德 发表于 2015-12-15 17:06 | 显示全部楼层

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


yklstudent 发表于 2015-12-15 17:51 | 显示全部楼层
lin13a321 发表于 2015-12-15 14:11
还有个问题,比如我只需要用这一位,并且这16位都设置为输出,我要输出串行数据而不影响其他位。如果按我 ...

与或针对某一位进行修改好了,又不会影响其它引脚
北极星405 发表于 2015-12-16 09:07 | 显示全部楼层
你不改其他脚怎么会影响其他脚,你右移n位又不是每移一次都刷新一次IO口,而是你移位完成后才赋值!还不明白吗?
 楼主| lin13a321 发表于 2015-12-17 10:45 来自手机 | 显示全部楼层
北极星405 发表于 2015-12-16 09:07 你不改其他脚怎么会影响其他脚,你右移n位又不是每移一次都刷新一次IO口,而是你移位完成后才赋值!还不明 ...

我的意思是,每次都是给BSRR;或者ODR赋的16位值啊,操作第九位的时候,其他15位也一并操作了啊
 楼主| lin13a321 发表于 2015-12-17 10:47 来自手机 | 显示全部楼层
yklstudent 发表于 2015-12-15 17:51 与或针对某一位进行修改好了,又不会影响其它引脚

但是我要用其他位啊,我就是想在改变第九位输出状态的时候,不影响第八位的任何输出状态
yklstudent 发表于 2015-12-17 12:34 | 显示全部楼层
楼主的思维已经进入死胡同
 楼主| 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);
手机打字,请只看语句
handleMessage 发表于 2015-12-17 15:03 来自手机 | 显示全部楼层
看看,楼主可以说下自己是怎么想的吗?
 楼主| lin13a321 发表于 2015-12-17 15:27 来自手机 | 显示全部楼层
handleMessage 发表于 2015-12-17 15:03 看看,楼主可以说下自己是怎么想的吗?

我总觉得这样每次,赋16位值,并不是操作一个引脚,而是操做16个引脚
 楼主| lin13a321 发表于 2015-12-17 15:31 来自手机 | 显示全部楼层
lin13a321 发表于 2015-12-17 13:20 帮我看看这个模拟发送8位,数据位会不会影响时钟,谢谢 for(i=1;i

哦,忘了,GPIO_Pin_5=0x0020
sourceInsight 发表于 2015-12-17 15:31 来自手机 | 显示全部楼层
这种结构体变量的设置会不会有什么问题啊!!!
CallReceiver 发表于 2015-12-17 15:52 来自手机 | 显示全部楼层
看看,挺奇怪的,为什么每移一次都刷新一次IO口呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

85

帖子

1

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