其實現在也沒心情介紹了,直接說一下有什么實用的功能
第一點哈,支持位帶操作
//IO口操作宏定義#defineBITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))#defineMEM_ADDR(addr)? *((volatile unsigned long? *)(addr))#defineBIT_ADDR(addr, bitnum)? MEM_ADDR(BITBAND(addr, bitnum))//IO口地址映射#defineGPIO0_PIN_Addr? ? (LPC_GPIO0_BASE+20)#defineGPIO1_PIN_Addr? ? (LPC_GPIO1_BASE+20)#defineGPIO2_PIN_Addr? ? (LPC_GPIO2_BASE+20)#defineGPIO3_PIN_Addr? ? (LPC_GPIO3_BASE+20)#defineGPIO4_PIN_Addr? ? (LPC_GPIO4_BASE+20)#defineGPIO5_PIN_Addr? ? (LPC_GPIO5_BASE+20)#defineP0out(n)? BIT_ADDR(GPIO0_PIN_Addr,n)//輸出#defineP0in(n)? ? BIT_ADDR(GPIO0_PIN_Addr,n)//輸入#defineP1out(n)? BIT_ADDR(GPIO1_PIN_Addr,n)//輸出#defineP1in(n)? ? BIT_ADDR(GPIO1_PIN_Addr,n)//輸入#defineP2out(n)? BIT_ADDR(GPIO2_PIN_Addr,n)//輸出#defineP2in(n)? ? BIT_ADDR(GPIO2_PIN_Addr,n)//輸入#defineP3out(n)? BIT_ADDR(GPIO3_PIN_Addr,n)//輸出#defineP3in(n)? ? BIT_ADDR(GPIO3_PIN_Addr,n)//輸入#defineP4out(n)? BIT_ADDR(GPIO4_PIN_Addr,n)//輸出#defineP4in(n)? ? BIT_ADDR(GPIO4_PIN_Addr,n)//輸入#defineP5out(n)? BIT_ADDR(GPIO5_PIN_Addr,n)//輸出#defineP5in(n)? ? BIT_ADDR(GPIO5_PIN_Addr,n)//輸入
好處就不言而喻了,,簡直太方便了和實用了
第二點
voidGPIO_Conf_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint32_t mode);//配置指定引腳的模式voidGPIO_Conf_Bits(uint8_t GPIOx, uint32_t StartPinx,uint32_t PinNum,uint32_t mode);//配置多個連續引腳的模式voidGPIO_Init_Bit(GPIO_InitTypeDef * GPIO_InitStruct);//初始化一個引腳的模式--內部調用,用戶不使用voidGPIO_Init_Bits(GPIO_InitTypeDef *GPIO_InitStruc,uint32_t PinNum);//初始化多個連續引腳的配置--內部調用,用戶不使用voidGPIO_Dir_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint8_t Dir);//設置指定引腳的輸入輸出方向voidGPIO_Dir_Bits(uint8_t GPIOx, uint32_t StartPinx,uint32_t PinNum,uint8_t Dir);//設置多個連續引腳的輸入輸出方向voidGPIO_Write_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint8_t BitVal);//設置指定引腳輸出高低電平voidGPIO_Write_Bits(uint8_t GPIOx,uint32_t BitVal);//將數據寫入指定的GPIO數據端口uint8_t GPIO_Read_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx);//讀取指定引腳的電平狀態uint32_t GPIO_Read_Bits(uint8_t GPIOx);//讀取指定的GPIO端口的電平狀態voidGPIO_Mask_Bit(uint8_t GPIOx,uint32_t GPIO_Pinx,uint8_t Mask);//屏蔽或清除屏蔽引腳voidGPIO_Mask_Bits(uint8_t GPIOx, uint32_t StartPinx,uint32_t PinNum,uint8_t Mask);//屏蔽或清除屏蔽多個連續引腳
其實有了位帶操作自己感覺應該去掉上面的設置一個引腳的電平,,,不過呢!位帶操作我是訪問的PIN寄存器,而函數里面用的是SET和CLR
先說第一個函數的實現過程
先看內部
/**
* @brief? 配置指定引腳的模式
* @param? GPIOx:設置的端口0-5
* @param? GPIO_Pinx:設置的引腳0-32
* @param? mode:引腳的模式
GPIO_Mode_IFT? ? ? ? //無上下拉
GPIO_Mode_IPD? ? ? ? //內部下拉
GPIO_Mode_IPU? ? ? ? //內部上拉
GPIO_Mode_TRA? ? ? ? //轉發模式
GPIO_Mode_HYS? ? ? ? //遲滯模式
GPIO_Mode_INV? ? ? ? //輸入反向
GPIO_Mode_SWI? ? ? ? //轉換速率
GPIO_Mode_OOD? ? ? ? //開漏輸出
* @retval None
* @example GPIO_Conf_Bit(GPIO0,1,GPIO_Mode_IPD);//P0_1下拉*/voidGPIO_Conf_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint32_t mode)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIOx=GPIOx;
GPIO_InitStruct.mode=mode;
GPIO_InitStruct.Pinx=GPIO_Pinx;
GPIO_Init_Bit(&GPIO_InitStruct);
}
評論
查看更多