四,续前章
五,ADC温度采集
STM32Cubemx配置
温度计算公式及参数
核心代码:
/*-----------------------------------相关变量-------------------------------------------*/
uint16_t TS_CAL1;
uint16_t TS_CAL2;
float McuTemp=0;
/*-----------------------------------相关函数-------------------------------------------*/
/*
函数名 :MyAdcInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void MyAdcInit(void)
{
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}
/*
函数名 :AdcGetValue
作用 :获得芯片内部温度
参数 :无
返回值 :无
*/
void AdcGetValue(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
McuTemp= HAL_ADC_GetValue(&hadc1);
TS_CAL1=*(__IO uint16_t *)(0x1FFF75A8);
TS_CAL2=*(__IO uint16_t *)(0x1FFF75CA);
//温度结果
McuTemp= ((110.0f - 30.0f) / (TS_CAL2 - TS_CAL1)) * (McuTemp- TS_CAL1) + 30.0f;
}
六,软件实现单通道DMA过采样12位变16位
STM32Cubemx配置
核心代码:
/*-----------------------------------------相关变量------------------------------------*/
//单通道DMA模式一定要开启ADC连续转换模式
#define ADC_OVERSAMPLE_TIMES 256
#define AVERAGE_TIMES 10
#define BUF_SIZE ADC_OVERSAMPLE_TIMES * AVERAGE_TIMES
uint16_t buf[BUF_SIZE]={0};
uint32_t Value=0;
float endValue=0;
/*-----------------------------------------相关函数------------------------------------*/
/*
函数名 :AdcToDmaGetValue
作用 :得到分辨率为16的电压值
参数 :无
返回值 :测得的电压值
*/
float AdcToDmaGetValue(void)
{
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)buf,BUF_SIZE);
while(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))
{
__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
HAL_ADC_Stop_DMA(&hadc1);
}
for(int i=0;i<BUF_SIZE;++i)
{
Value+=buf[i];
}
Value/=AVERAGE_TIMES;
Value>>=4;
endValue=(float)Value*(3.3f/65536.0f);
return endValue;
}
/*
函数名 :myAdcToDmaInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void myAdcToDmaInit(void)
{
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}
七,硬件实现单通道DMA过采样12位变16位
STM32Cubemx配置
核心代码:
/*------------------------------------------相关变量---------------------------------*/
#define bufSize 100
uint16_t buf[bufSize]={0};
uint32_t Value=0;
float endValue=0;
/*------------------------------------------相关函数---------------------------------*/
/*
函数名 :AdcToDmaGetValue
作用 :得到16位分辨率的电压值
参数 :无
返回值 :电压值
*/
float AdcToDmaGetValue(void)
{
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)buf,bufSize);
while(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))
{
__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
HAL_ADC_Stop_DMA(&hadc1);
}
for(int i=0;i<bufSize;++i)
{
Value+=buf[i];
}
Value/=bufSize;
endValue=(float)Value*(3.3f/65536.0f);
return endValue;
}
/*
函数名 :myAdcToDmaInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void myAdcToDmaInit(void)
{
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}
八,UART的发送DMA实验实现我的printf()函数
STM32Cubemx配置
核心代码:
/*------------------------------------相关头文件---------------------------------------*/
/*记得开usart的中断,不然__HAL_DMA_GET_FLAG无法正常使用*/
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
/*------------------------------------相关函数---------------------------------------*/
/*
函数名 :MyPrintf
作用 :实现像使用ptintf()函数一样使用usart的发送
参数 :可格式化的字符串
返回值 :字符串长度
*/
int MyPrintf(const char *format,...)
{
va_list arg;
static char SendBuff[200] = {0};
int rv;
va_start(arg,format);
rv = vsnprintf((char*)SendBuff,sizeof(SendBuff)+1,(char*)format,arg);
va_end(arg);
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)SendBuff,rv);
while(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TC1))
{
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TC1);
HAL_UART_DMAStop(&huart1);
}
return rv;
}
九,结语
创做不易,一键三连!!!!!!!!