#define LED0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)
时间: 2023-12-19 13:05:37 浏览: 94
这段代码是用来使能LED0所在的GPIO端口时钟的宏定义。使用__HAL_RCC_GPIOB_CLK_ENABLE()函数可以使能GPIOB的时钟,从而可以控制LED0所在的引脚。宏定义中使用了do-while(0)结构,这是为了避免宏定义被误用时出现意外的错误,详细解释可以参考这篇文章:https://www.cnblogs.com/alantu2018/p/8456485.html
相关问题
#include "dht11.h" #define DHT11_GPIO_PORT GPIOB #define DHT11_GPIO_PIN GPIO_PIN_8 static void DHT11_DelayUs(uint32_t us) { __HAL_TIM_SET_COUNTER(&htim1, 0); while (__HAL_TIM_GET_COUNTER(&htim1) < us); } static uint8_t DHT11_ReadBit(void) { uint8_t retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } return GPIO_PIN_SET; } uint8_t DHT11_ReadData(DHT11_Data_TypeDef *data) { uint8_t buffer[5] = {0}; uint8_t i, j; /* 发送起始信号 */ HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); DHT11_DelayUs(18000); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); DHT11_DelayUs(40); /* 等待应答信号 */ if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET); for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { if (DHT11_ReadBit() == DHT11_TIMEOUT) { return DHT11_TIMEOUT; } DHT11_DelayUs(30); if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { buffer[i] |= (1 << (7 - j)); } } } if ((buffer[0] + buffer[1] + buffer[2] + buffer[3]) == buffer[4]) { data->Humidity = buffer[0]; data->Temperature = buffer[2]; return DHT11_OK; } else { return DHT11_ERROR; } } return DHT11_TIMEOUT; } void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 使能GPIOB时钟 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* 配置GPIOB8引脚为输入模式 */ GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); }
这是一个用于读取DHT11温湿度传感器数据的函数库,包含了初始化函数DHT11_Init()和读取数据函数DHT11_ReadData(),以及一些辅助函数。在读取数据时,函数会发送起始信号,等待应答信号,然后读取40位数据,计算校验和并返回温湿度数据。该函数库需要在使用之前调用DHT11_Init()函数进行初始化。
STM32单片机使用GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15这八个引脚对拨码开关程序用HAL库写
好的,以下是使用HAL库编写的拨码开关程序:
```c
#include "main.h"
#include "stm32f1xx_hal.h"
/* 定义GPIO引脚 */
#define SW1_Pin GPIO_PIN_0
#define SW2_Pin GPIO_PIN_1
#define SW3_Pin GPIO_PIN_5
#define SW4_Pin GPIO_PIN_6
#define SW5_Pin GPIO_PIN_7
#define SW6_Pin GPIO_PIN_13
#define SW7_Pin GPIO_PIN_14
#define SW8_Pin GPIO_PIN_15
/* 定义GPIO端口 */
#define SW1_GPIO_Port GPIOA
#define SW2_GPIO_Port GPIOA
#define SW3_GPIO_Port GPIOA
#define SW4_GPIO_Port GPIOA
#define SW5_GPIO_Port GPIOA
#define SW6_GPIO_Port GPIOB
#define SW7_GPIO_Port GPIOB
#define SW8_GPIO_Port GPIOB
/* 定义拨码开关读取函数 */
uint8_t Read_Dip_Switch(void)
{
uint8_t dip_switch_value = 0;
/* 读取GPIO引脚状态 */
if(HAL_GPIO_ReadPin(SW1_GPIO_Port, SW1_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x01;
}
if(HAL_GPIO_ReadPin(SW2_GPIO_Port, SW2_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x02;
}
if(HAL_GPIO_ReadPin(SW3_GPIO_Port, SW3_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x04;
}
if(HAL_GPIO_ReadPin(SW4_GPIO_Port, SW4_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x08;
}
if(HAL_GPIO_ReadPin(SW5_GPIO_Port, SW5_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x10;
}
if(HAL_GPIO_ReadPin(SW6_GPIO_Port, SW6_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x20;
}
if(HAL_GPIO_ReadPin(SW7_GPIO_Port, SW7_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x40;
}
if(HAL_GPIO_ReadPin(SW8_GPIO_Port, SW8_Pin) == GPIO_PIN_SET)
{
dip_switch_value |= 0x80;
}
return dip_switch_value; /* 返回读取的拨码开关值 */
}
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
__HAL_RCC_GPIOB_CLK_ENABLE(); /* 使能GPIOB时钟 */
while(1)
{
uint8_t dip_switch_value = Read_Dip_Switch(); /* 读取拨码开关值 */
/* 在这里可以根据拨码开关的值执行相应的操作 */
}
}
```
在上述代码中,我们先定义了8个GPIO引脚和对应的GPIO端口,这里使用了STM32 HAL库中的宏定义。然后我们编写了一个名为`Read_Dip_Switch`的函数,用于读取8个拨码开关的值,并将拨码开关值以一个字节的形式返回。
在`main`函数中,我们通过循环不断读取拨码开关的值,并可以根据拨码开关的值执行相应的操作。需要注意的是,在使用GPIO之前,需要先使能对应GPIO端口的时钟。
阅读全文