历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2021年09月10日 | STM32入门篇之DHT11温湿度传感器

2021-09-10 来源:eefocus

前言

一、项目介绍

本项目作为入门STM32的入门项目,也是我初次接触STM系列的单片机,在此记录一下。


1.1 项目名称

名称:基于STM32的室内温湿度检测


1.2 项目设计思路

思路:本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板进行项目开发,选用的传感器为常见通用的DHT11温湿度传感器。传感器将采集到的数据传输到STM32(MCU)主控进行数据处理,最后通过串口打印出来。


二、硬件准备

2.1 STM32F407ZGT6

购买链接:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-22466574672.18.4cc84163K894AJ&id=565218048000

在这里插入图片描述

2.4 DHT11温湿度传感器


购买链接如下:https://detail.tmall.com/item.htm?id=15598344236

在这里插入图片描述

三、软件准备

全部资料的下载链接:https://pan.baidu.com/s/1p0LfRRw54vqTtx1yKDsQwA

密码为:f22d

注:里面包括了keil5安装的步骤与开发环境搭建


3.1 Keil5

官方下载链接如下:http://www.keil.com/demo/eval/arm.htm


3.2 STM32f407固件库

官方下载链接如下:http://www.keil.com/dd2/pack


3.3 STM32CudeMx

官方下载链接如下:http://www.st.com/web/en/catalog/tools/PF259242


3.4 STM32CudeMx的f407软件包

官方下载链接如下:http://www.st.com/web/en/catalog/tools/PF259243


四、项目实施

4.1 硬件平台开发

4.1.1 keil5安装

请按照本人共享的链接里面的开发环境文件夹里面word文档进行操作,提取文件密码为:f22d


4.1.2 STM32CudeMx安装

(https://pan.baidu.com/s/1p0LfRRw54vqTtx1yKDsQwA)里面的STM32CudeMX文件夹里面word文档进行操作,提取文件密码为:f22d


4.1.3 BSP工程项目创建

①打开STM32CudeMX

在这里插入图片描述

②点击创建工程

在这里插入图片描述

③搜索STM32F407ZGT6,双击黄色区域

在这里插入图片描述

④点击Categories——》System Core ——》GPIO,选择PF9和PF10,各自点击为GPIO_OutPut

在这里插入图片描述

⑤对GPIO进行具体配置

在这里插入图片描述

⑥配置RCC时钟

在这里插入图片描述

⑦配置系统时钟

在这里插入图片描述

⑧这里以串口1为例 我们可以选择串口的模式(异步,同步,半双工) 串口接收中断


a)点击USATR1

b)设置MODE为异步通信(Asynchronous)

c)基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能

d)GPIO引脚设置 USART1_RX/USART_TX

e) NVIC Settings 一栏使能接收中断在这里插入图片描述

在这里插入图片描述

⑨配置STM32F407ZGT6的时钟树,由于是外部8M的晶振,所以得出一下的时钟树


a)选择外部时钟HSE 8MHz

b)PLL锁相环倍频168倍

c)系统时钟来源选择为PLL

d)设置APB1分频器为 /4


32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

在这里插入图片描述

⑩建立工程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.1.4 BSP工程项目开发

(1)用keil5打开此工程

在这里插入图片描述

(2)点击option(锤子),然后进行主频配置,修改为8.0或者12.0,然后重新打开该工程进行检查,最后进行编译。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)在keil5上面创建SYSTEM和HARDWAVE两个文件夹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)回到本人创建的test工程目录,添加这两个文件夹,本人已经整理好了链接(STM32课程资料库文件),复制库文件里面SYSTEM和HARDWAVE两个文件夹到test工程目录下。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

(5)回到keil5里面,继续点击那个文件管理,然后根据对应的文件夹添加文件,一个都不要漏。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注:HARDWAVE也是这样添加工程文件进去。

在这里插入图片描述


(6)配置头文件路径,选择为第4步已经复制的两个文件夹(SYSTEM和HARDWAVE)

在这里插入图片描述

完成图如下:

在这里插入图片描述

(7)编程开发

main.c


#include "main.h"

#include "usart.h"

#include "gpio.h"

