新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 為什么要學STM32?答案就在這里

        為什么要學STM32?答案就在這里

        作者: 時間:2018-10-22 來源:網絡 收藏

          為什么要學?

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

          是32位的卻只要八位的價格,速度也是八位的好幾倍。

          更重要的是它作為ARM入門級的芯片比較容易掌握,網上資料也很多,很多人都在用。

          的IO端口有7個寄存器來控制,但是我們常用的就4個CRL CRH IDR ODR 。

          端口配置低寄存器(GPIOx_CRL)

          端口配置高寄存器(GPIOx_CRH)

          端口輸入數據寄存器(GPIOx_IDR)

          端口輸出數據寄存器(GPIOx_ODR)

          其中CRL 控制高8位的 IO CRH 低8這兩個實質是一樣的。

          對照我們AVR來看GPIOx_CRL就相當于DDRx ,GPIOx_ODR就相當于PORTx,GPIOx_ODR就相當于PINxSTM32的 IO 口可以由 口可以由 軟件配置成 軟件配置成 軟件配置成 8種模式: 種模式:



          1、輸入浮空

          2、輸入上拉

          3、輸入下拉

          4、模擬輸入

          5、開漏輸出

          6、推挽輸出

          7、推挽式復用功能

          8、開漏復用功能

          簡單的來說STM32的CRL寄存器可以設置輸入、輸出模式,還可以設置輸出的最大速率。

          輸入浮空 :既不是上拉也不是下拉輸入。

          開漏模式和推挽模式:弱上拉和下拉電阻被禁止,開漏模式時,讀輸入數據寄存器時可得到I/O口狀態,推挽模式時,讀輸出數據寄存器時可得到最后一次寫的值,模擬輸入配置。弱上拉和下拉電阻被禁止讀取輸入數據寄存器時數值為’0’。

          好接下來要說下一個常常聽到的控制方法了,直接操作寄存器和庫函數方法直接操作寄存器就是直接對CRL等寄存器寫值。庫函數是ST官方吧所有的控制都寫好了,我們只需要調用。直接操作寄存器

          GPIOA-CRH=0XFFFFFFF0;

          GPIOA-CRH|=0X00000003;/PA8 推挽輸出

          GPIOA-ODR|=18; /PA8 輸出高

          庫函數

          GPIO_InitTypeDef GPIO_InitStruct;

          GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12 ;

          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

          GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

          GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;

          GPIO_Init(GPIOA, GPIO_InitStruct);

          GPIO_SetBits(GPIOA, GPIO_Pin_11 | GPIO_Pin_12 );

          現在寫一個LED的初始化

          直接操作寄存器

          /LED IO初始化

          void LED_Init(void)

          {

          RCC-APB2ENR|=12; /使能PORTA時鐘

          GPIOA-CRH=0XFFFFFFF0; /PA8 推挽輸出

          GPIOA-CRH|=0X00000003;/速率

          GPIOA-ODR|=18; /PA8 輸出高 一開始高滅燈

          }

          注:先要使能PORTA時鐘

          庫函數

          void LED_Init(void)

          {

          GPIO_InitTypeDefGPIO_InitStructure; /聲明結構體ST庫

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/使能PA端口時鐘

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;/LED0--PA.8 端口配置

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /速率

          GPIO_Init(GPIOA, GPIO_InitStructure); /結構體初始化

          GPIO_SetBits(GPIOA,GPIO_Pin_8);/PA.8 輸出高

          }

          OK到這兩種方法的初始化都OK了

          main 函數

          int main(void)

          {

          SystemInit(); /系統時鐘初始化為72M SYSCLK_FREQ_72MHz

          delay_init(72); /延時函數初始化

          NVIC_Configuration(); /設置NVIC中斷分組2:2位搶占優先級,2位響應優先級

          LED_Init(); /LED端口初始化

          while(1)

          {

          LED0=0;/也可以使用 (庫)GPIO_ResetBits(GPIOA,GPIO_Pin_8);

          /寄存器GPIOA-ODR=~(18);

          delay_ms(300);

          LED0=1; /也可以使用 GPIO_SetBits(GPIOA,GPIO_Pin_8);

          /寄存器 GPIOA-ODR|=18;

          delay_ms(300);

          }

          }

          使能PORTA時鐘,這里說明下STM32的時鐘樹和AVR51等有很大的區別,它每個外設都會有自己的時鐘,要使用一個外設必須要先開外設的時鐘。這樣也一定程度上減少了功耗。



        關鍵詞: STM32 單片機

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 金秀| 平武县| 北海市| 呈贡县| 石嘴山市| 济南市| 高陵县| 石首市| 维西| 二连浩特市| 乐都县| 射阳县| 青浦区| 津市市| 九龙县| 九寨沟县| 合水县| 边坝县| 宁远县| 襄城县| 宁国市| 武邑县| 定边县| 什邡市| 龙口市| 额敏县| 珠海市| 天津市| 雷山县| 和林格尔县| 礼泉县| 新乡县| 阿勒泰市| 汕尾市| 吉木乃县| 吉林市| 儋州市| 台湾省| 黄大仙区| 平阳县| 启东市|