历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2020年12月16日 | STM32F7xx —— 输出

2020-12-16 来源:eefocus

一、几个重要的IO口操作函数

HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);  // GPIO初始化

 

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); // 输出高低电平

 

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 读IO口电平

 

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 电平取反

 


二、几个重要的结构

// GPIO口  GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,GPIOH,GPIOI

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 uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */

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

// GPIO引脚,模式,上下拉,速度,复用等

typedef struct

{

  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.

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

 

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.

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

 

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.

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

 

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.

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

 

  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins. 

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

}GPIO_InitTypeDef;

// GPIO引脚

#define GPIO_PIN_0                 ((uint16_t)0x0001U)  /* Pin 0 selected    */

#define GPIO_PIN_1                 ((uint16_t)0x0002U)  /* Pin 1 selected    */

#define GPIO_PIN_2                 ((uint16_t)0x0004U)  /* Pin 2 selected    */

#define GPIO_PIN_3                 ((uint16_t)0x0008U)  /* Pin 3 selected    */

#define GPIO_PIN_4                 ((uint16_t)0x0010U)  /* Pin 4 selected    */

#define GPIO_PIN_5                 ((uint16_t)0x0020U)  /* Pin 5 selected    */

#define GPIO_PIN_6                 ((uint16_t)0x0040U)  /* Pin 6 selected    */

#define GPIO_PIN_7                 ((uint16_t)0x0080U)  /* Pin 7 selected    */

#define GPIO_PIN_8                 ((uint16_t)0x0100U)  /* Pin 8 selected    */

#define GPIO_PIN_9                 ((uint16_t)0x0200U)  /* Pin 9 selected    */

#define GPIO_PIN_10                ((uint16_t)0x0400U)  /* Pin 10 selected   */

#define GPIO_PIN_11                ((uint16_t)0x0800U)  /* Pin 11 selected   */

#define GPIO_PIN_12                ((uint16_t)0x1000U)  /* Pin 12 selected   */

#define GPIO_PIN_13                ((uint16_t)0x2000U)  /* Pin 13 selected   */

#define GPIO_PIN_14                ((uint16_t)0x4000U)  /* Pin 14 selected   */

#define GPIO_PIN_15                ((uint16_t)0x8000U)  /* Pin 15 selected   */

// GPIO模式  输入 推挽输出 开漏输出 推挽复用 开漏复用

#define  GPIO_MODE_INPUT                        ((uint32_t)0x00000000U)   /*!< Input Floating Mode                   */

#define  GPIO_MODE_OUTPUT_PP                    ((uint32_t)0x00000001U)   /*!< Output Push Pull Mode                 */

#define  GPIO_MODE_OUTPUT_OD                    ((uint32_t)0x00000011U)   /*!< Output Open Drain Mode                */

#define  GPIO_MODE_AF_PP                        ((uint32_t)0x00000002U)   /*!< Alternate Function Push Pull Mode     */

#define  GPIO_MODE_AF_OD                        ((uint32_t)0x00000012U)   /*!< Alternate Function Open Drain Mode    */

// GPIO速度 低速  中速  高速  极速

#define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!< Low speed     */

#define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!< Medium speed  */

#define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!< Fast speed    */

#define  GPIO_SPEED_FREQ_VERY_HIGH   ((uint32_t)0x00000003U)  /*!< High speed    */

// GPIO上下拉 无上下拉  上拉  下拉

#define  GPIO_NOPULL        ((uint32_t)0x00000000U)   /*!< No Pull-up or Pull-down activation  */

#define  GPIO_PULLUP        ((uint32_t)0x00000001U)   /*!< Pull-up activation                  */

#define  GPIO_PULLDOWN      ((uint32_t)0x00000002U)   /*!< Pull-down activation                */

// GPIO引脚高低电平

typedef enum

{

  GPIO_PIN_RESET = 0,

  GPIO_PIN_SET

}GPIO_PinState;

三、封装两个GPIO初始化函数(普通GPIO,复用GPIO)

// 这里只贴出代码片段,封装两个接口,一个普通GPIO初始化,一个带复用功能。

#define GPIO_CLK_ENABLE() do{

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOE_CLK_ENABLE();

  __HAL_RCC_GPIOF_CLK_ENABLE();

  __HAL_RCC_GPIOG_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOI_CLK_ENABLE();

} while(0);

 

