乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      最簡單的STM32入門教程

       wenming044 2019-04-05

      本文講述的是如何從零開始,使用keil建立一個簡單的STM32的工程,并閃爍LED燈,給小白看。

      第零步,當(dāng)然首先你得有一個STM32的板子,其IO口上接了一個LED。。。

      第一步,建立一個文件夾0.0

      第二步,打開keil,建立工程

      在彈出來的對話框中選擇你所用的STM32的芯片。

      在接下來彈出來的對話框中選擇是,這樣keil就幫我們建立好了啟動文件。

      第三步,新建一個main.c文件,并添加到工程中。

      點(diǎn)擊New按鈕,建立一個文本文件。

      在建立的文本文件中輸入C中的main函數(shù)

      點(diǎn)擊保存

      保存后,將文件添加到工程中

      第四步,點(diǎn)擊編譯

      可以看到keil有報(bào)錯

      錯誤信息為:沒有定義的符號SystemInit,這是因?yàn)樵趩游募杏姓{(diào)用SystemInit函數(shù),但是我們沒有定義它,如下圖:

      暫時不用理會上述啟動文件中匯編的含義,只需在main.c中添加該函數(shù)即可消除該錯誤。

      修改后再編譯,程序沒有報(bào)錯了。至此,一個STM32的工程就建立完成了。

       第五步,將下面的代碼復(fù)制粘貼

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      #define PERIPH_BASE           ((unsigned int)0x40000000)
      #define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
      #define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
      #define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
      #define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
      #define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
      #define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
      #define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
      #define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
      #define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
      #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
      #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
      #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
      #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
      #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
      #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C 
      #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
      #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
      #define LED0  MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
      //#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8
      typedef struct
      {
        volatile unsigned int CR;
        volatile unsigned int CFGR;
        volatile unsigned int CIR;
        volatile unsigned int APB2RSTR;
        volatile unsigned int APB1RSTR;
        volatile unsigned int AHBENR;
        volatile unsigned int APB2ENR;
        volatile unsigned int APB1ENR;
        volatile unsigned int BDCR;
        volatile unsigned int CSR;
      } RCC_TypeDef;
      #define RCC ((RCC_TypeDef *)0x40021000)
      typedef struct
      {
      volatile unsigned int CRL;
      volatile unsigned int CRH;
      volatile unsigned int IDR;
      volatile unsigned int ODR;
      volatile unsigned int BSRR;
      volatile unsigned int BRR;
      volatile unsigned int LCKR;
      } GPIO_TypeDef;
      #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
      void LEDInit(void)
      {
          RCC->APB2ENR|=1<<2; //GPIOA 時鐘開啟
          GPIOA->CRH&=0XFFFFFFF0;
          GPIOA->CRH|=0X00000003; 
      }
      //粗略延時
      void Delay_ms(volatile unsigned int t)
      {
          unsigned int i,n;
          for(n=0;n<t;n++)
              for(i=0;i<800;i++);
      }
      int main(void)
      {
          LEDInit();
          while(1)
          {
              LED0=0;
              Delay_ms(500);
              LED0=1;
              Delay_ms(500);
          }
      }
      void SystemInit(void)
      {
           
      }

      下面一段是對代碼的簡單講解,可不用太深入。

      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      STM32 GPIO輸出高低電平的完整流程如下:

      配置時鐘→配置IO口→IO口輸出高地電平

      1,STM32的時鐘是可以PLL的。但是我這里為了簡化操作,就不配置,只使用默認(rèn)的時鐘----內(nèi)部8MZH振蕩器。

      2,硬件上,我的LED燈是接到PA8。那么,我要怎么控制PA8呢?

      STM32不能像單片機(jī)一樣,一上來就能操作IO口。要操作STM32的IO口,首先要配置IO口。

      void LEDInit(void)

      {

          RCC->APB2ENR|=1<<2;

          GPIOA->CRH&=0XFFFFFFF0;

          GPIOA->CRH|=0X00000003;     

      }

      其中RCC->APB2ENR|=1<<2;是使能GPIOA的時鐘。若是要使能GPIOB的時鐘則是RCC->APB2ENR|=1<<3;其他的以此類推。

          GPIOA->CRH&=0XFFFFFFF0;

          GPIOA->CRH|=0X00000003;   

      是配置PA8為推挽輸出,50MHZ。

      若是要設(shè)置PA9則是:

          GPIOA->CRH&=0XFFFFFF0F;

          GPIOA->CRH|=0X00000030;   

      其他的以此類推,若是PA0~PA7則將CRH改為CRL就行。

      若是要配置其他GPIO口,將GPIOA改成GPIOB,GPIOC。。。就行。,

      3,我們知道51單片機(jī)是可以單獨(dú)控制每個IO口的,STM32也可以做到,這個機(jī)制叫做Bit-Bond。

      參考《Cortex-M3權(quán)威指南》可知道,只要找到PA8輸出寄存器在Bit-Bond的地址,即可操作PA8的輸出。地址的計(jì)算方法如下圖:

      《Cortex-M3權(quán)威指南》還給出了C語言宏定義的方法,我們可以直接使用。

       /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      將上述代碼輸入后,點(diǎn)開配置選項(xiàng),配置如下:

      勾上 Create HEX File

      選擇J-Link下載工具

      再次build,然后下載就大功告成啦。

      綜上可以看出,若是不配置STM32的PLL,那么相對于51單片機(jī),STM32閃爍LED燈只不過多了一個步驟----配置GPIO口為輸出而已。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多