基于stm32f4的位带宏定义代码参考
以下本人对stm32f4xx的位带学习、理解和总结,只为便于查看和使用,关于程序的说明和解释均在注释中。我已进行测试和验证无误,有问题或错误请留言指出,相互学习。
#ifndef __BITBAND_H__
#define __BITBAND_H__
#include "stm32f4xx.h"
/*位带宏定义*/
//想通过别名区域 操作 位段区域 0x20000001
//addr 位段区域地址
//别名区域 基地址(addr & 0xF0000000)+0x2000000 ---->最高位(第8位)保留,第7位为2,没毛病
//位段区域偏移量 (addr & 0xFFFFF) ----------------->只保留后5位的值
//求位段区域偏移多少位(addr & 0xFFFFF)*8 + bit
//求别名区域偏移地址((addr & 0xFFFFF)*8 + bit)*4
#define BITBAND(addr,bitn) ((addr & 0xF0000000)+0x2000000 + ((addr & 0xFFFFF)*8 + bitn)*4)//对应的别名区的地址
//只需要知道 位段基地址和第几位 即可求得位段区对应的别名区的地址
#define MEM_ADDR(addr) *((volatile unsigned int *)(addr))
#define BIT_ADDR(addr, bitn) MEM_ADDR(BITBAND(addr, bitn))
/* IO口地址映射 */
//输出
#define GPIOA_ODR_Addr ((unsigned int)&GPIOA->ODR) //0x40020014
#define GPIOB_ODR_Addr ((unsigned int)&GPIOB->ODR) //0x40020414
#define GPIOC_ODR_Addr ((unsigned int)&GPIOC->ODR) //0x40020814
#define GPIOD_ODR_Addr ((unsigned int)&GPIOD->ODR) //0x40020C14
#define