感觉很反感mva 发表于 2022-2-27 22:54

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标志.
转换的通道数
触发模式:可选择软件触发,外部触发或定时器事件触发
秩序列表:设置转换周期数,和转换顺序
注入通道设置
窗口看门狗模式
看起来需要配置的蛮多,但也就点点鼠标的事,相比于我们一个个去移植,还是轻松太多。



公羊子丹 发表于 2022-10-27 08:01


一般要进行内存优化,尽量提高内存的使用效率

Wordsworth 发表于 2022-10-27 09:04


让尽可能多的变量使用直接寻址,提高速度

Clyde011 发表于 2022-10-27 10:07


51 单片机不使用线性编址

万图 发表于 2022-10-27 12:03


极限情况下可以定义的变量可占 247 个字节

Uriah 发表于 2022-10-27 13:06


128以上的某些地址为特殊寄存器使用,不能给程序用

帛灿灿 发表于 2022-10-27 15:02


超出 120 个字节则必须用 idata 显式的指定为间接寻址

Bblythe 发表于 2022-10-27 16:05


只要内存占用量不超过 256.0 就可以用 small 模式编译

童雨竹 发表于 2022-10-27 18:01


small 模式下未指存储类型的变量默认为data型

Pulitzer 发表于 2022-10-27 19:04


超过变量128后必须使用compact模式编译

SantaBunny 发表于 2022-11-3 20:53

超出 120 个字节用 idata 显式的指定为间接寻址

MessageRing 发表于 2022-11-4 18:51

128以上的某些地址为特殊寄存器使用

Jacquetry 发表于 2022-11-5 18:12

尽量提高内存的使用效率

Stahan 发表于 2022-11-6 18:53

尽可能多的变量使用直接寻址,提高速度

公羊子丹 发表于 2023-9-24 08:19


对于信号回路的峰值电压防护电路不应动作,通常在信号回路中,防护电路的动作电压是信号回路的峰值电压的1.3~1.6倍。

公羊子丹 发表于 2023-9-25 07:08


然后将其用作在PCB组装过程中放置在另一个板上的独立部件。

公羊子丹 发表于 2023-9-25 08:01


选择测试方法和测试参数是检测过程中的重要步骤

公羊子丹 发表于 2023-9-25 08:01


选择测试方法和测试参数是检测过程中的重要步骤

Uriah 发表于 2023-9-25 09:01


//*************************************************************************************************
//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();
}



Wordsworth 发表于 2023-9-25 09:04


它产生的噪声是对地噪声
页: [1] 2
查看完整版本: STM32CubeMX配置芯片详解之ADC