其實(shí)現(xiàn)在也沒心情介紹了,直接說一下有什么實(shí)用的功能
第一點(diǎn)哈,支持位帶操作
//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)//輸入
好處就不言而喻了,,簡直太方便了和實(shí)用了
第二點(diǎ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);//配置多個(gè)連續(xù)引腳的模式voidGPIO_Init_Bit(GPIO_InitTypeDef * GPIO_InitStruct);//初始化一個(gè)引腳的模式--內(nèi)部調(diào)用,用戶不使用voidGPIO_Init_Bits(GPIO_InitTypeDef *GPIO_InitStruc,uint32_t PinNum);//初始化多個(gè)連續(xù)引腳的配置--內(nèi)部調(diào)用,用戶不使用voidGPIO_Dir_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint8_t Dir);//設(shè)置指定引腳的輸入輸出方向voidGPIO_Dir_Bits(uint8_t GPIOx, uint32_t StartPinx,uint32_t PinNum,uint8_t Dir);//設(shè)置多個(gè)連續(xù)引腳的輸入輸出方向voidGPIO_Write_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx,uint8_t BitVal);//設(shè)置指定引腳輸出高低電平voidGPIO_Write_Bits(uint8_t GPIOx,uint32_t BitVal);//將數(shù)據(jù)寫入指定的GPIO數(shù)據(jù)端口uint8_t GPIO_Read_Bit(uint8_t GPIOx, uint32_t GPIO_Pinx);//讀取指定引腳的電平狀態(tài)uint32_t GPIO_Read_Bits(uint8_t GPIOx);//讀取指定的GPIO端口的電平狀態(tài)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);//屏蔽或清除屏蔽多個(gè)連續(xù)引腳
其實(shí)有了位帶操作自己感覺應(yīng)該去掉上面的設(shè)置一個(gè)引腳的電平,,,不過呢!位帶操作我是訪問的PIN寄存器,而函數(shù)里面用的是SET和CLR
先說第一個(gè)函數(shù)的實(shí)現(xiàn)過程
先看內(nèi)部
/**
* @brief? 配置指定引腳的模式
* @param? GPIOx:設(shè)置的端口0-5
* @param? GPIO_Pinx:設(shè)置的引腳0-32
* @param? mode:引腳的模式
GPIO_Mode_IFT? ? ? ? //無上下拉
GPIO_Mode_IPD? ? ? ? //內(nèi)部下拉
GPIO_Mode_IPU? ? ? ? //內(nèi)部上拉
GPIO_Mode_TRA? ? ? ? //轉(zhuǎn)發(fā)模式
GPIO_Mode_HYS? ? ? ? //遲滯模式
GPIO_Mode_INV? ? ? ? //輸入反向
GPIO_Mode_SWI? ? ? ? //轉(zhuǎn)換速率
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);
}
評論