微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32F407之内部温度传感器

stm32F407之内部温度传感器

时间:11-10 来源:互联网 点击:
刚才发了ADC的一般用法,得知stm32内部内置了一个温度传感器,于是趁热调试了一下内部温度传感器。没有软件滤波,正如手册里所说的,该温度传感器起到一个检测温度变化的作用,如果你想要精确的温度测量,请你外置测温元件...呵呵,测试结果如图:

代码如下:

/************************************************************
Copyright (C), 2012-2022, yin.
FileName: main.c
Author: 小枣年糕
Date: 2012\05\01
Description: ADC1 DMA tempersensor printf
Version: V3.0
IDE: MDK 4.22a
HardWare: stm32F407IG HSE = 25M PLL = 168M
History: V1.0
Function: 利用ADC读取芯片内部温度传感器的值
***********************************************************/

#include
#include
/*定义ADC1的数据寄存器地址,DMA功能要用到外设的数据地址
*ADC1的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference
*manual(参考手册)的地址映射表里,为0x40012000,ADC_DR
*偏移地址为0x4C,故实际地址为0x40012000+0x4C = 0x4001204C */
#define ADC1_DR_Addr ((uint32_t)0x4001204C)

__IO uint16_t ADCoverValue;
__IO float Temper;

void GPIO_Config(void);
void ADC_Config(void);
void USART_Config(void);
void DMA_Config(void);
void NVIC_Config(void);
void Delay(uint32_t nCount);
/* printf函数重定向 */
int fputc(int ch, FILE *f);
main()
{
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c”。
程序运行起始于启动文件的第175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M */

GPIO_Config();
ADC_Config();
USART_Config();
DMA_Config();
NVIC_Config();
GPIO_SetBits(GPIOG, GPIO_Pin_6); //关闭LED
ADC_SoftwareStartConv(ADC1); //如果不是外部触发则必须软件开始转换
while (1)
{
Delay(0x0ffffff);
//printf("size of int is %d \n", sizeof(int)); //测试可知32位系统的int占4个字节
Temper = (ADCoverValue*3300/4096-760)/2.5 + 25;
printf("ADCoverVaule=%04X Temper=%.2f C\n", ADCoverValue, Temper); //串口输出温度值

/*因为DMA工作是独立于CPU之外的,所以在DMA工作的同时CPU可以做其他事*/
}
}

/*************************************************
Function: void GPIO_Config(void)
Description: GPIO配置函数
Input: 无
Output:无
Return:无
*************************************************/
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOC\GPIOF\GPIOG时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
/* 初始化GPIOG的Pin_6为LED输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为快速
GPIO_Init(GPIOG, &GPIO_InitStructure); //调用IO初始化函数

/* 配置GPIOC_Pin6为TX输出 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //设置为复用,必须为AF,OUT不行
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);

/* 配置GPIOC_Pin7为RX输入 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //这也必须为复用,与M3不同!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);

/* GPIO引脚复用功能设置 */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);//这相当于M3的开启复用时钟,只配置复用的引脚,
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);//
}

/*************************************************
Function: void ADC_Config(void)
Description: ADC配置函数
Input: 无
Output:无
Return:无
*************************************************/
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开ADC1时钟
ADC_DeInit();
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精度为12位
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描转换模式失能
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换使能
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不用外部触发,软件触发转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,低字节对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;//规定了顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top