stm32中void GPIO_DeInit(GPIO_TypeDef* GPIOx)的一点疑惑

偷天神猫 2014-08-07 03:39:31
查看函数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_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, DISABLE);
}
else if(GPIOx == GPIOB)
{
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, DISABLE);
}
else if(GPIOx == GPIOC)
{
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, DISABLE);
}
else if(GPIOx == GPIOD)
{
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, DISABLE);
}
else
{
if(GPIOx == GPIOF)
{
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, DISABLE);
}
}
}
我感到疑惑的是,既然该函数的作用是重设为缺省值,在if判断语句中为什么不直接将外设端口置为DISABLE,为什么每个if判断语句的第一行都要先置为ENABLE再执行 RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOx, DISABLE)语句,这样做的用意是什么?
...全文
1535 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20649223 2014-09-11
  • 打赏
  • 举报
回复
是不是就是说:先ENABLE,就是写1,复位相关外设的各个寄存器,再DISABLE,就是将写0,只有这样才不会一直复位下去。
偷天神猫 2014-09-09
  • 打赏
  • 举报
回复
今天在《Cortex-M3权威指南》“中断的使能与除能”中看到了这样一句话,瞬间明白了什么,和我一样纠结该帖问题的朋友可以参考下下面这段话,大概就知道为什么使能与除能要写两行而不是一行解决了 欲使能一个中断,你需要写1 到对应SETENA 的位中;欲除能一个中断,你需要写1 到对应的CLRENA 位中;如果往它们中写0,不会有任何效果。通过这种方式,使能/除能中断时只需把“当事位”写成1,其它的位可以全部为零。再也不用像以前那样,害怕有些位被写入0 而破坏其对应的中断设置(写0 没有效果),从而实现每个中断都可以自顾地设置,而互不侵犯——只需单一的写指令,不再需要读‐改‐写。
偷天神猫 2014-08-12
  • 打赏
  • 举报
回复
如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。大概就是为了这个稳定性需求吧
偷天神猫 2014-08-12
  • 打赏
  • 举报
回复
引用 8 楼 u012586257 的回复:
这么深入的问题干吗不直接去问厂家?st的解答才权威全面吧
………………翻了很多st的资料,目前还没找到解答…………不搞的明明白白总是心里放不下
mangoalx 2014-08-12
  • 打赏
  • 举报
回复
这么深入的问题干吗不直接去问厂家?st的解答才权威全面吧
偷天神猫 2014-08-11
  • 打赏
  • 举报
回复
引用 6 楼 jobszheng5 的回复:
这个主要考虑的复位的时序问题。 楼主如果不做特别细化的优化,这部分内容还是略过去吧。直接使用官方的库函数来调用API函数来实现具体的应用。
能详细说说这样做的机理吗?我查了很多资料找不到这样做的原因,很想知道为什么要这样做?不这样做会产生什么后果?求解答,分数可以给你
dceacho 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 u013660169 的回复:
引用 2 楼 xqhrs232 的回复:
看来用STM32的人挺多啊!不知道LZ拿STM32来做什么产品?
小灰机
做无人机吧, 这东西好卖.
偷天神猫 2014-08-08
  • 打赏
  • 举报
回复
引用 2 楼 xqhrs232 的回复:
看来用STM32的人挺多啊!不知道LZ拿STM32来做什么产品?
小灰机
xqhrs232 2014-08-08
  • 打赏
  • 举报
回复
看来用STM32的人挺多啊!不知道LZ拿STM32来做什么产品?
jobszheng5 2014-08-08
  • 打赏
  • 举报
回复
这个主要考虑的复位的时序问题。 楼主如果不做特别细化的优化,这部分内容还是略过去吧。直接使用官方的库函数来调用API函数来实现具体的应用。
偷天神猫 2014-08-08
  • 打赏
  • 举报
回复
引用 4 楼 wangfan027 的回复:
引用 3 楼 u013660169 的回复:
[quote=引用 2 楼 xqhrs232 的回复:] 看来用STM32的人挺多啊!不知道LZ拿STM32来做什么产品?
小灰机
做无人机吧, 这东西好卖. [/quote]正在学习中……
lr2131 2014-08-07
  • 打赏
  • 举报
回复
引用 楼主 u013660169 的回复:
查看函数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_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, DISABLE); } else if(GPIOx == GPIOB) { RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, DISABLE); } else if(GPIOx == GPIOC) { RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, ENABLE); RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, DISABLE); } else if(GPIOx == GPIOD) { RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, ENABLE); RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, DISABLE); } else { if(GPIOx == GPIOF) { RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, ENABLE); RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, DISABLE); } } } 我感到疑惑的是,既然该函数的作用是重设为缺省值,在if判断语句中为什么不直接将外设端口置为DISABLE,为什么每个if判断语句的第一行都要先置为ENABLE再执行 RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOx, DISABLE)语句,这样做的用意是什么?
不清楚,可能这样做,不管之前是enbale还是disble,这样刷一下能保证稳定可靠, 具体原因看datasheet吧,之前我见过哪个CPU关于时钟操作时,也有些代码看得很奇怪,感觉多此一举,但看了datasheet,那上面就是这么要求的。 这样做一定是有原因的,不然ST也不会花那么大精力搞这个固件库了,找找手册吧。

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