#include "stdio.h"

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "dht11.h"



void SystemClock_Config(void);


int main(void)

{

  u8 t=0;      

u8 temperature;      

u8 humidity; 

  int times;

  HAL_Init();

 

  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

delay_init(168);                           

  SystemClock_Config();

DHT11_Init();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE);

  while (1)

  {

if(t%10==0)//?100ms????

{          

DHT11_Read_Data(&temperature,&humidity);

printf("2018A14122 WuXiaoXianrn");

printf("Tem:%drn",temperature);

printf("Hum:%drn",humidity);

printf("rnn");

}    

delay_ms(100);

t++;  

}

}

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  /** Configure the main internal regulator output voltage

  */

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 4;

  RCC_OscInitStruct.PLL.PLLN = 168;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

  RCC_OscInitStruct.PLL.PLLQ = 4; 

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)

  {

    Error_Handler();

  }

}


void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}


#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


uart.c


#include "usart.h"

#include "stdio.h"


/* USER CODE BEGIN 0 */

uint8_t USART_RX_BUF[USART_REC_LEN];

uint16_t USART_RX_STA=0; //??????

uint8_t aRxBuffer[RXBUFFERSIZE];//HAL??????????



/* USER CODE END 0 */


UART_HandleTypeDef huart1;


/* USART1 init function */

int fputc(int ch, FILE *f)

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch, 1, 0XFFFF);

  return ch;


}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance==USART1)//?????1

{

if((USART_RX_STA&0x8000)==0)//?????

{

if(USART_RX_STA&0x4000)   //????0x0d

{

if(aRxBuffer[0]!= 0x0a)

{

USART_RX_STA=0;         //????,????

}

  else

  {

  USART_RX_STA|=0x8000;  //?????

  }

}

else //????0x0D

{

if(aRxBuffer[0] == 0x0d)

{

USART_RX_STA|=0x4000;

}

else

{

USART_RX_BUF[USART_RX_STA&0x3FFF]=aRxBuffer[0];

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))

{

USART_RX_STA=0;    //??????,??????

}

}

}

}

   }

   }


void MX_USART1_UART_Init(void)

{


  /* USER CODE BEGIN USART1_Init 0 */


  /* USER CODE END USART1_Init 0 */


  /* USER CODE BEGIN USART1_Init 1 */


  /* USER CODE END USART1_Init 1 */

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */


}


void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspInit 0 */


  /* USER CODE END USART1_MspInit 0 */

    /* USART1 clock enable */

    __HAL_RCC_USART1_CLK_ENABLE();


    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**USART1 GPIO Configuration

    PA9     ------> USART1_TX

    PA10     ------> USART1_RX

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* USART1 interrupt Init */

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspInit 1 */


  /* USER CODE END USART1_MspInit 1 */

  }

}


void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)

{


  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspDeInit 0 */


  /* USER CODE END USART1_MspDeInit 0 */

    /* Peripheral clock disable */

    __HAL_RCC_USART1_CLK_DISABLE();


    /**USART1 GPIO Configuration

    PA9     ------> USART1_TX

    PA10     ------> USART1_RX

    */

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);


    /* USART1 interrupt Deinit */

    HAL_NVIC_DisableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspDeInit 1 */


  /* USER CODE END USART1_MspDeInit 1 */

  }

}


/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


uart.h


