8.3 電容觸摸例程
現在PA1端口接一個觸摸按鍵(一塊銅箔),利用PA1的觸摸按鍵控制PA0端口的LED狀態,按下時LED點亮,抬起時LED熄滅。
(1)新建基礎工程,并創建tpad.c,tpad.h,led.c和led.h文件,并導入工程,如下圖所示。
(2)在tpad.h文件內添加以下代碼。
(3)在led.h文件內添加以下代碼
(4)在led.c文件中添加以下代碼
(5)在tpad.c文件內添加以下代碼
#include "tpad.h"
#include "delay.h"
/***************************************************
Name :TPAD_Get_Value
Function :觸摸按鍵值獲取
Paramater :None
Return :獲取的充電時間
***************************************************/
u16 TPAD_Get_Value()
{
//電容放電
GPIOA->CRL &= 0xFFFFFF0F ; //PA1輸入
GPIOA->CRL |= 0x00000030 ; //推挽輸出
GPIOA->ODR &= ~( 1<<1 ) ; //輸出低電平放電
delay_ms( 5 ) ;
TIM5->SR = 0 ; //清除標記
TIM5->CNT = 0 ; //歸零
GPIOA->CRL &= 0xFFFFFF0F ; //PA1輸入
GPIOA->CRL |= 0x00000040 ; //浮空輸入
//等待捕獲上升沿
while( ( TIM5->SR&0x04 )==0 )
{
if( TIM5->CNT>( 65535-500 ) )
return TIM5->CNT ;
}
return TIM5->CCMR2 ;
}
/***************************************************
Name :TPAD_Get_MaxVal
Function :觸摸按鍵最大值獲取
Paramater :None
Return :獲取的最大充電時間
***************************************************/
u16 TPAD_Get_MaxVal( u8 n )
{
u16 temp=0;
u16 res=0;
while( n-- )
{
temp = TPAD_Get_Value() ;
if( temp>res )
res = temp ;
}
return res ;
}
/***************************************************
Name :TPAD_Init
Function :觸摸按鍵初始化
Paramater :None
Return :None
***************************************************/
TPADData TPAD_Data ;
void TPAD_Init()
{
u16 buff[ 10 ], temp ;
u8 i, j ;
RCC->APB2ENR |= 1<<2 ;
GPIOA->CRL &= 0xFFFFFF0F ; //PA1 輸入
GPIOA->CRL |= 0x00000040 ; //浮空輸入
RCC->APB1ENR |= 1<<3 ; //TIM5時鐘開啟
TIM5->ARR = 65535 ;
TIM5->PSC = 5 ;
TIM5->CCMR1 |= 1<<8 ; //選擇輸入端IC2映射到TI2上
TIM5->CCMR1 &= ~( 1<<12 ) ; //采樣頻率8分頻
TIM1->CCMR1 &= ~( 1<<10 ) ; //配置輸入不分頻
TIM5->CCER &= ~( 1<<5 ) ; //上升沿捕獲
TIM5->CCER |= 1<<4 ; //允許捕獲功能
TIM5->CR1 |= 1<<0 ; //開啟定時器5
//連續采樣10次
for( i=0; i<10; i++ )
{
buff[ i ] = TPAD_Get_Value() ;
delay_ms( 10 ) ;
}
//排序
for( i=0; i<9; i++ )
{
for( j=i+1; j<10; j++ )
{
//升序排列
if( buff[ i ]>buff[ j ] )
{
temp= buff[ i ] ;
buff[ i ] = buff[ j ] ;
buff[ j ] = temp ;
}
}
}
temp = 0 ;
//獲取中間數據的均值
for( i=2; i<8; i++ )
temp += buff[ i ] ;
TPAD_Data.value = temp/6 ;
}
/***************************************************
Name :TPAD_Scan
Function :觸摸按鍵掃描
Paramater :None
Return :None
***************************************************/
void TPAD_Scan()
{
u16 rval ;
rval = TPAD_Get_MaxVal( 3 ) ;
if( rval>( TPAD_Data.value+100 ) )
TPAD_Data.State = 1 ; //手指按下
}
(6)在1.c文件內添加主函數
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "led.h"
#include "tpad.h"
int main()
{
STM32_Clock_Init( 9 ) ; //STM32時鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LED_Init() ; //LED初始化
TPAD_Init() ; //觸摸按鍵初始化
while( 1 )
{
TPAD_Scan() ; //觸摸按鍵掃描
if( TPAD_Data.State==1 )
{
LED = 0 ;
TPAD_Data.State = 0 ;
}
else
LED = 1 ;
}
}
——————————————分割線——————————————
8.4 STM32工程管理
這里的總結是針對與之前所學的所有嵌入式內容進行總結,隨著后續代碼越來越多,對于工程的管理顯得格外重要,不僅僅是采用本章節介紹的方法管理工程代碼,對于后續的Linux開發和操作系統移植也最好是按照固定的工程格式進行管理。
對于STM32的工程可以劃分為以下幾個部分:
(1)過程文件以及最終生成的hex文件:這些文件通通放置在工程1級目錄下的OBJECT文件中,文件中的內容如下圖所示。
圖中標注部分就是最終生成的hex文件,其他的文件均屬于過程文件,集成開發系統IDE編譯的實質其實就是采用gcc交叉編譯器將我們編寫的代碼轉換成對應的機器代碼的過程,具體的步驟會在Linux系統移植中描述,這里只需要知道利用交叉編譯器進行編譯的時候會產生大量的鏈接文件和過程文件,這些文件統統放置在OBJECT目錄下。將工程文件中的過程文件放置在該目錄下的設置方式如下圖所示。
(2)主函數文件及主工程文件:在Keil中創建的工程,以及包括main函數的c文件都位于這個目錄內。
圖中標注的3個文件都是必不可少的文件,帶有Keil圖標的文件就是工程文件,里面包含了整個工程所需的頭文件,文件路徑以及編譯器位置,文本文件圖標的則是c文件,main函數就放在這個位置,.s后綴的為匯編啟動文件,用于幫助芯片創建C代碼運行環境,初始化堆棧等功能,為了達到最快效率,所以采用匯編語言來編寫這個文件。
(3)自定義系統文件:自定義的系統文件位于SYSTEM目錄中,目錄內有3個子目錄,分別是sys,delay和usart1。
delay目錄:是利用SysTick時鐘來實現的延時功能,主要有毫秒級延時和微秒級延時;
usart1目錄:則是利用串口1來實現printf打印輸出的功能,主要用于調試數據的輸出;
sys目錄:是最基礎的工程文件,這個目錄內有1個c文件和2個h文件,c文件主要實現STM32時鐘樹的配置和中斷系統的設置功能,是C函數中最重要的一個文件,stmxx.h文件則是最底層的寄存器定義文件,里面定義了STM32芯片內部所有寄存器的地址和結構,通過C語言來調用這里面的寄存器實現芯片的控制功能。
(4)驅動文件:驅動文件位于HEADERWARE目錄中,用于存放項目所用到的驅動,比如之前實驗所用到的LED,KEY,TIM這些外設都屬于驅動文件內容。
至此整個工程的目錄結構如下圖所示。
-
單片機
+關注
關注
6037文章
44562瀏覽量
635757 -
STM32
+關注
關注
2270文章
10903瀏覽量
356276 -
電容觸摸
+關注
關注
0文章
70瀏覽量
16458
發布評論請先 登錄
相關推薦
評論