STM32CubeMX配置芯片详解之ADC
STM32CubeMX版本5.6,芯片型号是STM32F407ZGT6选择ADCx,以及输入通道。
模式,如果只使能了一个ADC,那么这里只能配置为Independent mode(独立模式)。
时钟分频:这个选项是ADC的预分频器,可设置为2,4,6,8,决定了一个ADC时钟周期,加入设置为2,由于ADC是挂载在APB2总线(84M)上,所以一个ADC时钟便是84M/2=42M。
分辨率:最高为12位分辨率,分辨率越高转换时间越长
数据对齐方式:如果选择12位分辨率,右对齐,得到的结果最大便是4096.
扫描模式:决定了转换完一个通道会不会继续转换下一个通道。
连续转换模式:使能的话转换将连续进行。
不连续转换模式:当使能多个转换通道时,可单独设置不连续转换通道。
DMA连续请求:是否连续请求DMA。
EOC标志设置:当有多个转换通道时,是每转换完一个通道设置一次EOC标志还是所有通道都转换完设置一次EOC标志.
转换的通道数
触发模式:可选择软件触发,外部触发或定时器事件触发
秩序列表:设置转换周期数,和转换顺序
注入通道设置
窗口看门狗模式
看起来需要配置的蛮多,但也就点点鼠标的事,相比于我们一个个去移植,还是轻松太多。
一般要进行内存优化,尽量提高内存的使用效率
让尽可能多的变量使用直接寻址,提高速度
51 单片机不使用线性编址
极限情况下可以定义的变量可占 247 个字节
128以上的某些地址为特殊寄存器使用,不能给程序用
超出 120 个字节则必须用 idata 显式的指定为间接寻址
只要内存占用量不超过 256.0 就可以用 small 模式编译
small 模式下未指存储类型的变量默认为data型
超过变量128后必须使用compact模式编译
超出 120 个字节用 idata 显式的指定为间接寻址 128以上的某些地址为特殊寄存器使用 尽量提高内存的使用效率 尽可能多的变量使用直接寻址,提高速度
对于信号回路的峰值电压防护电路不应动作,通常在信号回路中,防护电路的动作电压是信号回路的峰值电压的1.3~1.6倍。
然后将其用作在PCB组装过程中放置在另一个板上的独立部件。
选择测试方法和测试参数是检测过程中的重要步骤
选择测试方法和测试参数是检测过程中的重要步骤
//*************************************************************************************************
//Copyright (c) 深圳市赛元微电子有限公司
// 文件名称 :S_TouchKeyCFG.c
// 作者 :
// 模块功能 :触控键配置文件
// 版本 :
// 更改记录 :
// 注意事项 :用户需要配置的文件在S_TouchKeyCFG.h中
//库版本标记 :
//************************************************************************************************
#include "S_TouchKeyCFG.h"
#include "TKDriver.h"
#include "stdio.h"
//*************************************************************************************
// 844 寄存器定义
//*************************************************************************************
/*PSW*/
sfr TK_PSW = 0xD0; //程序状态字
sbit TK_CY = TK_PSW^7; //进位
//===========================================================================
//全局变量定义
unsigned char xdata SOCAPI_TouchKeyStatus; //API接口状态:bit7-一轮扫描完成标志1:完成 0:未完成
// bit6-通道触摸计数溢出标志 1:溢出 0:未溢出
//===============================================================================
//全局变量声明:该区域不可修改
unsigned int xdata RawData ;
unsigned int xdata BaseLine;
unsigned int xdata FilterData;
unsigned char idata RestAreaCnt;
unsigned char idata TouchCnt;
unsigned char idata NoTouchCnt;
unsigned char xdata CurrentChannel;
unsigned char idata LowFingerDataCnt;
unsigned char xdata FloatAreaCnt;
unsigned char idata BaseLineAdjusttmp;
int xdata DifferAccum;
char xdata SetNoiseThreshold;
unsigned char idata ConfirmTouchCnt;
unsigned char idata MultipleDealTpye = 0;
//自定义变量
unsigned int idata UpdateBaseLNum; // 单键长按计数器
unsigned int idata MultipleLNum; // 多按键干扰计数
//外部变量接口
extern unsigned char data CurrentChannelMax; //当前选中的keysensor的个数
externbitbMultiple; //多按键标志
extern bitGetIsNeedUpdateBaseline(void);
externvoid SetNeedUpdateBaseline(void);
externunsignedint SensorKeyFlag(void);
externvoid MultipleDeal(unsigned char CycleCnt);
externvoid TouchKey_Service(void);
/***************弹簧库独有***************/
#define SOCAPI_SET_CS_FUNCTION 1 //0:表示不进行CS测试,1: 表示进行CS测试,默认0
#define SOCAPI_INHIBITION_ZONE 8 //抑制区间%,设置范围5-10,默认7,即(7*10)%=70% ,连水时加大该参数,对讲机设置小
#define SOCAPI_MAX_KEY_MUTIPLE 300 //多少次干扰更新基线,默认300*5=1500
#define SOCAPI_MAX_KEY_NUM_INVALID 3 //强制更新基线按键限制个数,默认3
/****************************************/
#define AppType 0
#define IsDoubleKey 1
#define AirSeparationDistance 2
#define CONFIRMTOUCHCNT 3
#define INIT_AUTO_UPDATE_TIME 4
#define SET_KEY_CONTI_TIME 5
#define SET_SYNC_UPDATE 6
#define SET_UPDATE_SPEED 7
#define AUTO_UPDATE_TIME 8
#define FilteredKValue 9
#define SET_ANTIJAM 10
#define BAUD 11
#define DwellTime 12
#define SaveTime 13
#define NOISE 16
#define SET_TOUCH_FREQ 0
#define SET_RESOLUTION 1
#define SET_GAIN_CFG 2
#define SCANTIME 3
#define SET_ICHA 4
#define FINGER_THRESHOLD_H 6
#define FINGER_THRESHOLD_L 7
//**********************************************************************************
// 函数接口调用部分 //
//**********************************************************************************
/**************************************************
*函数名称:unsigned int SetOneKeyPushResetTime(void)
*函数功能:按键最长的输出时间
*入口参数:void
*出口参数:unsigned int SOCAPI_SET_KEY_CONTI_TIME
*备注 :这个返回值的设置, 是根据有多长时间启动TouchKeyRestart()一次
例如10ms 启动一次, 那SOCAPI_SET_KEY_CONTI_TIME*10ms,超过时间后此按键无效。
**************************************************/
unsigned int SetOneKeyPushResetTime(void)
{
returnTKCFG;
}
/**************************************************
*函数名称:unsignedintGetBaselineUpdateThreshold(void)
*函数功能:更新速度
*入口参数:void
*出口参数:unsignedint
*备注 :
**************************************************/
intGetBaselineUpdateThreshold(void)
{
return TKCFG;
}
/**************************************************
*函数名称:unsigned char GetInitAutoUpdateTime(void)
*函数功能:初始化自动校准次数
*入口参数:void
*出口参数:unsignedchar
*备注 :
**************************************************/
unsigned char GetInitAutoUpdateTime(void)
{
returnTKCFG;
}
/**************************************************
*函数名称:unsigned char GetCsFunction(void)
*函数功能:进行CS 测试
*入口参数:void
*出口参数:char SOCAPI_SET_CS_FUNCTION
*备注 :
**************************************************/
char GetCsFunction(void)
{
return SOCAPI_SET_CS_FUNCTION;
}
/**************************************************
*函数名称:intGetCurrFingerValue(unsigned char i)
*函数功能:获取当前的finger 值
*入口参数:unsigned char
*出口参数:int
*备注 :
**************************************************/
unsigned int GetCurrFingerValue(unsigned char i)
{
return TKChannelCfg*256+TKChannelCfg ;
}
/**************************************************
*函数名称:unsigned charGetScanTimeValue(unsigned char i)
*函数功能:获取当前通道的扫描时间
*入口参数:unsigned char
*出口参数:unsigned char
*备注 :
**************************************************/
unsigned charGetScanTimeValue(unsigned char i)
{
return TKChannelCfg;
}
/**************************************************
*函数名称:unsigned char IsDoubleKeyOrSlideKey(void)
*函数功能:检测是否是弹簧滑条或者双键
*入口参数:void
*出口参数:unsigned char
*备注 :
**************************************************/
unsigned char IsDoubleKeyOrSlideKey(void)
{
return TKCFG;
}
/**************************************************
*函数名称:unsigned charGetBaseLineAdjustValue(unsigned char i)
*函数功能:获取当前通道的基线调整
j
*入口参数:unsigned char
*出口参数:unsigned char
*备注 :
**************************************************/
unsigned charGetBaseLineAdjustValue(unsigned char i)
{
return BaseLineAdjusttmp;
}
/**************************************************
*函数名称:unsigned char GetUpConfirmCnt(void)
*函数功能:检测按键弹起次数
*入口参数:void
*出口参数:返回按键弹起确认次数
*备注 :
**************************************************/
unsigned char GetUpConfirmCnt(void)
{
return ConfirmTouchCnt>>1;
}
/**************************************************
*函数名称:unsigned char GetTKYzCnt(void)
*函数功能:获取按键抑制确认次数
*入口参数:void
*出口参数:返回抑制次数
*备注 :
**************************************************/
unsigned char GetTKYzCnt(void)
{
return (ConfirmTouchCnt/3);
}
/**************************************************
*函数名称:int GetTKYzThreshold(unsigned char i)
*函数功能:获取按键抑制区间
*入口参数:unsigned char i
*出口参数:返回抑制区间
*备注 :
**************************************************/
int GetTKYzThreshold(unsigned char i)
{
unsigned int SetFingerThresholdtmp;
SetFingerThresholdtmp = GetCurrFingerValue(i);
SetFingerThresholdtmp = SetFingerThresholdtmp*SOCAPI_INHIBITION_ZONE/10;
return SetFingerThresholdtmp;
}
/**************************************************
*函数名称:void CurrentSensorChoose(void)
*函数功能:当前通道选择
*入口参数:void
*出口参数:void
*备注 :
**************************************************/
void CurrentSensorChoose(void)
{
unsigned char i ;
unsigned char Ctk_Channel_mark = 0;
unsignedint CurrentSensorKey;
CurrentSensorKey = SOCAPI_SET_TOUCHKEY_CHANNEL;
for(i=0;i<16;i++)
{
CurrentSensorKey=CurrentSensorKey>>1;
if(TK_CY)
{
CurrentChannel = i; //选择触摸当前的通道
Ctk_Channel_mark++;
if(Ctk_Channel_mark >= SOCAPI_SET_TOUCHKEY_TOTAL)
break;
}
}
CurrentChannelMax = Ctk_Channel_mark; //当前选择的按键数
}
/**************************************************
*函数名称:unsigned charGetCfgMsg(unsigned char i)
*函数功能:获取Touch KEY 配置信息
*入口参数:void
*出口参数:int
*备注 :
**************************************************/
unsigned charGetCfgMsg(unsigned char i)
{
switch(i)
{
case 0:return TKChannelCfg;
case 1:return TKChannelCfg;
case 2:return TKChannelCfg;
case 3:return TKChannelCfg;
case 4:return TKCFG;
default:return 0;
}
}
/**************************************************
*函数名称:void CurrentSensorChoose(void)
*函数功能:初始化TK寄存器
*入口参数:void
*出口参数:void
*备注 :
**************************************************/
void TouchKeyCFGInit(void)
{
unsigned char i;
ConfirmTouchCnt = TKCFG;
SetNoiseThreshold = TKCFG;
CurrentSensorChoose();
for(i=0;i<CurrentChannelMax;i++)
{
BaseLineAdjusttmp =TKChannelCfg;;
}
UpdateBaseLNum = 0;
}
/**************************************************
*函数名称:unsigned int TouchKeyScan(void)
*函数功能:检测按键接口
*入口参数:void
*出口参数:按键通道, 返回的是一个int , 通道数
*备注 :1,调用触控库检测函数SensorKeyFlag()
2,分析得出16个通道,哪个通道有按下,按下bit 位设置为1,否则为0
3,检测是否需要立即更新baseline:大于MAX_KEY_RESET_BASELINE 个按键按下时立即更新baseline
4,双键或者单键按下时, 时间大于SetOneKeyPushResetTime()结果时更新baseline
**************************************************/
unsignedint TouchKeyScan(void)
{
unsigned char t;
unsigned char MultipleCnt = 0;//按键计数
unsignedint Keyvalue ;
unsignedint KeyData = 0;
if(GetIsNeedUpdateBaseline() == 0) //检测是否需要更新baseline
{
Keyvalue = SensorKeyFlag(); //Sensor判断, 这里如果bMultiple = 1 表示中间有干扰 //分析按键,得出标准的16通道bit 位
for(t=0;t<CurrentChannelMax;t++)
{
Keyvalue = Keyvalue>>1;
if(TK_CY)
{
KeyData |= (0x01 << (CurrentChannel));
MultipleCnt++;
}
}
if(MultipleCnt >= 2) //进入多按键处理
{
bMultiple = 1;
if(MultipleCnt >= SOCAPI_MAX_KEY_NUM_INVALID)
{
SetNeedUpdateBaseline(); // 立即更新baseline ,例如亚克力板盖上去
}
else
{
if(IsDoubleKeyOrSlideKey())
{
bMultiple = 0;
}
}
}
if(bMultiple == 0) //进入按键判断
{
if(KeyData != 0x0) //单个按键达到多长时间就update baseline ,松手检测
{
UpdateBaseLNum++;
}
else
{
UpdateBaseLNum = 0;
}
}
else
{
//考虑基线更新
MultipleLNum++;
KeyData = 0x00;
}
if(UpdateBaseLNum > SetOneKeyPushResetTime()) //按键超出最长输出时间更新基线
{
SetNeedUpdateBaseline();
UpdateBaseLNum = 0;
}
if(MultipleLNum >SOCAPI_MAX_KEY_MUTIPLE) //干扰计数大于最大计数更新基线
{
SetNeedUpdateBaseline();
MultipleDealTpye = 1;
MultipleLNum = 0;
}
}
else
{
MultipleDeal(TKCFG); //基线复位处理
}
return KeyData;
}
/**************************************************
*函数名称:void CTK_ISR(void) interrupt 11
*函数功能:触摸中断服务函数
*入口参数:void
*出口参数:void
*备注 :
**************************************************/
void CTK_ISR(void) interrupt 11
{
TouchKey_Service();
}
它产生的噪声是对地噪声
页:
[1]
2