|
从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库.2 l+ i" d; M$ Y: N9 c 常用的输出等(如更新I/O)就直接操作寄存器. 在不追求处理速度下完全可以接受. 在一个用F051的项目也直接用触摸库,连芯片手册都没看; 花了不少时间才将变量定义好,% Z3 e5 {2 H3 ?6 \, x 又花了不少时间初始化成功' g; O+ ~7 z* J8 v' O. s -------注意:触摸库会挨个将GPIO的CLK打开, 最后发现整个触摸功占用了快(整个系统)1/5的时间, 看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用 --------注:STM8/STM32L1XX并非这样,比较麻烦 大家没必要去找库. 另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次); 要不是本来速度就慢,再要虑波一下,就其慢无比了. |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版
//电容测量型按键检测支持 定义和函数 6 Y# G' p. o7 B# s7 [# O
//-----------------------------------------------------------------------------7 x' b$ k% w) E5 A
#define KEY1_R (GPIOD->IDR & 0x04)//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7, n0 ~2 Q# v7 ?# ]$ \$ ]: I0 I4 Z
//#define KEY3_R (GPIOD->IDR & 0x20)//PD57 w6 p' r! A5 G, h
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
#define KEY_SH (GPIOD->ODR |=0x08)//PD3, u6 [$ s0 E0 c: F9 s
#define KEY_SL (GPIOD->ODR &=0xf7)//PD3
//-----------------------------------------------------------------------------
#define KEY1_O_1 {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
#define KEY1_O_0 {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2' w: _$ F) b0 @
#define KEY1_I {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
//-----------------------------------------------------------------------------
#define GT_GATE 5
//-----------------------------------------------------------------------------* I1 q, d$ X4 {6 `9 Z$ @
unsigned char key_time_sta1;//充电开始时间
unsigned char key_time1;//动态时间& a0 H6 b+ v f# P4 P
unsigned char key_CH1;//按键充放电时间基准
unsigned char key_delay1;//按键保持存在的时间倒计时
unsigned char key_filter1;//按键滤波 毛刺消除
unsigned char key_count;//按键计数count 用于长按设置
unsigned char key_value;//按键数据
#define SET_K1 (key_value|=0x01)
#define SET_K2 (key_value|=0x02)
#define SET_K3 (key_value|=0x04) t) h% K( `* b0 J1 N5 H
#define SET_K4 (key_value|=0x08)" R5 ~' ~6 a8 Y! F
#define Key_on (key_value&0x01)5 B5 W! |) f9 ^7 x0 Y6 [' i2 ^
#define Key_set (key_value&0x02)# v2 i( m! |8 v2 G3 Q0 n
#define Key_add (key_value&0x04)9 q8 T- f# u6 ~+ b; H5 c$ r
#define Key_pause (key_value&0x08)
unsigned char key_shadow;//按键影子数据9 T, C6 ^/ z4 R/ w3 d# y5 {( n8 Z0 G
#define lkey_add (key_shadow&0x04)/ f4 B- p/ f4 X1 L1 r
unsigned char key_buf[64];
unsigned char key_i;8 N2 n* R6 z: J. k/ E
//-----------------------------------------------------------------------------! c5 Z4 l' e$ D' |+ E$ O6 C! ~' e
void CM_filter()9 Y+ u+ p$ x4 Z6 j7 }7 Y8 X
{//按键滤波调用
if(key_filter1<10)& m$ n8 M+ e" v4 ^, b
{
}
}
//-----------------------------------------------------------------------------
void CM_Key_scan()
{//1ms 调用一次 刷新键值
unsigned char temp;
key_value=0;//键值清03 f" F* p% b+ ?; f
//key_time_sta1=TIM2->CNTRH;
//key_time_sta1<<=8; }' u, i, S# W3 e3 w* I
key_time_sta1=TIM2->CNTRL;, d5 o( v2 z9 K# q
KEY1_O_0;//准备充电 先放光
KEY_SH;
KEY1_I;//高阻
while(!KEY1_R);3 o* j$ s/ O5 Q$ V% C7 L
5 M$ ^ C" g5 H9 T( }5 s
KEY1_O_1;//准备放电 先充满
KEY1_I;//高阻: l: D2 p4 {2 ]
KEY_SL;
while(KEY1_R); `! F' x6 a% }; F# C' p
* ^* A+ b7 _& J0 O) N( P
//temp=TIM2->CNTRH;6 } b8 x8 r9 N) _% i/ w
//temp<<=8;
temp=TIM2->CNTRL;
key_time1=temp-key_time_sta1;//单位是us2 E# M! j! j: W
if(key_time1>(key_CH1+GT_GATE))# k+ R* r( d: L; q% J4 F
{//溢出阀值
if(key_filter1<8)key_filter1++;8 L, C2 E9 k: g2 G
else
{//连续8次才有效
key_delay1=200;//0.2s) c" s/ d+ t" H& n6 D1 ^
//if(key_delay1==0)key_CH1-=GT_GATE;
key_CH1-=(key_CH1>>4);// 15/16 s0 p( U8 s5 w7 ?# E- f ]/ J0 X
key_CH1+=(key_time1>>4);
}
}4 R6 I: K% B! W9 D: r& G
else3 l" e+ ]+ h& V/ b: T
{//未溢出情况下累计基准
key_filter1=0;
key_CH1-=(key_CH1>>4);// 15/16
key_CH1+=(key_time1>>4);
}4 E/ d6 W# X ^: r/ c! u: T
if(key_delay1)
{//在key_delay1不为0期间 K1保持按下状态
key_delay1--;
SET_K1;
}3 q; L7 u; ~2 S
8 ~; l* W Z# L
key_i++;8 Z/ ?* I* f* s ^5 h) A. m
if(key_i>=64)key_i=0; O2 i7 n( A% l6 Y9 a: Z, C' s
key_buf[key_i]=key_time1;
//key_CH1-=(key_CH1>>4);// 15/16. l3 o6 N6 c& R0 u
//key_CH1+=(key_time>>4);
temp=key_value;
key_value=key_value&(key_value^key_shadow);
key_shadow=temp;8 M& W+ A) Y$ y* V r4 _) q+ x9 T
}2 u; k+ X: O2 n. p2 y! m