zoukankan      html  css  js  c++  java
  • 关于引脚复用,不得不提的GPIO_Pin_sources 和GPIO_Pin

    今天在端口复用时遇到了困惑,参考:http://www.51hei.com/bbs/dpj-40992-1.html

    调整前的代码
    GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_4);
    GPIO_PinAFConfig(GPIOA,GPIO_Pin_10,GPIO_AF_4);

    调整后的代码
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_4);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_4);

    不难看出,该工程师调整的就是上面红色参数部分。一个是GPIO_Pin_N,一个是GPIO_PinSourceN,其实这2个参数是不一样的。

    GPIO_Pin_n可以理解为某端口脚在整个端口的位置。比方某GPIO口的第6管脚位置编码GPIO_Pin_6 被定义为 ((uint16_t)0x0040) ,在对相应GPIO管脚做基本属性配置时会用到,如配置输入输出模式、模拟输入模式的选择等。有兴趣的话,可以点击GPIO_Init( )进去看看。

    而GPIO_PinSourceN一般是在对某GPIO口相应pin脚的复用功能进行选择配置才会用到。它是根据端口各脚位的位置按顺序从0开始依次递增编号,可以理解为该管脚在该端口的序号。比方某GPIO口的第6号复用功能脚的序号GPIO_PinSource6 被定义为 ((uint8_t)0x06) 。有兴趣的话,也可以打开GPIO_PinAFConfig( )函数看看。显然,GPIO_PinSource6跟上面的GPIO_Pin_6的值相差甚远。

    下面是ST官方库代码中有关GPIO_Pin_N的定义:

    #define GPIO_Pin_0 ((uint16_t)0x0001)

    #define GPIO_Pin_1 ((uint16_t)0x0002)

    #define GPIO_Pin_2 ((uint16_t)0x0004)

    #define GPIO_Pin_3 ((uint16_t)0x0008)

    #define GPIO_Pin_4 ((uint16_t)0x0010)

    #define GPIO_Pin_5 ((uint16_t)0x0020)

    #define GPIO_Pin_6 ((uint16_t)0x0040)

    #define GPIO_Pin_7 ((uint16_t)0x0080)

    #define GPIO_Pin_8 ((uint16_t)0x0100)

    #define GPIO_Pin_9 ((uint16_t)0x0200)

    #define GPIO_Pin_10 ((uint16_t)0x0400)

    。。。。。。

    #define GPIO_Pin_15 ((uint16_t)0x8000)

    #define GPIO_Pin_All ((uint16_t)0xFFFF)

    下面是有关GPIO_PinSourceN的定义:

    #define GPIO_PinSource0 ((uint8_t)0x00)

    #define GPIO_PinSource1 ((uint8_t)0x01)

    #define GPIO_PinSource2 ((uint8_t)0x02)

    #define GPIO_PinSource3 ((uint8_t)0x03)

    #define GPIO_PinSource4 ((uint8_t)0x04)

    #define GPIO_PinSource5 ((uint8_t)0x05)

    #define GPIO_PinSource6 ((uint8_t)0x06)

    #define GPIO_PinSource7 ((uint8_t)0x07)

    #define GPIO_PinSource8 ((uint8_t)0x08)

    #define GPIO_PinSource9 ((uint8_t)0x09)

    #define GPIO_PinSource10 ((uint8_t)0x0A)

    。。。。。。

    #define GPIO_PinSource15 ((uint8_t)0x0F)

    小结:上面的问题只有基于STM32官方固件库开发时才会碰到。说实在的,这两个参数的确容易让人误解成一个东西或者弄混淆,尤其刚接触的人。经常有人在这个地方遇到麻烦,之前我在一篇文章中提到过。这里再特意提醒下。

    不过ST官方后来推出的STM32CUBE库在这个地方的代码写法做了调整,不再定义GPIO_PinSourceN。当然,因为管脚配置导致异常的问题时有发生,建议使用ST官方推出的STM32CUBE配置环境及CUBE参考固件库着手开发,这样会省不少事。

  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7071565.html
Copyright © 2011-2022 走看看