您的位置:首页 > 其它

STM32F030系列实现仿位带操作

2017-08-26 17:26 204 查看

1、闲言

最近开发的时候,用到了STM32F030F4P6型号的单片机,它只有20个引脚,价格非常便宜,但是功能齐全;定时器、外部中断、串口、IIC、SPI、DMA和WWDG等等,应用尽有,非常适合用来做小设备。可是有个问题是,它是Cortex-M0内核的,不像M3,M4内核一样,可以支持位带操作(就是一位一位地操作,像80C51单片机一样),这就给程序移植或者开发带来了一点点小麻烦,因此我就利用C语言结构的位段操作,实现了个访位带操作,只是在效率可能会稍逊于真正的位带操作,但是代码上可以兼容,基本上可以应用于任何一款处理器。希望能够帮到大家。本文原文地址:http://www.cnblogs.com/endlesscoding/p/7429743.html,转载请说明出处。

2、位带操作基本知识

关于真正的位带操作,网上有不少的资料,写得也很详细,在这里我只是简单说一下我的理解。另,不理解真正的位带操作,也不影响对本文的理解,因本文跟位带操作没有任何关系,只是仿仿罢了,不能当真。如果不想了解货真价实的位带操作,此节可直接忽略。

如果不使用位带操作,我们操作一个次数据时,就要动32位(STM32是32位的),做一个不恰当的比喻,这就相当于我们坐在一辆有32节车厢的火车上,但是辆火车只有一个门,如果我们要查看这火车中乘客的信息,或者是乘客想下车,必须从那一个门进出,如下图1。

1 #ifndef  __MYTYPE_H
2 #define  __MYTYPE_H
3 #include "stm32f0xx.h"
4
5 #ifndef BIT
6 #define BIT(x)    (1 << (x))
7 #endif
8
9 #ifndef u8
10 #define u8 uint8_t
11 #endif
12
13 #ifndef u16
14 #define u16 uint16_t
15 #endif
16
17 #ifndef u32
18 #define u32 uint32_t
19 #endif
20
21 #ifndef NULL
22 #define NULL 0
23 #endif
24
25 /*------------------------------------------------------------------------------
26                                     用户自定变量
27 功能描述:使用结构体的位段操作,可以实现位操作
28 作者:Endless     2017年8月13日18:32:37
29 修改:无     时间:
30 ------------------------------------------------------------------------------*/
31 typedef struct _16_Bits_Struct
32 {
33     u16 bit0 : 1;
34     u16 bit1 : 1;
35     u16 bit2 : 1;
36     u16 bit3 : 1;
37     u16 bit4 : 1;
38     u16 bit5 : 1;
39     u16 bit6 : 1;
40     u16 bit7 : 1;
41     u16 bit8 : 1;
42     u16 bit9 : 1;
43     u16 bit10 : 1;
44     u16 bit11 : 1;
45     u16 bit12 : 1;
46     u16 bit13 : 1;
47     u16 bit14 : 1;
48     u16 bit15 : 1;
49 } Bits_16_TypeDef;


mytype.h
如果你想进行更多的位操作,只需多定义几次就行了,很容易的。到这里就差不多结束了,希望能够帮到大家,有什么问题可以联系我,或在下面留言。

总结

做技术也很不容易,希望我们大家一起坚持下去!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: