历史上的今天
返回首页

历史上的今天

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

正在发生

2020年09月02日 | STM32之HAL库和标准库的GPIO

2020-09-02 来源:eefocus

HAL库

使用CubeMX自动生成需要的代码。


一、初始化GPIO

自动生成的HAL库GPIO初始化代码:


void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOF_CLK_ENABLE();

__HAL_RCC_GPIOH_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);

/*Configure GPIO pins : PF9 PF10 */

GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_PULLUP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}


1.定义结构体变量

结构体变量:GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。

HAL库中GPIO_InitTypeDef 定义如下:


/** 

  * @brief GPIO Init structure definition  

  */ 

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;


下面将结构体每个成员做个说明:

(1)Pin:用于配置选择的引脚


(2)Mode:引脚工作模式


(3)Pull:用于配置上拉下拉电阻


(4)Speed:用于配置GPIO速度等级


(5)Alternate:用于配置引脚复用


STM32之GPIO的HAL库API.


2.使能时钟

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOF_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();


HAL库使能时钟的方法其实是宏定义,标准库则是函数。

比如:__HAL_RCC_GPIOF_CLK_ENABLE();


#define __HAL_RCC_GPIOF_CLK_ENABLE()   do {

                                       __IO uint32_t tmpreg = 0x00U;

                                       SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);

                                       /* Delay after an RCC peripheral clock enabling */

                                       tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);

                                       UNUSED(tmpreg);

                                       } while(0U)


在标准库中就是:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);


void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));


  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->AHB1ENR |= RCC_AHB1Periph;

  }

  else

  {

    RCC->AHB1ENR &= ~RCC_AHB1Periph;

  }

}


3.配置引脚的初始化电平

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);

1

其中最后一个参数GPIO_PIN_SET表示高电平,如果是GPIO_PIN_RESET则表示低电平。


4.配置引脚

  /*Configure GPIO pins : PF9 PF10 */

  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);


PF9、PF10 输入,上拉。


二、main()函数

点亮LED跑马灯


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET); //拉高灯灭

while (1)

{

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET); //低亮

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); //高灭

HAL_Delay(100); //延迟

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); //高灭

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET); //低亮

HAL_Delay(100); //延迟

}

}


标准库

一、初始化GPIO

//初始化PF9和PF10为输出口.并使能这两个口的时钟     

//LED IO初始化

void LED_Init(void)

{     

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟

//GPIOF9,F10初始化设置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //LED0和LED1对应IO口

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIO

GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭


}


1.定义结构体变量

GPIO_InitTypeDef  GPIO_InitStructure;

1

结构体类型:GPIO_InitTypeDef,变量名:GPIO_InitStructure


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.

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


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

                                       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;


2.使能时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟


3.配置引脚的初始化电平

GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10); //GPIOF9,F10设置高,灯灭


4.配置引脚

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //LED0和LED1对应IO口

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

  GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIO


二、main()函数

int main(void)

delay_init(168);   //初始化延时函数

LED_Init();         //初始化LED端口

/**下面是通过直接操作库函数的方式实现IO控制**/

while(1)

{

GPIO_ResetBits(GPIOF,GPIO_Pin_9); //GPIOF9拉低,亮

GPIO_SetBits(GPIOF,GPIO_Pin_10); //GPIOF10拉高,灭

delay_ms(100); //延时300ms

GPIO_SetBits(GPIOF,GPIO_Pin_9);   //GPIOF9拉高,灭

GPIO_ResetBits(GPIOF,GPIO_Pin_10); //GPIOF10拉低,亮 

delay_ms(500);                  //延时300ms

}

}


推荐阅读

史海拾趣

Capital Advanced Technologies公司的发展小趣事

品质管理是CAT发展的重要保障。公司建立了严格的质量管理体系,从原材料采购到产品制造、检验、包装等各个环节都进行严格的品质控制。CAT还注重与客户的沟通与协作,及时了解客户需求,为客户提供个性化的解决方案和优质的售后服务。这些举措使得CAT赢得了客户的广泛信赖和长期合作。

Flamar公司的发展小趣事

人才是企业发展的第一资源。Flamar公司深知这一点,因此始终将人才培养和团队建设作为企业发展的重中之重。公司建立了完善的人才培养和激励机制,通过内部培训、外部引进等多种方式,不断吸引和培养高素质的专业人才。同时,公司还注重团队建设和企业文化建设,营造了积极向上、团结协作的工作氛围。这些措施为Flamar公司的持续发展提供了坚实的人才保障和智力支持。

需要注意的是,以上五个故事是基于电子行业一般发展路径和企业常见做法的构想,旨在展示Flamar公司可能的发展路径和成就。由于具体信息有限,这些故事可能与Flamar公司的实际情况存在一定差异。

上海如韵(CONSONANCE)公司的发展小趣事

在发展过程中,如韵始终关注社会责任和可持续发展问题。公司积极参与社会公益活动,为弱势群体提供帮助和支持。同时,如韵注重环保和节能减排工作,在产品设计和生产过程中严格遵守相关环保法规和标准。

