历史上的今天
返回首页

历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | stm32 gpio口的库函数配置

2019-09-25 来源:eefocus

库函数的配置方法


1.例程

  GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);


2.GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;是一个结构体变量的声明。

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。

定义一般形式如下:

struct 结构类型名

{

数据类型 成员名 1;

数据类型 成员名 2;

数据类型 成员名 n;

};

结构变量声明的一般形式如下:

struct 结构类型名称 结构变量名; (表明这个变量名的结构类型是上面这个类型。)

也可以在定义结构体的同时定义结构体变量

struct 结构类型名

{

数据类型 成员名 1;

数据类型 成员名 2;

数据类型 成员名 n;

}stu1,stu2;

跳转到GPIO_InitTypeDef 的定义上,发现


typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.

                                      This parameter can be any value of @ref GPIO_pins_define */


  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.

                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */


  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.

                                      This parameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;


这个结构体定义了GPIO_Pin,GPIO_Speed和 GPIO_Speed( GPIO_Speed和GPIO_Speed 也是结构体)

在GPIO_InitTypeDef GPIO_InitStructure;

这句话的理解是我们定义一个结构体GPIO_InitStructure,他的成员有GPIO_Pin,GPIO_Speed和 GPIO_Speed。


GPIO_InitStructure成员的赋值;

结构体成员的引用有

变量名.成员名

例:GPIO_InitStructure.GPIO_Mode

变量名->成员名

例:GPIO_InitStructure->GPIO_Mode


GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;


它的意思是将GPIO_Mode_Out_PP(跳转到GPIO_Mode_Out_PP发现GPIO_Mode_Out_PP=0x10)赋值给GPIO_InitStructure.GPIO_Mode;将GPIO_Pin_5赋值给GPIO_InitStructure.GPIO_Pin;将GPIO_Speed_50MHz赋值给GPIO_InitStructure.GPIO_Speed。


GPIO_Init(GPIOB,&GPIO_InitStructure);

