新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32入門筆記(3)——GPIO

        STM32入門筆記(3)——GPIO

        作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        STM32的每個I/O口都由7個寄存器控制:2個32位端口配置寄存器CRL和CRH;2個32位的數(shù)據(jù)寄存器IDR和ODR;1個32位的置位復(fù)位寄存器BSRR;1個16位的復(fù)位寄存器BRR;1個32位的鎖存寄存器LCKR;最常用的有4個:CRL/CRH/IDR/ODR;因此通常情況下只需要配置好以上四個寄存器就可以了。而CRH和CRL作用是完全一樣的,只不過CRH控制的是高8位的IO而CRL控制的是低8位的,因此IO的控制就顯的比較簡單了。

        (1)使能IO時鐘

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

        老規(guī)矩,用到哪個IO使能哪組IO時鐘。例:RCC->APB2ENR|=1<<2; // 使能PORTA時鐘

        (2)配置IO輸入/輸出模式

        STM32的輸入輸出管腳有下面8種可能的配置:(4輸入+2輸出+2復(fù)用輸出)。例:設(shè)置PORTC的11位為上拉輸入,12位為推挽輸出

        GPIOC->CRH&=0XFFF00FFF; // 清除這2位原來設(shè)置

        GPIOC->CRH|=0X00038000; // PC11輸入,PC12輸出

        GPIOC->ODR|=1<<11; // PC11上拉

        (3)IO作為輸入時判斷IO高低電平

        例:判斷PORTC的11位是否為低

        if((GPIOC->IDR&1<<11)==0)

        //用戶代碼;

        小結(jié):

        上電后IO默認(rèn)為浮空輸入狀態(tài);當(dāng)輸出速率為50M時,八種I/O模式CRH/CRL配置為:通用推挽輸出:0x3;通用開漏輸出:0x7;復(fù)用推挽輸出:0xb;復(fù)用開漏輸出:0xf;模擬輸入:0x0;浮空輸入:0x4(上電默認(rèn));下/上拉輸入:0x8;

        I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅(qū)動電路的響應(yīng)速度而不是輸出信號的速度,輸出信號的速度與程序有關(guān)(芯片內(nèi)部在I/O口的輸出部分安排了多個響應(yīng)速度不同的輸出驅(qū)動電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動電路)。通過選擇速度來選擇不同的輸出驅(qū)動模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動電路,噪聲也高,當(dāng)不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配(推薦10倍以上?)。

        比如:

        對于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引腳速度就夠了,既省電也噪聲小。

        對于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。

        對于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。

        點亮LED例程:(正點原子開發(fā)板)

        [cpp]view plaincopy
        1. //點亮第一個LED燈,不用位映射
        2. #include"sys.h"
        3. #include"delay.h"
        4. intmain(void)
        5. {
        6. Stm32_Clock_Init(9);//初始化系統(tǒng)時鐘
        7. delay_init(72);//延時初使化
        8. RCC->APB2ENR|=1<<2;//使能PORTA時鐘
        9. GPIOA->CRH&=0XFFFFFFF0;//清PA8
        10. GPIOA->CRH|=0X03;//設(shè)置PA8為推挽輸出
        11. GPIOA->ODR&=0<<8;//初始化PA8輸出0
        12. while(1)
        13. {
        14. GPIOA->ODR|=1<<8;//設(shè)置PA8輸出1,led
        15. delay_ms(1000);//延時1s
        16. GPIOA->ODR&=0<<8;//設(shè)置PA8輸出0,led亮
        17. delay_ms(1000);//延時1s
        18. }
        19. }//位映射法點亮LED,不過于糾結(jié)位映射的具體實現(xiàn)
        20. #include"sys.h"
        21. #include"delay.h"
        22. intmain(void)
        23. {
        24. Stm32_Clock_Init(9);//初始化系統(tǒng)時鐘
        25. delay_init(72);//延時初使化
        26. RCC->APB2ENR|=1<<2;//使能PORTA時鐘
        27. GPIOA->CRH&=0XFFFFFFF0;//清PA8
        28. GPIOA->CRH|=0X03;//設(shè)置PA8為推挽輸出
        29. PAout(8)=1;
        30. while(1)
        31. {
        32. PAout(8)=0;
        33. delay_ms(1000);//延時1s
        34. PAout(8)=1;//設(shè)置PA8輸出0,led亮
        35. delay_ms(1000);//延時1s
        36. }



        關(guān)鍵詞: STM32入門筆記GPI

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 牡丹江市| 洞口县| 禹城市| 什邡市| 南溪县| 北京市| 昌都县| 巴彦县| 湘乡市| 香格里拉县| 商都县| 罗源县| 德清县| 巴彦县| 泰来县| 汽车| 贵阳市| 周宁县| 永吉县| 凤翔县| 隆子县| 新建县| 平谷区| 兴安县| 修水县| 达日县| 新竹市| 伊川县| 长阳| 固镇县| 崇州市| 孙吴县| 定安县| 壶关县| 封丘县| 汉寿县| 上思县| 麟游县| 耿马| 扎鲁特旗| 吉林市|