stm32学习之十

发布者:czc天天最新更新时间:2016-10-14 来源: eefocus关键字:stm32  USART  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

 * 版本    :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  USART  GPIO  温度传感器: 引用地址:stm32学习之十

上一篇:学习STM32笔记3 GPIO设置
下一篇:stm32学习之九

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

STM32的库如何实现对同一组IO口的一部分引脚进行读写
以写数据为例,提供的函数有 GPIO_SetBits GPIO_ResetBits GPIO_WriteBit GPIO_Write 比如我在PD口的高八位接了个并行的数据线,低八位为控制,有输入有输出。怎么实现对高八位写任意数而第八位不受影响呢。 前两个函数肯定都不可以。 第三个也不行,是对一个或多个IO口置位或复位。 第四个是写整个口,势必影 响到第八位的控制信号啊。 能想到的是写一个for循环,判断每一位然后调用八次 GPIO_SetBits GPIO_ResetBits 是不是太麻烦了。。。。 知道一个方法,读输出再写输入就可以了。 GPIO的寄存器BSRR和BRR 端口位设置/
[单片机]
STM32开发笔记73: C++中子类调用父类同名函数的处理方法
单片机型号:STM32L053R8T6 1、问题 父类有1方法:Enable_RS485,如下所示: class CUart { public: uint8_t u8_UartNumber; //端口号1-8 uint32_t u32_BaudRate; //波特率 uint8_t u8_Parity; //效验位 CC0 C0; //485控制引脚C0 CC1 C1; //485控制引脚C1 UART_HandleTypeDef hUART; uint8_t u8_UartReceiveBuffer ; public: CUart(uint8_t u8_UartNumber, uint3
[单片机]
<font color='red'>STM32</font>开发笔记73: C++中子类调用父类同名函数的处理方法
STM32学习笔记(7) 超声波HSR04模块详解
一 超声波硬件详解 硬件参数 二 工作原理 采用(IO触发测距,至少给10us的高电平) 模块自动发送8个40kHz的方波,自动检测是否有信号返回 有信号返回时,通过IO输出一高电平、高电平持续时间就是超声波从发射到返回的时间 三 代码编写 程序流程图 GPIO结构体的初始化 EXTI外部中断结构体的初始化 NVIC中断结构体的初始化 TimeBase时基结构体的初始化 超声波Trig发送信号 外部中断服务函数接收返回信号并计算出距离(全局变量) 关键代码 /** * 函数名:HSR04_Init() * 功能:超声波的初始化 * 引脚:PB5(Trig) | PB4(Echo) * 占用的内设资源
[单片机]
<font color='red'>STM32</font>学习笔记(7) 超声波HSR04模块详解
STM32的中断及是如何使用
中断是一种机制,通过这种机制,I/O或指令可以暂停处理器的正常执行,并像具有最高优先级一样先执行自己的任务。也就是说,当外部中断发生时(比如来自某个传感器),处理器暂停其正在执行,首先提供中断服务,然后继续其正常执行。 为了了解 STM32F103C8 中的中断,我们将使用按钮作为外部中断。在这里,我们让一个变量从 0 开始每秒增1,并将其显示在16x2 LCD上,每当按下按钮时,LED 亮起,LCD 显示屏会显示 INTERRUPT。 中断类型和 ISR(中断服务程序) 中断大致可以分为两类: 1.硬件中断: 如果到处理器的信号来自某些外部设备,例如按钮或传感器,或者来自其他信号并告诉处理器执行 ISR 中存在的特定任务
[单片机]
<font color='red'>STM32</font>的中断及是如何使用
嵌入式stm32学习:DMA-存储到存储
main.c #include stm32f4xx.h #include ./led/bsp_led.h /* 相关宏定义,使用存储器到存储器模式必须使用DMA2 */ #define DMA_STREAM DMA2_Stream0 #define DMA_CHANNEL DMA_Channel_0 #define DMA_STREAM_CLOCK RCC_AHB1Periph_DMA2 #define DMA_FLAG_TCIF DMA_FLAG_TCIF0 #define BUFFER_SIZE 32 #define TIMEOUT_MAX 1
[单片机]
STM32的IWDG使用
关于独立看门狗,很简单,打开喂狗,就这么简单,很多书上讲了很多什么寄存器什么的,对于初学者而言,这些还不是很重要,重要的是先学会用,用了之后慢慢去消化,为什么这东西要这么设置。好了下面来看看我的程序,很简单: void Iwdg_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload(0xfff);//设置这个就可以调整IWDG的喂狗时间 //如果在这段时间内没有喂狗,那么就会重启 IWDG_ReloadCounter(); IWDG_Enable(); IWDG
[单片机]
STM32 互补输出和死区插入
搞过全桥电机驱动的都知道控制死区时间的重要性,一般解决方案是搭建电路控制死区时间或直接使用全桥驱动芯片。 而STM32拥有两个高级定时器,可以直接输出具有调节死区时间的PWM。 现以TIM1通道1输出占空比为50%,死区时间为5us来做个例子。 首先TIM1通道1的PWM输出端口为PA8,互补输出通道为PB13,所以需要开启相应模块的时钟: RCC- APB2ENR|=1 11; //TIM1时钟使能 RCC- APB2ENR|=1 2; //GPIOA时钟使能 RCC- APB2ENR|=1 3; //GPIOB时钟使能 将需要使用的PA8,PB13口设
[单片机]
<font color='red'>STM32</font> 互补输出和死区插入
STM32硬件IIC操作解析
  IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。   I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。   为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或
[单片机]
<font color='red'>STM32</font>硬件IIC操作解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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