小熊派学习——获取STM32内部温度传感器数据

举报
ttking 发表于 2020/08/31 17:08:13 2020/08/31
【摘要】 使用小熊派开发板,通过配置CubeMX,建立MDK工程,按照官方数据手册获取主控芯片内部传感器温度值并通过串口打印。通过此文章,更加熟悉的使用小熊派,进一步理解ADC。

 一、实验准备

1.实验环境

  • 一块stm32开发板(推荐使用小熊派),以及数据线

  • 已经安装STM32CubeMX

  • 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)

  • 准备一个串口调试助手,我使用的是UartAssist(包含在附件中)

image.png

2.目标效果

  • 通过CubeMX创建工程并配置参数

  • 获取stm32内部温度传感器值(通过获取ADC转化为温度值)

  • 串口1重定向输出



二、通过CubeMX生产MDK工程


A.芯片选择

  • 打开CubeMX,进入芯片选择:


image.png


  • 选择自己的stm32芯片(即STM32L431RCT6):


image.png


B.时钟源RCC设置

  • 更改系统时钟源

系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确


  • 设置外部时钟对应的端口

image.png


  • 配置时钟树

STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可


image.png



 C.参数配置(对应端口设置)


1)配置USART1

使用USART,模式为异步,波特率为115200,无硬件流控制


image.png



2)配置ADC1的温度传感器通道

小熊派的ADC1的温度传感器通道在IN17,不同芯片会有所差异


image.png


D.工程设置

一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成


image.png


image.png



E.生成代码

image.png



三、代码补充


1. 串口1输出重定向

我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可


  • 在添加头文件

/* USER CODE BEGIN 0 */
#include <stdarg.h>;
#include <string.h>;
#include <stdio.h>;
/* USER CODE END 0 */
  •  写输出函数

/* USER CODE BEGIN 1 */
void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...)
{
unsigned char UsartPrintfBuf[296];
va_list ap;
unsigned char *pStr = UsartPrintfBuf;
va_start(ap, fmt);
vsprintf((char *)UsartPrintfBuf, fmt, ap);//格式化
va_end(ap);
while(*pStr != 0)
{
USART1->TDR = *pStr++;
while((USART1->ISR & 0x40)  == 0);
}
}
//使用方法:UsartPrintf(&huart1,"hello world\r\n");
/* USER CODE END 1 */

注意:自己添加的代码,需要在begin和end之间



2. 温度值转换

我们首先获取芯片出厂时30°和130°的ADC数值,就是根据芯片手册读取相应地址的内容,然后根据公式 temperatu = (130.0-30)*(ADC_now_value-ADC_30_value)/(ADC_130_value-ADC_30_value)+30。当然这一切来源都是数据手册

image.png


当然,为了ADC获取的值更加准确,我们通过获取20次然后去平均值。


image.png


main函数中while循环如下:

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  HAL_ADC_Start(&hadc1); //开启ADC1
  HAL_ADC_PollForConversion(&hadc1,50); //等待ADC转化完成
  for(num=0;num<20;num++)
  {
        AD_Value += HAL_ADC_GetValue(&hadc1);
  }
  AD_Value = AD_Value/20;  //ADC转换的数据20次的平均值
  UsartPrintf(&huart1,"ADC20次获取的平均值值为:%d\r\n",AD_Value);
Temperature = ((int16_t)(AD_Value-*TEMP30_CAL_ADDR)*1.0/(int16_t)(*TEMP130_CAL_ADDR-*TEMP30_CAL_ADDR))+30;
UsartPrintf(&huart1,"Temperature is %.2f °\r\n",Temperature); //
  //UsartPrintf(&huart1,"%d\r\n",*TEMP130_CAL_ADDR);
  //UsartPrintf(&huart1,"%d\r\n",*TEMP30_CAL_ADDR);
  }


 四、编译+下载


点击编译后,0 error,0 warning


image.png


小熊派连接在电脑上,代码下载到开发板

image.png


五、效果


1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键

image.png



2.打开串口调试助手


连接端口,设置波特率为115200


image.png


可以看到,获取芯片内温度传感器的值为29.1°左右。至此,已经完成本次实验


附件中包含CubeMX工程、MDK工程以及串口调试助手

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。