stm32学习之十

发布者:huanran最新更新时间:2016-10-05 来源: eefocus关键字:stm32  GPIO  温度传感器: 手机看文章 扫描二维码
随时随地手机看文章
USART,AD与GPIO的温度传感器:

注意的是:

     1、ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);

      2、ADC_TempSensorVrefintCmd(ENABLE);

依照上一节的程序,可以改写以下,形成现在的程序与效果:

add.h和add.h(写成这种方式,原因与上一节一样)

add.h的代码:

#ifndef _ADD_H
#define _ADD_H

#include "stm32f10x.h"
//对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0x6EE
#define V25  0x6EE 

//斜率 每摄氏度4.3mV 对应每摄氏度0x05
#define AVG_SLOPE 0x05 
void ADC_Configure();

#endif

 

add.c的代码如下:

#include "add.h"
#define ADC1_DR_Address ((u32)0x40012400 + 0x4C)

__IO uint16_t ADC_ConvertedValue;


static void ADC_GPIO_Config()
{
  
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 ,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

}
static void ADC_DMA_Config()
{
 ADC_InitTypeDef ADC_InitStructure;
 DMA_InitTypeDef  DMA_InitStructure;

 DMA_DeInit(DMA1_Channel1);
 DMA_InitStructure.DMA_BufferSize = 1; 
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
 DMA_InitStructure.DMA_PeripheralInc =  DMA_PeripheralInc_Disable;
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
 DMA_Init(DMA1_Channel1,&DMA_InitStructure);
 DMA_Cmd(DMA1_Channel1, ENABLE);
 
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 ADC_InitStructure.ADC_NbrOfChannel = 1;
 ADC_InitStructure.ADC_ScanConvMode = DISABLE;
 ADC_Init(ADC1,&ADC_InitStructure);


 
 RCC_ADCCLKConfig(RCC_PCLK2_Div8);
 ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);

 ADC_TempSensorVrefintCmd(ENABLE);


    ADC_DMACmd(ADC1,ENABLE);
 ADC_Cmd(ADC1,ENABLE);

 ADC_ResetCalibration(ADC1);
 while(ADC_GetResetCalibrationStatus(ADC1));

 ADC_StartCalibration(ADC1);
 while(ADC_GetCalibrationStatus(ADC1));

 ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}


void ADC_Configure()
{
 ADC_GPIO_Config();
 ADC_DMA_Config();
}

 

usart.h的代码:

#ifndef _USART_H
#define _USAET_H
#include
void Usart_GPIO_Config(void);
int fputc(int ch,FILE *f);

#endif


usart.c的代码:

#include "usart.h"
#include "stm32f10x.h"

void Usart_GPIO_Config()
{
 USART_InitTypeDef USART_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 GPIO_Init(GPIOA,&GPIO_InitStructure); //注意的是,这个必须得加上,原因不清

 USART_InitStructure.USART_BaudRate = 115200;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
 USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_Init(USART1,&USART_InitStructure);
    USART_Cmd(USART1,ENABLE);
}


int fputc(int ch,FILE *f)
{
   USART_SendData(USART1,(unsigned char)ch);
   while(!(USART1->SR & USART_FLAG_TXE));
   return ch;
}


 main.c的代码如下:

/******************** (C) COPYRIGHT 2013 **************************
 * 文件名  :main.c
 * 描述    :用3.5.0版本建的工程模板。         
 * 实验平台:野火STM32开发板
 * 库版本  :ST3.5.0
 *
 * 作者    :wit_yuan
 * 时间    : 2013年4月29日
 * 版本    :v1.0
**********************************************************************************/
#include "stm32f10x.h"
#include "add.h"  
#include "usart.h"
void delay(__IO uint32_t count);

extern __IO uint16_t ADC_ConvertedValue;

u16 Current_Temp;

/* 
 * 函数名:main
 * 描述  : 主函数
 * 输入  :无
 * 输出  : 无
 */
int main(void)
{
   Usart_GPIO_Config();
   ADC_Configure();        
  
     while(1)
   {
      Current_Temp=(V25-ADC_ConvertedValue)/AVG_SLOPE+25; 

   //10进制显示
   printf("\r\n The current temperature= %3d ℃\r\n", Current_Temp); 
   delay(0x01fffff0);

   }
   // add your code here ^_^。
}
/******************* (C) COPYRIGHT 2013 *****END OF FILE************/
void delay(__IO uint32_t count)
{
 for(;count>0;count--);
}

形成的效果如下:

stm32学习之十 - yuanzhaoming901030@126 - wit_yuans space

 

关键字:stm32  GPIO  温度传感器: 引用地址:stm32学习之十

上一篇:stm32的相关网络问题
下一篇:stm32学习之九

推荐阅读最新更新时间:2024-03-16 15:13

