ST官方库函数之GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解
来源:互联网 发布:linux搭建邮件系统 编辑:程序博客网 时间:2024/05/21 11:16
通常我们需要对ST单片机的整个IO进行复位操作,这是我们可以用到复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx);
先来看一下这个函数的定义
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
if (GPIOx == GPIOA)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
}
else if (GPIOx == GPIOB)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
}
else if (GPIOx == GPIOC)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
}
else if (GPIOx == GPIOD)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);
}
else if (GPIOx == GPIOE)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);
}
else if (GPIOx == GPIOF)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE);
}
else
{
if (GPIOx == GPIOG)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE);
}
}
}
这便是对一组IO进行复位的函数,它先后2次调用了函数void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState),
而且这PA,PB,PC,PD,PE,PF,PG 7组IO口的时钟都挂载在了APB2总线上。
第一次调用这个函数RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE)是对PA口的寄存器进行复位使其为0,
第二次调用这个函数RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE)是对PA口的寄存器进行复位接触,之后可以对PA口的寄存器进行读写操作。
再来详细看一下这个函数void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
/* Check the parameters */
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;
}
}
RCC->APB2RSTR |= RCC_APB2Periph这句话对RCC的寄存器进行置位操作,也是对传进来的RCC_APB2Periph_GPIOA的PA口进行复位操作,执行后RCC的寄存器APB2RSTR的第3位为1,即D2位为1,执行后PA口的寄存器GPIOA_ODR为0。
RCC->APB2RSTR &= ~RCC_APB2Periph这句话即对PA口的寄存器进行复位解除,执行后RCC的寄存器APB2RSTR的第3位为0,PA口的寄存器可以任意读写了。
- ST官方库函数之GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解
- ST官方库函数之GPIO口读写函数
- STM32库函数uint8_t GPIO_ReadInputDataBit ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin )
- ST之GPIO使用之理解
- STM32固件库之GPIOx操作理解
- 对GPIO_Init(GPIOx,&GPIO_InitStructure)的理解
- STM32的函数ssert_param(IS_GPIO_ALL_PERIPH(GPIOx));
- stm32之GPIO的理解
- FPGA开发技巧之同步复位与异步复位的理解
- 如何从ST官网下载官方库函数(更新版)
- GPIO库函数
- GPIO库函数
- STM8库函数学习笔记之GPIO
- STM32库函数之GPIO初始化代码分析
- STM32的串口函数_库函数USART_SendData问题和解决方法--硬件复位导致第一个字节丢失
- C语言之理解(*(void (*)())0)()和signal函数
- typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
- EventBus
- Codeforces Round #440 C. Maximum splitting
- 登陆网页验证
- OpenGL学习: 帧缓冲对象(Frame Buffer Object)
- 使用腾讯云 SCF 云函数压缩 COS 对象存储文件
- ST官方库函数之GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解
- 配置hive的环境变量
- 第五周-项目二-建立链栈算法库
- 数据结构第八周项目(1)——建立顺序串算法库
- 2、移动端input弹出带有搜索按钮的键盘与获取点击搜索按钮触发的事件
- 前端之文件导出
- 命令模式(14)--命令模式
- 关于数据清洗的梳理
- pyQt5-事件和信号