打印
[STM32F0]

位结构体变量操作引脚为什么控制不正常

[复制链接]
964|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yklstudent|  楼主 | 2015-12-11 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yklstudent 于 2015-12-11 17:10 编辑

最近突发奇想,想引用位变量结构体控制引脚,具体想法如下所示:
1、首先定义位变量结构体
typedef union
{
        unsigned int ALL;
        struct
        {
                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 LED16        :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;
4、测试结果确是GPIOC的PIN5和PIN8引脚可以实现翻转功能,PIN6和PIN9引脚却没法实现电平翻转;在线调试也看到GPIOC->ODR的PIN5、PIN6、PIN8和PIN9都在不断的翻转,但引脚输出却没有跟着改变
经过二楼朋友的提醒,问题已经解决了。
沙发
bobo5650| | 2015-12-11 13:51 | 只看该作者
本帖最后由 bobo5650 于 2015-12-11 13:52 编辑

首先得确认引脚的输入输出设置正确了
第二,注意你的LED6对应的是GPIO5

使用特权

评论回复
板凳
yklstudent|  楼主 | 2015-12-11 14:17 | 只看该作者
bobo5650 发表于 2015-12-11 13:51
首先得确认引脚的输入输出设置正确了
第二,注意你的LED6对应的是GPIO5

1、引脚基本配置是通过库文件方式配置的,已经确认过配置肯定没有问题;
2、LED6确认对应PIN5,这个搞错位了;
修改下就OK了,谢谢提醒

使用特权

评论回复
地板
yklstudent|  楼主 | 2015-12-11 14:17 | 只看该作者
bobo5650 发表于 2015-12-11 13:51
首先得确认引脚的输入输出设置正确了
第二,注意你的LED6对应的是GPIO5

1、引脚基本配置是通过库文件方式配置的,已经确认过配置肯定没有问题;
2、LED6确认对应PIN5,这个搞错位了;
修改下就OK了,谢谢提醒

使用特权

评论回复
5
maiweiqi| | 2015-12-11 14:31 | 只看该作者
本帖最后由 maiweiqi 于 2015-12-11 14:35 编辑

我一般都是写BSRR和BRR的

使用特权

评论回复
6
冰零分子| | 2015-12-11 16:05 | 只看该作者
好想法  看着是能实现
把这个先用位绑定替换输出看看6,9正常不

使用特权

评论回复
7
冰零分子| | 2015-12-11 16:07 | 只看该作者
还是先直接操作ODR看看吧
位绑定又拐弯了

使用特权

评论回复
8
Leeone| | 2015-12-11 16:53 | 只看该作者
这个之前有过贴,好像内核手册里有介绍这种操作的

使用特权

评论回复
9
可可球| | 2015-12-11 22:11 | 只看该作者
先操作ODR试试,期待楼主更新

使用特权

评论回复
10
yklstudent|  楼主 | 2015-12-12 09:19 | 只看该作者
可可球 发表于 2015-12-11 22:11
先操作ODR试试,期待楼主更新

你还期待啥,问题已经解决了
就是引脚控制错位了而已,你修改下
typedef union
{
        unsigned int ALL;
        struct
        {
                unsigned int LED00        :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 reserved    :16;
        }BIT;
}LEDbits_t;
这样就可以了

使用特权

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

本版积分规则

39

主题

3256

帖子

22

粉丝