uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; uint32_t tmpreg = 0x00, pinmask = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_MODE(G
GPIOx->BSRR = GPIO_Pin 以 PIN_0脚为例,这句话的意思就是 GPIOx->BSRR = 0x0001(这里不做强制转换是因为16位数赋值正好只改变高位满足对应的置位需求,不对低位做处理,防止意外篡改), 而0x0001 <=> 0000 0000 0000 0001B,将 BS0位 置1。实现控制 PIN_0 脚输出高电平。 总结一下,HAL_GPIO_WritePin...
pinmask = ((uint32_t)0x0F) << pos; tmpreg &= ~pinmask; /* Write the mode configuration in the corresponding bits */ tmpreg |= (currentmode << pos); GPIOx->CRL = tmpreg; //### 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 接下来判断引...
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); if (currentpin == pos) { pos = pinpos << 2; /* Clear the corresponding high control register bits */ pinmask = ((uint32_t)0x0F) << pos; tmpreg &= ~pinmask; /* Write the mode configuration in the corresponding bits */ tmp...
MIO 是多功能复用的意思,因为I/O peripherals有很多的功能引脚,而MIO一共只有54pin,所以一些引脚功能需要复用一些功能。(这一点有点像STM32的I/O复用)。如果引脚还不够用,就可以使用EMIO(E是extend 扩展的意思),使用PL端的一些引脚来扩展GPIO。 这里GPIO可以分成4个BANK,bank0,1 属于MIO, bank2,3属于EMIO。
那我们现在看看HAL用了这个断言机制判断了什么呢IS_GPIO_PIN(GPIO_Pin)这个从字面上理解其实很简单,意思就是: 这个()里面的东西它是一个GPIO的Pin吗? 从它的实现也能看出 #define IS_GPIO_PIN(PIN) (((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00u) && (((uint32_t)PIN) & ~GPIO_PIN_MASK) ...
uint32_t pin_bit_mask; /*!< 引脚: 32位的参数,每一位对应着一个GPIO*/ gpio_mode_t mode; /*!<模式:设置输入或者输出模式 */ gpio_pullup_t pull_up_en; /*!< GPIO上拉 */ gpio_pulldown_t pull_down_en; /*!< GPIO下拉 */ ...
PIN_CONF:32个32bit寄存器。单独配置每个GPIO的输入输出(可覆盖DIR寄存器),输出模式、输出驱动能力、内部上下拉。GPIO输出状态与驱动能力配置我们知道GPIO的输出电路内部是两个MOS管作为开关,也就是说,GPIO其实有三种状态:输出高电平:上管导通、下管关断。通常代表逻辑1。 输出低电平:上管关断,下管导通。通常代表逻辑...
uint32_t tmpreg=0x00, pinmask =0x00;//currentmode 用于存放临时的LCIR//currentpin 用于存放配置的引脚位//pinpos 用于存放当前操作的引脚号//pos 存放当前操作的引脚位//tmreg 当前的CIR//pinmask//判断参数assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); ...