您的位置 首页 测评

STM32小笔记(一) GPIO口的装备

GPIO口的使用:1GPIO和AFIO全系列支持GPIO寄存器(1)两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH);(2)两个32位数据寄存器(GPIOx_IDR,GPIOx_OD

GPIO口的运用:
1.GPIO和AFIO全系列支撑

GPIO寄存器
(1)两个32位装备寄存器(GPIOx_CRL,GPIOx_CRH);
(2)两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR);
(3)一个32方位为/复位寄存器(GPIOx_BSRR);
(4)一个16位复位寄存器(GPIOx_BRR);
(5)一个32位锁存器(GPIOx_LCKR);

输入装备
当I/O端口装备为输入时:
输出缓冲器被制止
施密特触发输入被激活
依据输入装备(上拉,下拉或起浮)的不同,弱上拉和下拉电阻被衔接
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
对输入数据寄存器的读拜访可得到I/O状况

输出装备
当I/O端口被装备为输出时:
输出缓冲器被激活
开漏形式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状况(PMOS从不被激活)。
推挽形式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
施密特触发输入被激活
弱上拉和下拉电阻被制止
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
在开漏形式时,对输入数据寄存器的读拜访可得到I/O状况
在推挽式形式时,对输出数据寄存器的读拜访得到最终一次写的值。

STM32中的装备寄存器在固件函数库中早已生成,因而无需再对寄存器的每个设定写界说,而是直接调用关键字。这样咱们能够不再关怀寄存器的详细装备(由于那已经在固件装备好了);因而直观的从装备函数中去看,更能有用的进步。

GPIO相关的库函数如下,坐落在“stm32f10x_gpio.h”
GPIO相关函数如下:

voidGPIO_DeInit(GPIO_TypeDef*GPIOx);
voidGPIO_AFIODeInit(void);
voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);
voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);
uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);
uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);
voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);
voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);
voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
voidGPIO_EventOutputCmd(FunctionalStateNewState);
voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);
voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface);

以下将逐一阐明函数功用及注释阐明:
·voidGPIO_DeInit(GPIO_TypeDef*GPIOx);

该函数原型在”stm32f10x_gpio.C”傍边,相似C++的注释阐明如下:

*@briefDeinitializestheGPIOxperipheralregisterstotheirdefaultresetvalues.
*@paramGPIOx:wherexcanbe(A..G)toselecttheGPIOperipheral.
*@retvalNone
其间是为不同组的IO口进行寄存器值的初始化。
初始化句子如下:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);”
再追根溯源到这个函数,坐落“stm32f10x_rcc.C”傍边
“voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState)”
{

assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if(NewState!=DISABLE)
{
RCC->APB2RSTR|=RCC_APB2Periph;
}
else
{
RCC->APB2RSTR&=~RCC_APB2Periph;
}
}
函数注释如下:

一望而知,即装备IO口时钟状况为使能或许失效。

当然在其间此函数作为一个初学实例仍是值得深究的:
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
此处两句即相似于C++中的断语函数,作为函数运转的先决条件。这儿将断语函数直接阐明,在后续的实例中,仍旧会有运用到的当地。

#defineassert_param(expr)((expr)?(void)0:assert_failed((uint8_t*)__FILE__,__LINE__))

voidassert_failed(uint8_t*file,uint32_tline);
#else
#defineassert_param(expr)((void)0)
#endif
#endif
若满意断语值为”1″的条件,不然断定失利输出文件名和所内行。不为”0″回来0.

再回来“assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));”此句中。“IS_RCC_APB2_PERIPH”如下界说:
·#defineIS_RCC_APB2_PERIPH(PERIPH)((((PERIPH)&0xFFC00002)==0x00)&&((PERIPH)!=0x00))
此处运用到的是AP2进入该函数还能够看到AP2、AP1、AP三个高速时钟族的各项界说。权且在这儿认为是断定敞开对应时钟前的时钟功用验证。
·#defineIS_FUNCTIONAL_STATE(STATE)(((STATE)==DISABLE)||((STATE)==ENABLE))
只为考虑仍是的形参是否是“DISABLE”or“ENABLE”两个状况。

