历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2020年09月02日 | STM32F407学习笔记----GPIO

2020-09-02 来源:eefocus

1、GPIO InitTypeDef    初始化所需要的IO口


typedef struct


{

  uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.指定需要配置的引脚

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



  GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.模式  in/out?

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



  GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.速度2/25/50/100

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



  GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.    引脚输出类型

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



  GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.上拉、下拉、保留、无

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

}GPIO_InitTypeDef;




例如:




GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;





2、GPIO_Init 函数——根据在GPIO_InitStruct中指定的参数初始化GPIOx外设

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;

 

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));

  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));

 

  /* -------------------------Configure the port pins---------------- */

  /*-- GPIO Mode Configuration --*/

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

  {

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

    /* Get the port pins position */

    currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

 

    if (currentpin == pos)

    {

      GPIOx->MODER  &= ~(GPIO_MODER_MODER0 << (pinpos * 2));

      GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));

 

      if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))

      {

        /* Check Speed mode parameters */

        assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

 

        /* Speed mode configuration */

        GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));

        GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));

 

        /* Check Output mode parameters */

        assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));

 

        /* Output mode configuration*/

        GPIOx->OTYPER  &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;

        GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));

      }

 

      /* Pull-up Pull down resistor configuration*/

      GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));

      GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));

    }

  }

}


有点复杂。。。。先贴上再说,慢慢学以后再研究

3、GPIO的register 


typedef struct{

  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */

  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */

  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */

  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */

  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */

  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */

  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */

  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */

  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */

  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */

} GPIO_TypeDef;


例如:

void LEDOn(Led_Def Led)

{

  LED_PORT[Led]->BSRRL=LED_PIN[Led];

}

 

void LEDOff(Led_Def Led)//

{

  LED_PORT[Led]->BSRRH=LED_PIN[Led];  

}


通过结构体的成员控制输出高低电平。


推荐阅读

史海拾趣

DELTA公司的发展小趣事

为了更好地服务全球客户,Delta公司积极推进全球布局战略。公司在全球范围内设立了多个研发中心和生产基地,如中国大陆、中国台湾、美国、泰国、日本、墨西哥、印度、巴西以及欧洲等地。这些研发中心和生产基地不仅为Delta提供了强大的技术支持和生产能力,还使其能够更快速地响应市场需求,提供更贴近客户的服务。

Cedrat Technologies公司的发展小趣事

Cedrat Technologies深知技术创新的重要性,因此一直致力于打造一支跨学科的研发团队。这支团队由材料科学、机械工程、电子工程等多个领域的专家组成,他们共同致力于智能材料机电产品的研发和应用。通过多年的努力,团队在微型纳米定位、阻尼、振动产生等领域取得了显著成果,为公司的快速发展提供了强大的技术支撑。

力芯微(ETEK)公司的发展小趣事

在初创期,力芯微公司专注于DVD、音响、机顶盒及遥控器等传统电子市场的芯片研发及销售。公司凭借对市场的敏锐洞察,与步步高、TCL、Sony、飞利浦、富士康等知名品牌建立了稳固的合作关系。这些合作不仅为公司带来了稳定的收入,也为力芯微积累了与品牌客户合作的宝贵经验。

骏晔科技(DreamLNK)公司的发展小趣事

随着蓝牙技术的普及和市场的快速发展,骏晔科技敏锐地捕捉到了这一趋势。公司投入大量研发资源,成功推出了高性能的CC2340蓝牙模块。这款模块以其出色的性能和稳定性,赢得了市场的广泛认可。同时,骏晔科技还针对IoT远距离通信技术,推出了ChirpLAN™网关套件,进一步巩固了其在蓝牙市场的地位。

BusBoard公司的发展小趣事

一个优秀的企业不仅要有优质的产品和服务,还要有独特的企业文化。BusBoard公司注重企业文化的建设和传承,通过举办各种活动、培训等方式,让员工更好地了解公司的价值观和发展理念。同时,公司还鼓励员工积极参与公司事务、提出建设性意见,让员工成为公司发展的重要力量。这种以人为本的企业文化使得BusBoard公司的员工队伍更加团结、稳定和有活力。

以上五个故事从不同角度展示了BusBoard公司发展起来的相关情况。这些故事不仅反映了公司的成长历程和发展成果,也体现了公司在电子行业中的地位和影响力。随着科技的不断进步和市场需求的不断变化,BusBoard公司将继续保持创新、拓展市场、提升品质、建设文化,为电子行业的发展贡献更多的力量。

Gemmy Electronics Co Ltd公司的发展小趣事
对于采用声波或超声波驱赶机制的电子驱鼠器,故障可能表现为声音异常、无法发出声音或超声波发射效果不佳等。

问答坊 | AI 解惑

485总线稳定性解决方法

485总线稳定性解决方法 一、关于485 总线的几个概念: 1、485 总线的通讯距离可以达到1200 米。 根据485 总线结构理论,在理想环境的前提下,485 总线传输距离可以达到1200 米。其条件是通讯线材优质达标,波特率为9600,只负载一台485 设备,才 ...…

查看全部问答>

手机编程读取sim卡的问题

高手们,想问一下手机上可否编程实现sim的读写? 还有如果可以的话,控制操作sim卡的一些接口函数都是怎么样子的?    万分感谢?…

查看全部问答>

WINCE资源文件的疑问

安装PLATFORM BUILDER后,在WINCE500下面的资源文件比如:NETUI.RC都是英文的资源文件,却找不到中文的。请问中文的资源文件在哪?我想改变一些中文对话框的属性,改英文的有效吗?…

查看全部问答>

CE test kit6.0 中关于wifi的测试项

d大家好,我现在的问题关于cetk新增的wifi test中one wlan card test的, 安装文档所述进行测试,但是在第一个case就fail了,问题是连接不上ap, 04bb0ff2: ndt_1c_wlan Msg: Variation 1: Testing Association with ssid NDTEST_WEP_AP1 04bb0f ...…

查看全部问答>

HT1380 用法拉电容供电问题

HT1380时钟芯片,市电正常时使用5V供电,市电断电时用纽扣电池供电,现在想把法拉电容替换纽扣电池,请提供电路。…

查看全部问答>

求天线匹配网络,怎样才能是功率衰减得最少...

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 求拉杠天线匹配网络,拉杠天线长约一米,直径70mm左右......  …

查看全部问答>

【TI建议】论坛是否可以出本关于Stellaris 的书了

      最近想接触一下Stellaris ,正好在汇总论坛的帖子,顺便看看以前的帖子,学习了很多。       突然想到以前学习一款单片机的时候,第一件事都是找这个单片机的书。然后我去各个网上商店, ...…

查看全部问答>

[上海浦东] 无线射频产品(Zigbee方向)技术支持

本帖最后由 Miss900 于 2014-7-16 17:30 编辑 职位描述: -对亚洲地区客户在线提供产品技术支持(英语邮件,论坛) -对客户信息及解决方案做相应记录 -在处理客户技术问题的同时创建Qlead并且达到Qlead输入量和合格率的指标. -为整个项目组, ...…

查看全部问答>