/**

  ******************************************************************************

  * @file    usart.h

  * @brief   This file contains all the function prototypes for

  *          the usart.c file

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2021 STMicroelectronics.

推荐阅读

史海拾趣

益升华(Essentra)公司的发展小趣事

为了提高生产效率和降低成本,益升华(Essentra)公司不断优化供应链。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的质量和供应的稳定性。同时,公司还引入先进的生产设备和工艺,提高生产自动化水平,降低人工成本。此外,益升华(Essentra)公司还建立了完善的物流体系,确保产品能够及时送达客户手中。这些措施的实施,使公司的竞争力得到了显著提升。

AXSEM公司的发展小趣事

益升华(Essentra)公司深知客户是企业发展的基石。因此,公司始终将客户服务放在首位,致力于为客户提供优质的产品和服务。公司建立了完善的客户服务体系,为客户提供从产品咨询、选购、安装到售后维护的全流程服务。同时,公司还积极开展客户回访和满意度调查活动,及时了解客户需求和反馈意见,不断改进产品和服务质量。这些努力使益升华(Essentra)公司赢得了客户的广泛赞誉和信任。

动运科技(DONGWOON)公司的发展小趣事

在电子行业中,技术创新是企业持续发展的关键。动运科技始终将技术创新作为公司的核心竞争力,不断投入研发资源,推动产品升级和技术创新。近年来,公司在自动对焦和光学防抖技术方面取得了重大突破,成功应用于音圈马达驱动芯片中,为智能手机等设备的摄像头模组提供了更加稳定、清晰的成像效果。这一技术的成功应用,不仅提升了动运科技在业界的地位,也为公司带来了广阔的市场前景。

Bce Sud公司的发展小趣事

面对市场的不断变化和消费者需求的日益多样化,Bce Sud始终坚持创新驱动的发展理念。公司不断推出新产品,从半导体芯片拓展到传感器、集成电路等领域,产品线日益丰富。这些创新产品不仅提升了公司的市场竞争力,也为消费者带来了更多选择。

台湾富晶(FORTUNE)公司的发展小趣事
确保电源供电稳定,无电压波动或断电现象。
B+B SmartWorx公司的发展小趣事

B+B SmartWorx在成立初期便注重全球市场布局,特别是在美国和欧洲市场。通过多年的深耕细作,公司在这些地区建立了广泛的销售渠道和优秀的团队。其产品在美洲市场占据了58%的份额,欧洲市场占28%,其余地区占14%。这种全球布局不仅提升了公司的品牌知名度,也为其后续发展奠定了坚实的基础。

问答坊 | AI 解惑

低频数字式相位测量仪

本帖最后由 paulhyde 于 2014-9-15 04:24 编辑 如题,和大家分享  …

查看全部问答>

齐纳二极管原理特性

齐纳二极管原理特性…

查看全部问答>

按下16个矩阵键盘依次在数码管上显示1-16的平方。

按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4... 我写了第3行的检测,就是说:按键按下的话 ,会显示:16   25  36   49: 但是我在实验板上运行的时候,高位的数字只会闪一下 ...…

查看全部问答>

Hp2490如何打开无线网卡,连接指定SSID,最好用C#完成,谢谢

Hp2490如何打开无线网卡,连接指定SSID,最好用C#完成,例如,我们办公室有N个无线网络,我想通过程序控制连接其中指定一个网络。…

查看全部问答>

IAR 3.41使用问题

前一阵重新装机,从网上下了个IAR 3.41 然后有个小工具生成序列号,安装过程没问题,可是在程序编译时出现下面的提示: Fatal Error[Cp001]: Copy protection check, No valid license found for this product [20] 这是什么问题呀?…

查看全部问答>

关于 CORTEX M 在 ucos 上的问题

  我尝试把ucos2移植到 cortex m0上,参考了 ucos over cortex m3 的代码。   有这样一个不明白的地方:从main函数开始,系统默认是使用 MSP 做堆栈使用的,也就是说 process模式和 中断模式都是用 MSP。   现在需要改成 proce ...…

查看全部问答>

试试传说中的低功耗

以前开发MCU都是外置电源供电,几乎没有怎么考虑过功耗问题,借此机会试试在电池供电的环境下软硬件设计。…

查看全部问答>

点阵出了点问题,图像有

今天看了下点阵的教程,自己跑去搞了下 ,结果弄是弄出来,可就是每次图像移动前都会红一团  这是电路图还有代码,大大帮忙看看#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbi ...…

查看全部问答>

28035 CCS5 IQMATH调用

我在用CCS5中调用IQMATH函数时发现以下小问题: 下面是我的代码: _iq30 in2, out2 ; in2 =_IQ10(0.333*PI/(2*PI)); out2 =_IQ10sinPU(in2); temp = _IQ10toF(out2); in2 =_IQ30(0.333*PI/(2*PI)); out2 =_IQ30cosPU(in2); temp = _IQ30toF ...…

查看全部问答>