《GPIO编程知识点.docx》由会员分享,可在线阅读,更多相关《GPIO编程知识点.docx(6页珍藏版)》请在第一文库网上搜索。
1、三、GP1O编程寄存器编程模式:GPIO输入输出配置相关寄存器- GPIoX_CR1:端口配置低寄存器- GPIOX_CRH:端口配置盲寄存器- GPioxDR:端口输入寄存器- GPIoX_0DR:端输出寄存器- GPIoX_BSRR:端口位设置/清除寄存器- GPIOx-BRR:端口位清除寄存器- GPIox_1CKR:端口配置锁存寄存器8.2.1 端口配置低寄存器(GPIOX_CR1)(X=A-E)偏移地址:OXOo复位值:0x4444444431302928272625242322212019181716CF71:0YoDE71:01CXF6k01MODE61:01CXF5kOMODE
2、51:01CXF41:01MODE41OrwrwrwrwrwrwrwFWrWrWrWrWrWrWrwrw1514131211109876543210CXF31:O1MODE31:01CXF2kOVODE21:0CXF11:07MODE11:O1CXFOt1rO1MODEO1I:0rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw位31:3027:2623:2219:1815:1411:107:63:2CNFy1:0:端口X配置位(y=0.7)(Portconfigurationbits)软件通过这些位酸置相应的I/O端U,请参考表17端口位配置表n在输入模式(MODE1:0=00
3、):00,模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留在输出模式(MODE1:000):00,通用推挽输出模式01:逋用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式位29:2825:2421:2017:1613:129:8,5:41:0MoDEy1:0。端口X的模式位(y=0.7)(PortXmodebits)软件通过这些位M置相应的I/O缱11,请参考表17端口位配置表.00:输入模式(复位后的状态)01:谕出模式,最大速度IOMHZ10:输出模式,最大速度2MHz11输出模式,最大速度50MHZ表17端口位配置表配置模式CNF1CNF
4、OM0DE1MODEOPXoDR寄存器通用输出推挽(PUSh-PUII)00011011见表18。或1开漏(OPen-Drain)1。或1复用功能输出推挽(PUSh-PU1I)10不使用开漏(OPerbDrain)1不使用输入模拟输入0000不使用浮空输入1不使用下拉输入100上拉输入1表18输出模式位MODE1:0意义00保留01最大输出速度为IoMHZ10最大输出速度为2MHz11最大输出速度为50MHZ输入模式下,上拉还是下拉输入由ODR寄存器相应位决定。8.2.3 端口输入数据寄存器(GPIoxDR)(X=A.E)313029282726252423222120191817161/:-
5、1514131211109876543210IDR15IDR14IDR13IDR12IDR11IDR1OIDR9IDR8IDR7IDR6IDR5IDR4IDR3IDR2IDR1IDROrrrrrrrrrrrr位31:16保留,始终读为0位15:0IDRy15:0t端口输入数据(y=0.15)(Portinputdata)这些位为只读并只能以字(1般)的形式读出.读出的值为对应I/O口的状态.8.2.4 端口输出数据寄存器(GPIOX_0DR)(X=A.E)31302928272625242322212019181716保留1514131211109876543210ODR15ODR140DR1
6、30DR12ODR11ODR1O0DR90DR80DR70DR60DR50DR40DR30DR2ODR1ODROrwrwrvrwrwrwrwrwrwrwrwrwrwrwrwrw位31:16保留,始终读为0位15:0ODRy15:0:端口输出数据(y=0.15)(Portoutputdata)这些位可读可写并只转以字(16位)的形式操作.注:XjGPIOx,BSRR(x=A.E),可以分别跑对各个ODR位进行独立的设置/清除.8.2.5 端口位设置/清除寄存器(GPIOX_BSRR)(X=A.E)31302928272625242322212019181716BR1oBR14BR13BR12BR
7、11BR1OBR9BR8BR7BR6BR5BR4BR3BR2BR1BRO1514131211109876543210BS15BS14BS13BS12BS11BS1OBS9BS8BS7BS6BS5BS4BS3BS2BS1BSO位31:16BRy:清除端1IX的位y(y=0.15)(PortXResetbity)这些位只能写入并只能以字(16位)的形式操作.0:对对应的ODRy位不产生影响1:清除对应的ODRy位为0注:如果同时设置了BSy和BRy的对应位,BSy位起作用.位15:0BSy:设置端口X的位y(y=015)(PortXSetbity)这些位只能写入并只能以字(16位)的形式操作.0,
8、对对应的ODRy位不产生影响1:设置对应的ODRy位为18.2.6 端口位清除寄存器(GPIoX_BRR)(x=A.E)地址偏移:0x14复位值:0x00000000位带操作位带操作就是把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。在CM3支持的位带中,有两个区中实现了位带。其中一个是SRAM区的最低IMB范围,0x20000000-0x200FFFFF(SRAM区中的最低1MB);第二个则是片内外设区的最低IMB范围,0x40000000-0
9、x400FFFFF(片上外设区中的最低IMB)。sys.h文件对GPIO输入输出部分功能实现了位带操作BITBAND(addrzbitnum)(addr&0F0000000)+02000000+(addr40FFFFF)5)+(bitnuw2)#deineMEMADDR(addr)*(vo1ati1eunsigned1ong*)(addr)#defineBITADDR(addrz:EO口地址映射bitnum)MEM_ADDR(BITBAND(addrzbitnum)#deineGPIOAODRAddr(GPIOABASE+12)/0x4001080C#de1neGPIOBODRAddr(GPI
10、OBBASE+12)/040010C0C#defineGPIOCODRAddr(GPIOCBASE+12)/04001100C#defineGPIODODRAddr(GPIODBASE+12)/0x4001140C#defineGPIOEODRAddr(GPIOEBASE+12)/0x4001180C#deineGPIOFODRAddr(GPIOFBASE+12)/0x40011A0C#defineGPIOG_ODR_Addr(GPIoG一BASE+12)Z0x40011E0C#deineGPIOAIDRAddr(GPIOABASE+8)/040010808#defineGPIOBIDRAdd
11、r(GPIOBBASE+8)/0x40010C08#defineGPIOCIDRAddr(GPIOCBASE+8)/0x40011008#defineGPIODIDRAddr(GPIODBASE+8)Z040011408#defineGPIOEIDRAddr(GPIOEBASiE+8)/040011808#deineGPIOFIDRAddr(GPIOFBASE+8)/040011A08#deineGPIOG_IDR_Addr(GP1OG_BAgE+8)/040011E0810口操作,只对单一的IO口!确保n的值小于16!#definePAout(n)BITADDR(GPIOAODRAddrzn
12、)/输出/输入#deinePin(n)BIT_ADDR(GPIOA_IDR_Addrzn):#definePBout(n)BIT_ADDR(GPIOB_ODR_Addr,n)/输出#definePBin(n)BIT-IADDR(GP1OB11DRAddr,n)输入/definePCout(n)BIT_ADDR(GPIOC_ODR_Addr,n)/输出#definePCin(n)bit:ADDR(GP1oC二IDR二Addr,n)输入#definePDout(n)BIT_ADDR(GPIOD_ODR_Addr,n)输出;#definePDin(n)BIT-IADDR(GP1OD1IDRIAddr
13、,n)输入IdefinePEoutfnBITADDRfGPIOEODRAddr.n1使用位带操作设置IO口输入输出方法:PAout(8)=0;PA.8输出低PAout(8)=1;PA.8输出高8IedO;IedO=PAin;读取PA8的输入电平库函数编程:GP1O输入输出配置重要函数:voidGPIO_1nit(GPIO_TypeDef*GPIO,GPIO_1nitTypeDef*GpIOJnitStruct);uint8_tGPIO_Read1nputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);uint16_tGPIO_Read1nputData(G