void GPIOConfig(GPIO_TypeDef *gpio, uint32_t pin, uint32_t mode, uint32_t pull)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  GPIO_CLK_ENABLE();

 

  GPIO_InitStructure.Pin = pin;

  GPIO_InitStructure.Mode = mode;

  GPIO_InitStructure.Pull = pull;

  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

 

  HAL_GPIO_Init(gpio, &GPIO_InitStructure);

}

 

void GPIOConfigExt(GPIO_TypeDef *gpio, uint32_t pin, uint32_t mode, uint32_t pull, uint32_t alternate)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  GPIO_CLK_ENABLE();

 

  GPIO_InitStructure.Pin = pin;

  GPIO_InitStructure.Mode = mode;

  GPIO_InitStructure.Pull = pull;

  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

  GPIO_InitStructure.Alternate = alternate;

 

  HAL_GPIO_Init(gpio, &GPIO_InitStructure);

}

四、输出接口设计

为了灵活使用,我们将输出的有效电平设置成可配置。


// 配置的有效电平 初始  低电平有效  高电平有效

typedef enum

{

  OUTPUT_INIT_IS_ACTIVE = 0,

  OUTPUT_LOW_IS_ACTIVE  = 1,

  OUTPUT_HIGH_IS_ACTIVE = 2,

} output_active_t;

#define OUTX_CONFIG(gpio, pin)    GPIOConfig(gpio, pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL)

#define OUTX_READ(gpio, pin)      HAL_GPIO_ReadPin(gpio, pin)

#define OUTX_ACTIVE(gpio, pin, tag) do{

  if(OUTPUT_LOW_IS_ACTIVE == tag)

  {

    HAL_GPIO_WritePin(gpio, pin, GPIO_PIN_RESET);

  }

  else

  {

    HAL_GPIO_WritePin(gpio, pin, GPIO_PIN_SET);

  }

} while(0);

#define OUTX_NEGATIVE(gpio, pin, tag) do{

  if(OUTPUT_LOW_IS_ACTIVE == tag)

  {

    HAL_GPIO_WritePin(gpio, pin, GPIO_PIN_SET);

  }

  else

  {

    HAL_GPIO_WritePin(gpio, pin, GPIO_PIN_RESET);

  }

} while(0);

#define OUT1_PORT                 GPIOA

#define OUT1_PIN                  GPIO_PIN_0

推荐阅读

史海拾趣

Helium公司的发展小趣事

为了进一步提升网络性能和用户体验,Helium团队自主编译并开源了LongFi协议。这一协议能够将物联网主流LoRaWAN无线协议应用到Helium区块链应用层,实现了物联网与区块链的深度融合。LongFi协议的推出不仅提高了数据传输的效率和稳定性,还降低了物联网设备的能耗和成本。这一技术创新为Helium赢得了更多用户和合作伙伴的信任和支持,推动了其业务的持续发展。

ETL semiconductor公司的发展小趣事

1958年,德州仪器(TI)的工程师杰克·基尔比面临一个挑战:如何将复杂的晶体管布线简化。他通过不懈努力,发现了一种将多个晶体管内置在同一块硅或锗板中的方法,从而大大简化了电路设计。这一创新为集成电路的发展奠定了重要基础,也奠定了德州仪器在半导体行业的领先地位。

EVERLIGHT公司的发展小趣事

在电子产品领域,品质是企业生存和发展的关键。EVERLIGHT一直将品质管理放在首位,建立了严格的质量控制体系。公司从原材料采购到生产过程,再到产品出厂,都进行严格的品质检测和监控,确保每一颗LED都符合高标准的质量要求。这种对品质的坚持让EVERLIGHT在市场上赢得了良好的口碑,也为企业赢得了更多客户的信任。

CEVA, Inc公司的发展小趣事

随着万物互联时代的到来,CEVA公司迎来了新的发展机遇。Wi-Fi 6、Wi-Fi 7、5G-Advanced和蜂窝式物联网等技术的快速发展,推动了客户对新建置芯片和解决方案的需求。CEVA凭借其在无线连接和智能传感技术领域的领先地位,能够为客户提供全面的解决方案,满足这些技术在多个终端市场带来的巨大商机。同时,CEVA也是唯一能够提供蓝牙加上Wi-Fi或UWB加上蓝牙等组合解决方案的授权许可商,这一优势使得CEVA在全球半导体产业中占据了重要地位。