基于AD9858的线性调频源设计
1 引言 随着雷达技术的发展,线性调频信号已经广泛应用于高分辨率雷达领域。过去获得线性调频信号主要借助模拟方法,其中包括VCO方法和声表面波方法。这两种脉冲电压信号的产生方法因其一些固有的缺陷(如对环境温度比较敏感、信号波形比较单一、信号产生的重复性差、线性度及信号间的相关性不理想等)而制约了雷达整机性能的提高。目前,VCO方法和声表面波方法已渐渐被数字方法所取代。直接数字频率合成方法具有传统方法所不具备的许多突出优点,如频率分辨率和切换速度高,频率切换时相位可保持连续,超宽的频率范围,能实现各种调制波和任意波形的产生以及易于实现全数字化设计等。然而,其全数字化的工作原理也给它带来了两个缺点,一是输出杂散较大,二是输出带宽将受到
[模拟电子]
电力工业中的新型红外温度传感器
  电力是现代社会使用最为广泛的二次能源, 电力工业 则是关系到国计民生的重要基础产业和公用事业。不言而喻,传感器相当于电力工业的视觉神经,是电力能够安全、可靠运行和保质保量稳定供应的重要保障。   在电力生产过程中,温度测量与控制十分重要,温度参数的准确测量对电能的输出品质、生产效率和安全可靠的运行至关重要。目前,在电力生产和检修过程中已逐渐开始采用先进的红外温度计等非传统测温传感器,来代替传统的热电偶、热电阻类的热电式 温度传感器 ,从而实现电力的生产过程或者重要设备的温度监视和控制。 红外温度传感器的原理和优点   红外辐射俗称红外线,是指辐射波长大致为0.75-1000mm频谱范围内的电磁波。红外辐射的物理本
[安防电子]
STM32 变量无法赋值问题
STM32 在用JLink 调试的时候发现有一条将unsigned char赋值给int的语句始终不能执行,int类型变量的值始终为0; 查资料找到这个问题是编译器优化的原因,也就是说由于编译器优化,赋值语句始终没有执行; 解决办法: 在变量声明前加 volatile 修饰即可,这样就能保证赋值语句不会被编译器优化
[单片机]
STM32基于库函数工程模板
#下载stm32官方(标准库/HAL库)下载链接 http://www.openedv.com/thread-295843-1-1.html ##文件夹介绍: Libraries文件夹下面有CMSIS和STM32F4XX_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。 1.CMSIS文件夹存放的是符合CMSIS规范的一些文件。包括STM32F4核内外设访问层代码。DSP库,RTOS API,以及STM32F4片上外设访问层代码等。 2.STM32F4XX_StdPeriph_Driver放的是标准外设库源码文件和对应的头文件。inc目录存放的是stm32f4xx_ppp.h头文件,无
[单片机]
<font color='red'>STM32</font>基于库函数工程模板
STM32 I2C上拉电阻的选择问题
从开源的设计中我们可以看到,I2C的上拉电阻可以是1.5K,2.2K,4.7K,然而电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K 或2.2K。 上拉电阻阻值的确定: 由于I2C 接口采用Open Drain 机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP 将信号线拉至高电平。因此I2C 总线上的上拉电阻是必须的! RP 不宜过小,一般不低于1KΩ。 一般IO 端口的驱动能力在2mA~4mA 量级。如果RP 阻值过小,VDD 灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C 协议规定,端口输出低电平的最高允许值为0.4V);如果灌入端口的电流过大,还可能损坏
[单片机]
STM32小知识】TIM6的时钟频率疑问
通过前面的学习,我们知道了,TIM6是挂载在APB1上的,而APB1通过前面的学习,我们知道在系统时钟频率为72M的前提下,APB1最高是36M,而实际我我们写程序并不是36M计算的,而是72M,实际正确的答案也应该是72M,这个是为什么呢? TIM6Init(10000, 7200); //初始化定时器 6,预装载值为 10000,预分频值为 7200,定时时间 10000/(72000000/7200)=1s 其实教程也给出了答案,仔细阅读的话也会初见端倪,从第三章第七页可看到, 那么对应到这个问题就是,当AHB为72M时,我们知道APB1此时最小预分频为2,所以APB1对应为36M, 然后我们再比照上面那段教
[单片机]
【<font color='red'>STM32</font>小知识】TIM6的时钟频率疑问
STM32单片机的延时原理和延时函数方法
当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的延时原理以及常用的延时函数方法。 延时的原理 单片机的延时是通过控制处理器执行一系列指令来实现的。每条指令需要一定的时间来执行,而延时就是利用这些指令的执行时间来达到暂停程序执行的目的。延时的精确性和稳定性受到处理器的时钟频率、编译器优化等因素的影响。 延时方法 1. 软件延时 软件延时是最常见的延时方法之一,适用于大多数STM32单片机。基本思路是通过循环执行空操作或简单指令来消耗时间,从而实现延时。 #include stm32f4x
[单片机]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口,它允许CPU与TTL移位寄存器、A/D或D/A转换器、实时时钟(RTO)、存储器以及LCD和LED显示驱动器等外围接口器件以串行方式进行通讯。 SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单。串行A/D转换器具有电路简单、工作可靠的特点,而ARM芯片被设计用于手持设备以及普通的嵌人式应用的集成系统,将上述两种实用的芯片和SPI总线技术相结合以实现数据采集十分有效。 1 AD7888的功能与使用 AD7888是美国模拟器件公司推出的一款
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved