新聞中心

        STM32 GPIO BRR和BSRR寄存器

        作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
        使用BRRBSRR寄存器可以方便地快速地實(shí)現(xiàn)對端口某些特定位的操作,而不影響其它位的狀態(tài)。

        比如希望快速地對GPIOE的位7進(jìn)行翻轉(zhuǎn),則可以:

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

        GPIOE->BSRR = 0x80; // 置1
        GPIOE->BRR = 0x80; // 置0

        如果使用常規(guī)讀-改-寫的方法:

        GPIOE->ODR = GPIOE->ODR | 0x80; // 置1
        GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置0

        有人問是否BSRR的高16位是多余的,請看下面這個例子:

        假如你想在一個操作中對GPIOE的位7置1,位6置0,則使用BSRR非常方便:
        GPIOE->BSRR = 0x00400080;

        如果沒有BSRR的高16位,則要分2次操作,結(jié)果造成位7和位6的變化不同步!
        GPIOE->BSRR = 0x80;
        GPIOE->BRR = 0x40;

        規(guī)則:

        一、置GPIOD->BSRR低16位的某位為1,則對應(yīng)的I/O端口置1;而置GPIOD->BSRR低16位

        的某位為0,則對應(yīng)的I/O端口不變。

        二、置GPIOD->BSRR高16位的某位為1,則對應(yīng)的I/O端口置0;而置GPIOD->BSRR高16位

        的某位為0,則對應(yīng)的I/O端口不變。

        三、置GPIOD->BRR低16位的某位為1,則對應(yīng)的I/O端口置0;而置GPIOD->BRR低16位的

        某位為0,則對應(yīng)的I/O端口不變。

        例如:

        1)要設(shè)置D0、D5、D10、D11為高,而保持其它I/O口不變,只需一行語句:

        GPIOD->BSRR = 0x0C21;// 使用規(guī)則一

        2)要設(shè)置D1、D3、D14、D15為低,而保持其它I/O口不變,只需一行語句:

        GPIOD->BRR = 0xC00A;// 使用規(guī)則三

        3)要同時設(shè)置D0、D5、D10、D11為高,設(shè)置D1、D3、D14、D15為低,而保持其它I/O口不變

        ,也只需一行語句:

        GPIOD->BSRR = 0xC00A0C21;// 使用規(guī)則一和規(guī)則二

        如果中斷中要對IO口設(shè)置,最好使用BSRR和BRR操作,而不要用ODR .



        關(guān)鍵詞: STM32GPIOBRRBSRR寄存

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 蒙自县| 大姚县| 普洱| 赤水市| 徐闻县| 湘乡市| 女性| 江津市| 太谷县| 黎川县| 游戏| 洪泽县| 奉贤区| 重庆市| 三台县| 阳西县| 宜阳县| 福清市| 泰兴市| 称多县| 渭南市| 舒城县| 新绛县| 井研县| 原平市| 汉川市| 锦州市| 芒康县| 陈巴尔虎旗| 四川省| 安国市| 太康县| 西贡区| 乌拉特中旗| 会同县| 墨脱县| 满城县| 呼图壁县| 玉田县| 建宁县| 北票市|