新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 【Alientek STM32 實驗2】--按鍵輸入

        【Alientek STM32 實驗2】--按鍵輸入

        作者: 時間:2016-11-25 來源:網絡 收藏
        上一節介紹了STM32的IO口輸出,這一節,我們將向大家介紹如何使用STM32的IO口作為輸入用。通過本節的學習,你將了解到STM32的IO口作為輸入使用的方法。本節分為如下幾個小節:

        3.2.1 STM32 IO口簡介

        本文引用地址:http://www.104case.com/article/201611/321132.htm

        3.2.2硬件設計

        3.2.3軟件設計

        3.2.1 STM32 IO口簡介

        STM32的IO口在上一節已經有了詳細的介紹,這里我們不再多說。STM32的IO口做輸入使用的時候,是通過讀取IDR的內容來讀取IO口的狀態的。了解了這點,就可以開始我們的代碼編寫了。

        這一節,我們將通過MiniSTM32板上載有的3個按鈕,來控制板上的2個LED,其中KEY0控制DS0,按一次亮,再按一次,就滅。KEY1控制DS1,效果同KEY0。KEY_2(KEY_UP),同時控制DS0和DS1,按一次,他們的狀態就翻轉一次。

        3.2.2硬件設計

        該實驗所需要的硬件電路在MiniSTM32開發板上都已經連接好了,不需要經過任何設置,直接編寫代碼就可。LED的連接在上一節已經介紹過了,在MiniSTM32開發板上的按鍵KEY0是接在PA13上,KEY1是接在PA15上的,WK_UP(KEY2)接在PA0上。如下圖所示:

        按鈕新建一個文件,然后保存在HARDWARE->KEY文件夾下面,保存為key.c。在該文件中輸入如下代碼:

        #include

        #include "key.h"

        #include "delay.h"

        //Mini STM32開發板

        //按鍵輸入驅動代碼

        //正點原子@ALIENTEK

        //2010/5/27

        //按鍵初始化函數

        //PA0.13.15設置成輸入

        void KEY_Init(void)

        {

        RCC->APB2ENR|=1<<2;//使能PORTA時鐘

        RCC->APB2ENR|=1<<0;//開啟輔助時鐘

        AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]

        AFIO->MAPR|=0X04000000; //關閉JTAG

        GPIOA->CRL&=0XFFFFFFF0;//PA0設置成輸入

        GPIOA->CRL|=0X00000008;

        GPIOA->CRH&=0X0F0FFFFF;//PA13,15設置成輸入

        GPIOA->CRH|=0X80800000;

        GPIOA->ODR|=1<<13;//PA13上拉,PA0默認下拉

        GPIOA->ODR|=1<<15;//PA15上拉

        }

        //按鍵處理函數

        //返回按鍵值

        //0,沒有任何按鍵按下

        //1,KEY0按下

        //2,KEY1按下

        //3,KEY2按下

        //注意此函數有響應優先級,KEY0>KEY1>KEY2!!

        u8 KEY_Scan(void)

        {

        static u8 key_up=1;//按鍵按松開標志

        if(key_up&&(KEY0==0||KEY1==0||KEY2==1))

        {

        delay_ms(10);//去抖動

        key_up=0;

        if(KEY0==0)return 1;

        else if(KEY1==0)return 2;

        else if(KEY2==1)return 3;

        }else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;

        return 0;//無按鍵按下

        }

        在段代碼包含了2個函數,void KEY_Init(void)和u8 KEY_Scan(void),KEY_Init是用來初始化按鍵輸入的IO口的。實現PA0、PA13、PA15的輸入設置,這里和上一節的輸出配置不同,還有一個JTAG的禁用設置。

        JTAG的禁用,是通過AFIO的MAPR寄存器來配置的。要對復用IO口配置,必須先啟用AFIO時鐘,AFIO的時鐘使能在APB2ENR寄存器里面設置。如下句,就是使能AFIO的時鐘:

        RCC->APB2ENR|=1<<0;//開啟輔助時鐘

        在使能了AFIO時鐘之后,我們就可以對AFIO的相關寄存器進行設置了。這里我們要關閉JTAG,與JTAG設置相關的寄存器是AFIO->MAPR寄存器。該寄存器的各位描述如下:


        圖3.2.3.2AFIO->MAPR寄存器各位描述

        其中SWJ_CFG[2:0](AFIO->MAPR[26:24])是與JTAG相關的配置寄存器位,這幾位的具體設置以及其對應的描述如下:


        圖3.2.3.2SWJ_CFG位段設置關系

        在這里我們把JTAG和SW口全部禁用了,設置AFIO->MAPR [26:24]為100,如下:

        AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]

        AFIO->MAPR|=0X04000000; //關閉JTAG

        以上在設置MAPR的[26:24]位的時候,我們先把這幾位清空,然后在置位這幾個位。這樣,才不會影響之前對AFIO->MAPR的設置。這一點在以后的寄存器配置的時候,大家一定要注意,否則,可能引起之前的配置失效!


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南丹县| 南漳县| 通海县| 东阳市| 台中县| 洪泽县| 太保市| 西贡区| 望谟县| 突泉县| 禹州市| 正阳县| 云梦县| 花垣县| 海南省| 乐平市| 茌平县| 三明市| 含山县| 额济纳旗| 绥滨县| 巴彦淖尔市| 准格尔旗| 于田县| 綦江县| 梅州市| 平度市| 论坛| 台中县| 沛县| 密云县| 巩义市| 元谋县| 安溪县| 南岸区| 北川| 灵宝市| 金溪县| 甘肃省| 武义县| 垦利县|