[mw_shl_code=c,true]/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}[/mw_shl_code]
用软件仿了下,就像原子哥说的,“模式代码”一栏是数据合法性的判断。对于INPUT来说,四种配置的模式代码都为0x 0X,自然也就不满足if的判断条件,也就无需配置GPIO_Speed;对于OUTPUT来说,四种配置的模式代码都为0x 1X,与上0x0F后currentmode依然为0x 0X(和“设置”一栏里的数据一样,也就是CRL或CRH寄存器里应该放的值),但是满足if的判断条件,所以也就需要配置GPIO_Speed。
至于GPIO_MODE_IPD/IPU分别为0x28和0x48,不是0x 0X,主要是体现在下面的配置:
[mw_shl_code=c,true] if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}[/mw_shl_code]
如果是弱下拉的话,需要置位BRR,保证初始状态ODR为低;如果是弱上拉的话,需要置位BSRR,保证初始状态ODR为高。
PS:感觉对编写STM32没什么用,只是学STM8的时候也会遇到类似的问题,看到固件库手册上有这么个说明,就提了下。
|