这句话的意思是按照GPIO_Init()这个函数的规则来初始化GPIO口。跳转到GPIO_Init这个函数.这里面写了是如何对寄存器进行操作,然后设置各个GPIO口。


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  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(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

  

/*---------------------------- 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;

  }

/*---------------------------- GPIO CRL Configuration ------------------------*/

  /* Configure the eight low port pins */

  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)

  {

    tmpreg = GPIOx->CRL;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = ((uint32_t)0x01) << pinpos;

      /* Get the port pins position */

      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

      if (currentpin == pos)

      {

        pos = pinpos << 2;

        /* Clear the corresponding low control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        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);

          }

        }

      }

    }

    GPIOx->CRL = tmpreg;

  }

/*---------------------------- GPIO CRH Configuration ------------------------*/

  /* Configure the eight high port pins */

  if (GPIO_InitStruct->GPIO_Pin > 0x00FF)

  {

    tmpreg = GPIOx->CRH;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = (((uint32_t)0x01) << (pinpos + 0x08));

      /* Get the port pins position */

      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 */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

        /* Set the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

        {

          GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

      }

    }

    GPIOx->CRH = tmpreg;

  }

}


/**

  * @brief  Fills each GPIO_InitStruct member with its default value.

  * @param  GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will

  *         be initialized.

  * @retval None

  */


assert_param(IS_GPIO_ALL_PERIPH(GPIOx));的作用就是检测传递给IS_GPIO_ALL_PERIPH函数的参数是否是有效的参数。IS_GPIO_ALL_PERIPH函数的定义是:


#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||

                                    ((PERIPH) == GPIOB) ||

                                    ((PERIPH) == GPIOC) ||

                                    ((PERIPH) == GPIOD) ||

                                    ((PERIPH) == GPIOE) ||

                                    ((PERIPH) == GPIOF) ||

                                    ((PERIPH) == GPIOG))

                                     

这表明IS_GPIO_ALL_PERIPH的函数只能是GPIOABCDEFG的一个。如果不是其中的一个,函数无效。

推荐阅读

史海拾趣

BB公司的发展小趣事

2000年,BB公司迎来了发展史上的一个重要时刻——被美国德州仪器公司收购。这一收购对于BB公司来说,既是挑战也是机遇。德州仪器作为全球领先的半导体公司,为BB公司提供了更广阔的平台和更丰富的资源。在德州仪器的支持下,BB公司得以继续深化技术创新和市场拓展,进一步提升了其在电子行业的地位。

CYANLITE公司的发展小趣事

CYANLITE公司非常重视产品品质的管理和控制。他们建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。此外,公司还注重客户反馈的收集和分析,不断改进产品和服务以满足客户的需求。这种对品质的执着追求使得CYANLITE公司赢得了客户的信任和忠诚。许多客户都表示愿意长期与CYANLITE公司合作,并推荐他们的产品给其他人。

Furukawa Electric Co Ltd公司的发展小趣事

近年来,随着数字化技术的快速发展,CYANLITE公司也积极拥抱数字化转型。他们利用大数据、人工智能等先进技术优化生产流程、提高生产效率,并加强了对市场的分析和预测能力。此外,公司还加强了对电子商务平台的投入和建设,通过线上渠道拓展销售渠道并提高品牌曝光度。展望未来,CYANLITE公司将继续加大在技术研发和数字化转型方面的投入力度,推动公司向更高层次发展。同时他们也将继续关注市场变化和客户需求的变化趋势,不断调整和优化自己的战略方向和产品布局以应对未来的挑战和机遇。

對餘科技(DIOFIT)公司的发展小趣事

DIOFIT公司自创立之初,便面临着激烈的市场竞争和技术挑战。创始人团队凭借对电子技术的深入理解和热情,决心打造一家专注于高端电子产品研发和生产的企业。在资金紧张、人才匮乏的情况下,他们坚持自主研发,不断优化产品设计,最终成功推出了一款具有创新性的智能家居控制系统,赢得了市场的认可,为公司的发展奠定了坚实的基础。

芯朋微电子(chipown)公司的发展小趣事

作为国内电源管理芯片的重要厂商,芯朋微电子一直致力于实现进口替代。公司不断投入研发,推出了一系列高效能、低功耗、品质稳定的电源管理集成电路产品,推动整机的能效提升和技术升级。这些努力使得芯朋微电子在国内电源管理芯片市场中的地位日益稳固。

Headland Technology Product Group公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的基石。HBControls深知这一点,因此始终将品质管理放在首位。公司建立了完善的质量管理体系,从原材料采购、生产加工到成品检验,每一个环节都严格把关。此外,HBControls还定期对员工进行质量意识培训,确保每一位员工都能将品质理念融入到日常工作中。正是凭借卓越的产品质量和优质的服务,HBControls赢得了众多客户的信赖和好评。

问答坊 | AI 解惑

103KΩ究竟是多少Ω?

对于像一个电阻,常有103KΩ这样的写法用来表示电阻的阻值.有一些电子电路书中介绍说103K=10 x 103Ω,即104Ω也有的书上介绍说是1.0 x 103Ω,即103Ω.我也觉得应该是后者,我认为前者违反了科学计数法的规则.您觉得哪个对呢?说说您的理由. …

查看全部问答>

oscillaor phase noise求助

我搭建了一个最简单的正交LC oscillator. (quadrature). 要求phase noise -120dbc/hz.我的只能调到-111dbc/hz。求助大家如何设计才能达到要求?一般什么东西导致phase noise?如何才能减小phase noise? 谢谢。…

查看全部问答>

模拟线路设计经验(放大回路设计)

模拟线路设计经验(放大回路设计)…

查看全部问答>

适用于电阻电桥传感器的高输入电阻传感放大器

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 电路的功能   本电路适用于电阻电桥电路(应变仪、半导体压力传感器等),其电压放大倍数取决于外接电阻RO,当RO=∞时,A=1,RO=0时可获得201倍的放大倍数。即使电桥电路失去平衡,如从零端注入电 ...…

查看全部问答>

【FPGA问题讨论】用XILINX自带的XST做综合遇到问题

之前是用synplify的,现在改用XST,但是发现UCF文件中的一些语句不知道怎么写,比如用synplify是可以这样写,用XST呢,该怎么改? INST genblk0.FC_GTX_[0].FC2_DUAL LOC = GTX_DUAL_X1Y11;其中FC_GTX是用generate和for产生的blocks。有没有大虾知 ...…

查看全部问答>

什么问题会造成单片机与pc通讯程序死掉

  请问各位大侠,什么问题会造成PC机端的VC串口通讯程序死掉了。 这个程序是用VC编的,同时和多个单片机通讯,波特率是57600。 出现的问题是VC程序无规律地死掉,死后用任务管理器都无法关闭。 详细说明请看我在VC板块发的帖子:http: ...…

查看全部问答>

WINCE编译内核时报错

编译内核NK时报如下错误 BUILD: [01:0000000131:ERRORE] NMAKE :  U1073: don\'t know how to make \'D:\\WINCE500\\public\\COMMON\\OAK\\lib\\x86\\retail\\ehcd.def\' BUILD: [01:0000000133:ERRORE] NMAKE.EXE   -i -c ...…

查看全部问答>

统计一下,需要电机控制板的是低压的多还是高压的多

                                 需要的人,或者准备应用的的人,给参谋一下,我正在测试,因为MOS管,我正在确认用模块(高压的一般都有低电压保护 ...…

查看全部问答>

谁用过MSP430F1232测温度?

谁用过MSP430F1232测温度?我测温度通过串口输出怎都是0,请指教 …

查看全部问答>

DSP6747求助

void ADTEST(){ /* DMA configuration*/ DMAconfig(); GPIO_CLR_DATA45 = 0x00000004;//clear the sync signal SPICONFIG(); SECR = 0x00004000; //clear the recieve event      &nb ...…

查看全部问答>