历史上的今天
今天是: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
}
}
上一篇:STM32之GPIO学习笔记
史海拾趣
|
搞了一天,最后发现单步仿真一个串口通信程序,无输出的原因可能在Realview的仿真器,也许中国人直的不应资版了,这种错误明显的,是ARM公司有意加入的.利益所在,不得不如是啊,让这样高知识的人,高科技的公司也不得不做出一些有违道义的事.还好我只是用 ...… 查看全部问答> |
|
问题描述: 我现在有两台Windows CE 5.0设备 两台设备都可以使用ActiveSync同步软件 都可链接成功,且利用其向FLASH里面拷贝程序等等 但是在Platform Builder远程工具的使用上 其中一台设备可以连接上 比如使用Remote Zoom In或者Remote Proc ...… 查看全部问答> |
|
有没有人做过在2410+linux做过opengl程序的移植 我想在2410+linux+qt的板子上实现调用opengl库的程序,不知道在这实现的过程中有那些需要注意,也不知道2410的芯片支不支持opengl 库… 查看全部问答> |
|
字模格式转换,从HZK16转换为单片机格式,有没有简捷的程序? 现在有HZK16字库(DOS下的字库),是横向8点左高位 取模的 想转化为 纵向8点下高位 取模格式,有没有简捷的程序推荐? 网上有个例子 for(m=0;m… 查看全部问答> |
|
告诉你一个快速学习PIC单片机的好方法! 最近在优酷上看到了一个叫《我的PIC日记》的视频教程,觉得挺好,上手挺快的,我把视频资料整理了一下,供大家参考: 高显生原创PIC单片机的基础教程,是继《我和单片机的21天之 ...… 查看全部问答> |
|
STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功, 使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的 ...… 查看全部问答> |




