玩stm32f3 discovery 板子时,想使用位带的操作方法,借鉴原子哥的程序和网上关于 《stm32F407位带操作,实现51类似的GPIO控制功能的代码 》的程序,
可是无论如何都实现不了位带的操作,各位高手大虾们帮忙啊,有没有人实现过stm32f3的位带操作程序,求分享。
使用的程序如下。
#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))
//F4XXIO 口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+20)
#define GPIOB_ODR_Addr (GPIOB_BASE+20)
#define GPIOC_ODR_Addr (GPIOC_BASE+20)
#define GPIOD_ODR_Addr (GPIOD_BASE+20)
#define GPIOE_ODR_Addr (GPIOE_BASE+20)
#define GPIOF_ODR_Addr (GPIOF_BASE+20)
#define GPIOG_ODR_Addr (GPIOG_BASE+20)
#define GPIOH_ODR_Addr (GPIOH_BASE+20)
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //
#define GPIOA_IDR_Addr (GPIOA_BASE+16)
#define GPIOB_IDR_Addr (GPIOB_BASE+16)
#define GPIOC_IDR_Addr (GPIOC_BASE+16)
#define GPIOD_IDR_Addr (GPIOD_BASE+16)
#define GPIOE_IDR_Addr (GPIOE_BASE+16)
#define GPIOF_IDR_Addr (GPIOF_BASE+16)
#define GPIOG_IDR_Addr (GPIOG_BASE+16)
#define GPIOH_IDR_Addr (GPIOF_BASE+16)
#define GPIOI_IDR_Addr (GPIOG_BASE+16)
#define GPIOAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //GPIOA 某一位输出
#define GPIOAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //GPIOA 某一位输入
#define GPIOBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //GPIOB 某一位输出
#define GPIOBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //GPIOB 某一位输入
#define GPIOCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //GPIOC 某一位输出
#define GPIOCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //GPIOC 某一位输入
#define GPIODout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //GPIOD 某一位输出
#define GPIODin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //GPIOD 某一位输入
#define GPIOEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //GPIOE 某一位输出
#define G PIOEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //GPIOE 某一位输入
#define GPIOFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //GPIOF 某一位输出
#define GPIOFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //GPIOF 某一位输入
#define GPIOGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //GPIOG 某一位输出
#define GPIOGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //GPIOG 某一位输入
#define GPIOHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //GPIOH 某一位输出
#define GPIOHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //GPIOH 某一位输入
/*************************************************************************/
#define LED1 GPIODout(12) // 定义 LED1 为 GPIOD_Pin_12
#define KEY1 GPIOCin(0) // 定义 KEY1 为 GPIOC_Pin_0
void GPIO_Configuration(void); // 函数声明
void Delay1(ulong x); / 函数声明
/******************************************************************************
*
* 函数名 : main
* 功能 : 主函数
* 输入 : None
* 输出 : None
* 返回 : None
***************************************************************************/
int main(void)
{
GPIO_Configuration();
while(1)
{
LED1=1; //LED 灯亮
Delay1(0XFFF);
LED1=0; //LED 灯灭
Delay1(0XFFF);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
谢谢 时钟的问题以前一直没考虑 不过我使用库函数就可以操作IO口,换成位带操作就不行了, 我再看看
一周热门 更多>