原理
位带操作就是将位带区中的每一位膨胀成位带别名区中的一个 32 位的字,通过访问位带别名区中的字就实现了访问位带区中位的目的。因此我们就可以使用指针来访问位带别名区的地址,从而实现访问位带区内位的目的。
步骤
- 对GPIO的IDR和ODR寄存器位操作进行封装(STM32F1系列通用)
- 编写LED驱动程序
- 编写头文件:宏定义连接LED的端口、端口引脚、端口时钟、引脚位带,函数声明
- 编写驱动文件:
- LED初始化函数:开启端口时钟,定义GPIO_InitTypeDef结构体变量并初始化,拉高引脚电平
- 主函数点亮LED
代码
//system.c
#include "system.h" //头文件中把GPIO的IDR和ODR寄存器位操作进行了封装
//system.h
#ifndef _system_H
#define _system_H
#include "stm32f10x.h"
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GP