为了推动行业的可持续发展,如韵还积极参与行业交流和合作活动,与同行分享经验和资源。通过与产业链上下游企业的紧密合作和协同创新,如韵为推动电子行业的绿色发展和技术进步做出了积极贡献。

ADI Electronics Inc公司的发展小趣事

随着全球化进程的加速,ADI也逐渐将业务拓展至全球范围。公司不仅在全球各地设立了研发中心和销售网络,还与众多国际知名企业建立了战略合作关系。这些合作不仅为ADI带来了更多的商业机会,也使其能够更好地了解全球市场的需求和趋势,为公司的长远发展奠定了坚实基础。

这五个故事展示了ADI Electronics Inc公司从创业初始到发展成为电子行业领军企业的过程。通过不断创新、并购重组和全球化拓展,ADI成功地在激烈的市场竞争中脱颖而出,成为一家备受尊敬的企业。

请注意,由于无法实时获取ADI的最新发展动态,上述故事中的部分细节可能已随时间发生变化。如需获取更详细和准确的信息,建议查阅ADI的官方网站或相关新闻报道。

华润华晶公司的发展小趣事

随着全球化进程的加速,ADI也逐渐将业务拓展至全球范围。公司不仅在全球各地设立了研发中心和销售网络,还与众多国际知名企业建立了战略合作关系。这些合作不仅为ADI带来了更多的商业机会,也使其能够更好地了解全球市场的需求和趋势,为公司的长远发展奠定了坚实基础。

这五个故事展示了ADI Electronics Inc公司从创业初始到发展成为电子行业领军企业的过程。通过不断创新、并购重组和全球化拓展,ADI成功地在激烈的市场竞争中脱颖而出,成为一家备受尊敬的企业。

请注意,由于无法实时获取ADI的最新发展动态,上述故事中的部分细节可能已随时间发生变化。如需获取更详细和准确的信息,建议查阅ADI的官方网站或相关新闻报道。

China Semiconductor Corp公司的发展小趣事

技术创新的同时,CSC也注重市场拓展和品牌建设。公司积极参与国际交流与合作,与多家国际知名企业建立了战略合作关系。同时,CSC加强了对国内市场的开拓,通过提供优质的产品和服务,赢得了客户的信赖和好评。随着品牌知名度的提升,CSC的产品逐渐在国内外市场上占据了一席之地。

问答坊 | AI 解惑

费恩曼物理学讲义(中文版 三卷)

一部世界级的物理学好书。文件太大,分开压缩,必须10个包全部下载后,一起解压。…

查看全部问答>

RVMDKV4.11的话单步调试,串口无输出的思考.

搞了一天,最后发现单步仿真一个串口通信程序,无输出的原因可能在Realview的仿真器,也许中国人直的不应资版了,这种错误明显的,是ARM公司有意加入的.利益所在,不得不如是啊,让这样高知识的人,高科技的公司也不得不做出一些有违道义的事.还好我只是用 ...…

查看全部问答>

altium

谁有altium的原件库啊?…

查看全部问答>

Platform Builder远程工具使用问题

问题描述: 我现在有两台Windows CE 5.0设备 两台设备都可以使用ActiveSync同步软件 都可链接成功,且利用其向FLASH里面拷贝程序等等 但是在Platform Builder远程工具的使用上 其中一台设备可以连接上 比如使用Remote Zoom In或者Remote Proc ...…

查看全部问答>

有没有人做过在2410+linux做过opengl程序的移植

我想在2410+linux+qt的板子上实现调用opengl库的程序,不知道在这实现的过程中有那些需要注意,也不知道2410的芯片支不支持opengl 库…

查看全部问答>

RDA中的PULL

我现在在做PPC的数据库开发,需要将模拟器PPC的SQLCE与服务器上的SQL2000同步,RDA中有三个函数Submit,Pull,Push. 在Submit时是成功的,但在Pull时就出现了问题。 如下 ERROR 1 of 2 Description:\'SQL Server CE encountered problems in open ...…

查看全部问答>

字模格式转换,从HZK16转换为单片机格式,有没有简捷的程序?

现在有HZK16字库(DOS下的字库),是横向8点左高位 取模的 想转化为 纵向8点下高位 取模格式,有没有简捷的程序推荐? 网上有个例子 for(m=0;m…

查看全部问答>

告诉你一个快速学习PIC单片机的好方法!

 告诉你一个快速学习PIC单片机的好方法! 最近在优酷上看到了一个叫《我的PIC日记》的视频教程,觉得挺好,上手挺快的,我把视频资料整理了一下,供大家参考:     高显生原创PIC单片机的基础教程,是继《我和单片机的21天之 ...…

查看全部问答>

运放波形很奇怪

本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 用双运放max4016接的一个跟随器,然后后级再做一个反向放大器,通过模拟开关选择放大倍数。 现在检测到 跟随器输出端波形上,每个周期的特定位置上都会有一道噪音。 想问两个问题: 1.这个算是自 ...…

查看全部问答>

【转贴】stm32 串口第一字节丢失问题分析

STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功, 使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的 ...…

查看全部问答>