以上是基于公开资料对CEVA, Inc.在电子行业中的几个重要发展节点的概述。这些故事展示了CEVA如何在技术创新、市场布局和应对挑战等方面取得了显著成就,为公司的持续发展奠定了坚实基础。然而,由于电子行业的快速发展和不断变化的市场环境,CEVA的未来仍充满挑战和机遇。

台湾美丽微(FMS)公司的发展小趣事

随着技术的不断发展,FTDI并未满足于现状,而是不断拓展其产品线。公司推出了MM232R和USB-COM232-PLUS1等接口产品,这些产品在连接性和兼容性上展现了FTDI的创新精神。同时,FTDI还涉足USB和其他通信协议的转换领域,满足了市场对多样化通信解决方案的需求。这一系列的技术创新和产品拓展,使得FTDI在电子行业中的影响力逐渐增强。

ESPROS [Espros Photonics corp]公司的发展小趣事

ESPROS的ToF传感器技术已成功应用于多个领域,包括无人机飞行避障及定高、人机交互和手势识别、机器人定位和智能导航、人体检测和物体探测、工业自动化以及汽车自动驾驶等。这些应用不仅展示了ESPROS技术的广泛适用性,也证明了其在光电传感器领域的强大实力。

问答坊 | AI 解惑

DCR022405P的技术参数

DCR022405P的技术参数 产品型号:DCR022405P 输出电压最小值(V):4.900 输出电压最大值(V):5.100 容限(%):2 输出电流(mA):400 输入电压最小值(V):21.600 输入电压最大值(V):26.400 效率典型值(%):- 静态电流典型值(mA):15 开关频率最大值( ...…

查看全部问答>

如何在WM5系统中实现窗口隐藏?

采用wm5.0 sdk开发wm5的程序,开发环境为visual studio.net 2005,如果采用单文档编写的界面,则程序运行时点击窗口右上角的关闭按钮,则窗口隐藏,然后通过其他任务管理软件可以重新激活重新激活该窗口,但是果果采用的是对话框编写的界面,则程序 ...…

查看全部问答>

编译提示 找不到 pkfuncs.h 文件

谁有此文件,能传给我一个么? 据说这个文件在 platform builder里有,一般的sdk里不包含, 可是连platform builder的下载都很难找 请发到 yuedong_2008@hotmail.com 谢谢 …

查看全部问答>

信息产业部—硬件设计工程师培训火爆报名中!!!!!

全国硬件工程师实训基地系信息产业部电子教育与考试中心指定的硬件工程师独家教育机构,有着多年的IT业培训经验,与诸多IT企业有着密切联系,经过两年多的精心策划特推出PCB设计工程师,单片机设计工程师,嵌入式系统工程师职业培训,详情请百度搜索\" ...…

查看全部问答>

Fitel/Furukawa Fusion Splicer (S 183PM)

我想问我能去哪里买到以下的产品? a)MSK 4200, 75 Volt 5A H Bridge PWM Motor Driver/Amplifier MSK ( M.S. Kennedy Corp) 100 pcs b)MSK 4203, 75 Volt 10A H Bridge PWM Motor Driver/Amplifier MSK ( M.S. Kennedy Corp) 100 pcs c)Fitel/ ...…

查看全部问答>

请问中断处理过程中 中断被禁止多久

中断的过程是这样的吧: 硬件设备发生中断时,ISR会禁止同级和低级中断,然后根据IRQ返回关联的SysIntr,内核根据ISR返回的SysIntr唤醒相应的IST(SysIntr与IST创建的Event关联),IST处理中断之后调用InterruptDone解除中断禁止。 那是不是说在 ...…

查看全部问答>

STM32管脚复用问题

                                 以前没有过多注意,只是根据库来配置io的,发现一个问题手册上没有明确的说明,就是一个管脚除了主功能外,部分还 ...…

查看全部问答>

汽车打铁不良故障的诊断

在汽车上采用将蓄电池负极与车身的金属部分相连接,因此汽车上的负极导线通常称为搭铁线。搭铁线在汽车电路中起着重要的作用,因此搭铁状态的好坏是汽车电器工作好坏的关键。在修理工作中,查找搭铁不良故障,一般都要耗费大量的时间诊断。本文介绍 ...…

查看全部问答>

从51到ARM. 32位嵌入式系统入门

祝大家好运,学习愉快!…

查看全部问答>