利用定时器4中断处理功能,实现每隔2s,读取实现将温湿度传感器的值上传到串口小助手
时间: 2024-03-14 20:48:28 浏览: 14
以下是一个利用定时器4中断处理功能实现每隔2s读取温湿度传感器并上传到串口小助手的示例代码:
```
#include <stm32f4xx.h>
#include <stdio.h>
#define DHT11_PORT GPIOB
#define DHT11_PIN GPIO_Pin_12
USART_InitTypeDef USART_InitStructure;
void TIM4_IRQHandler(void)
{
static uint32_t count = 0;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
count++;
if (count == 1000) //2s
{
count = 0;
float temperature = 0, humidity = 0;
if (DHT11_Read_Temperature_Humidity(&temperature, &humidity) == 0)
{
char buffer[100];
sprintf(buffer, "Temperature:%.1f Humidity:%.1f\r\n", temperature, humidity);
USART_SendString(USART1, buffer);
}
}
}
}
void USART_SendString(USART_TypeDef* USARTx, char* str)
{
while (*str)
{
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, *str++);
}
}
void USART_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void GPIO_Configuration(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; //计数器周期为1000
TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; //预分频器为8400,计数器时钟为10KHz
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
int main(void)
{
USART_Configuration();
GPIO_Configuration();
TIM_Configuration();
while (1);
return 0;
}
```
在这个例子中,我们使用定时器4和中断处理函数来实现了每隔2s读取温湿度传感器并上传到串口小助手的功能。我们首先在中断处理函数中增加了一个count计数器,每次计数到1000时,即2s时,我们读取温湿度传感器的值并上传到串口小助手。在USART_SendString函数中,我们使用了USART1串口,可以根据实际情况修改。在GPIO_Configuration函数中,我们初始化了DHT11引脚为输出模式,并将其输出高电平。在TIM_Configuration函数中,我们设置计数器时钟和计数器周期,并使能了中断和计数器。