if(NewState!=DISABLE)
{
RCC->APB2RSTR|=RCC_APB2Periph;
}
else
{
RCC->APB2RSTR&=~RCC_APB2Periph;
}

而APB2RSTR则行将牵扯到RCC的设置问题,咱们下一节再讲。


·voidGPIO_AFIODeInit(void);功用复用,从头映射事情操控。
相同调用“RCC_APB2PeriphResetCmd”。也是串口初始化判别
·voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);
寄存器手册中记为:依据GPIO_InitStruct中指定参数初始化外设GPIOx寄存器
不想在此处在赘述此函数,首要经过写寄存器的值来装备GPI0x,GPIO_pin,GPIO_Mode,GPIO_speed,以及写GPIOCRL/CRH寄存器。
·voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);被上一结构体调用
GPIO_Speed描绘
GPIO_Speed_10MHz最高输出速率10MHz
GPIO_Speed_2MHz最高输出速率2MHz
GPIO_Speed_50MHz最高输出速率50MHz

GPIO_Mode_AIN模仿输入
GPIO_Mode_IN_FLOATING浮空输入
GPIO_Mode_IPD下拉输入
GPIO_Mode_IPU上拉输入
GPIO_Mode_Out_OD开漏输出
GPIO_Mode_Out_PP推挽输出
GPIO_Mode_AF_OD复用开漏输出
GPIO_Mode_AF_PP复用推挽输出

·
uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);,
uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);
读取指定管脚输入/输出,读取管脚输入/输出数据值。一个读取的是管脚的状况,而一个读取的输入or输出数据寄存器的值。这一点要辨明
·
voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);
“bitvalmustbeBit_RESETorBit_SET“
voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);
“Portval为将写入数据寄存器的值”
设定/铲除指定的数据位
·voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
锁存管脚寄存器,锁存指定GPIO组指定引脚。
·voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);
voidGPIO_EventOutputCmd(FunctionalStateNewState);
装备GPIO为事情输出,这以后咱们来处理这个疑问。
·voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);
此函数决议了IO口的从头映射,实践是IO复用功用的完成,GPIO_Remap挑选输入引脚,NewState的装备值如下:GPIO_Remap_SPI1SPI1复用功用映射
GPIO_Remap_I2C1I2C1复用功用映射
GPIO_Remap_USART1USART1复用功用映射
GPIO_PartialRemap_USART3USART2复用功用映射
GPIO_FullRemap_USART3USART3复用功用彻底映射
GPIO_PartialRemap_TIM1USART3复用功用部分映射
GPIO_FullRemap_TIM1TIM1复用功用彻底映射
GPIO_PartialRemap1_TIM2TIM2复用功用部分映射1
GPIO_PartialRemap2_TIM2TIM2复用功用部分映射2
GPIO_FullRemap_TIM2TIM2复用功用彻底映射
GPIO_PartialRemap_TIM3TIM3复用功用部分映射
GPIO_FullRemap_TIM3TIM3复用功用彻底映射
GPIO_Remap_TIM4TIM4复用功用映射
GPIO_Remap1_CANCAN复用功用映射1
GPIO_Remap2_CANCAN复用功用映射2
GPIO_Remap_PD01PD01复用功用映射
GPIO_Remap_SWJ_NoJTRST除JTRST外SWJ彻底使能(JTAG+SW-DP)
GPIO_Remap_SWJ_JTAGDisableJTAG-DP失能+SW-DP使能
GPIO_Remap_SWJ_DisableSWJ彻底失能(JTAG+SW-DP)
每个功用在后面末节的运用中表现。
·voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource)
GPIO装备为外部中止,两个值分别为端口值和引脚。
·voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface)
最终一个装备以太网接口。该函数只有两行句子。此处不作介绍。


例程就不做介绍了,斗争和微雪的板子都还不错,初学者运用刚好。
下一节研讨下定时器的运用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/260066.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部