M4的位带操作

1、位带简介
位操作——单独的对一个比特位读和写。在以前的51单片机中可以通过sbit来实现位定义,但是在F4中没有这样的关键字,而是通过访问位带别名来实现。
在F429中,有两个地方是实现了位带,一个是SRAM区的最低1MB空间,另一个是外设区最低1MB空间。位带别名区把这1MB空间的每一个位膨胀成一个32位的字,当访问位带别名区的这些字,就可以达到访问位带区某个比特位的目的。
M4的位带操作_第1张图片
2、位带区和位带别名区地址转换
位带区的一个比特位经过膨胀之后,虽然变大到4个字节,但还是LSB才有效。
1)外设位带别名区地址:
AisasAddr = 0x42000000 + (A-0x40000000) *8*4 + n*4
注:A为片上外设位带区的某个比特,记它所在字节的地址为A。
0x42000000是外设位带别名区的起始地址。
0x40000000是外设位带区的起始地址。
(A-0x40000000)表示该比特前面有多少个字节,一个字节有8位,所以*8,一个位膨胀后是4个字节,所以*4
n表示该比特在A地址的序号,因为一个位经过膨胀后是四个字节,所以也*4.
2)SRAM位带别名区地址:
AliasAddr = 0x22000000 + (A-0x20000000)*8*4 + n*4

所以综合:这里写图片描述

bit_word_offset为位带存储区中的目标位的位置。
bit_word_addr为别名存储区中映射为目标位的字的地址。
bit_word_base为别名区的开始地址
bit_offset为位带区中包含目标位的字节的编号
bit_number为目标位的位位置。

具体C语言可以用下面的宏来实现
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0X02000000+((addr&0x000FFFFF)<<5)+(bitnum<<2))
addr & 0xF0000000是为了区别SRAM还是外设,实际效果就是取出4或者2
addr & 0x00FFFFFF是为了屏蔽高3位, <<5相对于*8*4,<<2相对于*4
最后可以通过指针的形式操作这些位带别名区地址,如下:

//把一个地址转换成一个指针
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
//把位带别名区地址转换成指针
#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum))

这样就实现了对特定的某一位的读与写。

你可能感兴趣的:(橙子软件)