如果GD32F1x0把GPIO的地址移出了位带区之外,已不再支持GPIO位带操作,下面的代码已没可能实现了
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile uint32_t*)(addr))
#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define BIT_REG(reg,bit) BITBAND((uint32_t)(&(reg)),bit)
struct{volatile uint32_t *BackLit,*CS,*RS,*WR,*RD,*RESET,*DATA_IN,*DATA_OUT;}LCD;
void LCD_HW_LINK(void)
{
//使用指针连接寄存器
LCD.BackLit =(uint32_t*)&TIM1->CCR1;
LCD.CS =(uint32_t*)BIT_REG(GPIOB->ODR,12);
LCD.RS =(uint32_t*)BIT_REG(GPIOB->ODR,13);
LCD.WR =(uint32_t*)BIT_REG(GPIOB->ODR,14);
LCD.RD =(uint32_t*)BIT_REG(GPIOB->ODR,15);
LCD.RESET =(uint32_t*)BIT_REG(GPIOA->ODR, 4);
LCD.DATA_IN =(uint32_t*)&GPIOD->IDR;
LCD.DATA_OUT=(uint32_t*)&GPIOD->ODR;
}
void Exp(void) //位操作演示
{
*LCD.CS=ENABLE;
*LCD.CS=DISABLE;
}
|