標(biāo)題: 聽(tīng)說(shuō)你害怕學(xué)stm32?專治stm32的辦法來(lái)了,stm32仿C51操作方式操作IO口(支持P... [打印本頁(yè)]

作者: Angle145    時(shí)間: 2018-6-18 15:26
標(biāo)題: 聽(tīng)說(shuō)你害怕學(xué)stm32?專治stm32的辦法來(lái)了,stm32仿C51操作方式操作IO口(支持P...
寫(xiě)給初學(xué)stm32的小白,如果你不想深入學(xué)習(xí)stm32,又想用stm32的高性能優(yōu)點(diǎn)來(lái)替換C51,那么這里提供了stm32變C51的一個(gè)捷徑,有的人可能會(huì)有疑問(wèn),這會(huì)不會(huì)降低stm32的速度,這你完全不用擔(dān)心,因?yàn)檫@個(gè)位綁定就是stm32自身提供的功能,屬于硬件級(jí)別的支持,所以放心大膽使用吧,對(duì)于老手,有的人可能會(huì)嘲笑stm32跑去仿C51這不是倒退么,其實(shí)不然,只要是方便快捷的東西我們就保持,不好的就丟棄而不是一味否認(rèn)舊東西。從51轉(zhuǎn)32的同學(xué)大部分都是不適應(yīng)的,以前都是直接操作寄存器,現(xiàn)在全是庫(kù)函數(shù),一大串長(zhǎng)長(zhǎng)的庫(kù)函數(shù)名就讓人頭疼,這還是標(biāo)準(zhǔn)庫(kù),現(xiàn)在ST公司又大力主推HAL庫(kù),對(duì)于剛學(xué)完標(biāo)準(zhǔn)庫(kù)的同學(xué)又是一棒打擊,因?yàn)閷W(xué)習(xí)成本和學(xué)習(xí)時(shí)間太多了,有的人則說(shuō)學(xué)什么庫(kù)函數(shù),直接學(xué)寄存器操作,那么我想說(shuō),除非你在自?shī)首詷?lè),因?yàn)橄胍钊雽W(xué)習(xí),你不僅要學(xué)會(huì)寫(xiě)代碼,而且要能讀懂別人的代碼,現(xiàn)在網(wǎng)上大多數(shù)stm32程序都是庫(kù)函編寫(xiě),所以你不想學(xué)也必須學(xué),stm32f1由于出的早,大多數(shù)資料例程都是標(biāo)準(zhǔn)庫(kù)函數(shù)編寫(xiě)的,而f7已經(jīng)開(kāi)始不支持標(biāo)準(zhǔn)庫(kù)了,f4處于中間的尷尬位置,雖有標(biāo)準(zhǔn)庫(kù)支持,但是st已經(jīng)停止更新,主推hal庫(kù)。所以說(shuō)想深入學(xué)習(xí),hal庫(kù)是最好的選擇,優(yōu)點(diǎn)是一次編寫(xiě),全st平臺(tái)適用,缺點(diǎn)是單片機(jī)效率降低。話不多說(shuō),對(duì)stm32f1來(lái)說(shuō),C51操作方式還是不可能過(guò)時(shí)的,因?yàn)樗?1和32之間的橋梁。


stm32f1系位綁定實(shí)現(xiàn)的stm32仿C51方式配置和操作GPIO口,自從用上這個(gè)就回不去了。
部分代碼如下:
  1. /*--------------------P口輸入輸出模式配置----------------------------------------
  2. 使用說(shuō)明:
  3. //舉例:       PA0_OUT;   //PA0配置成推挽輸出模式
  4.               PA0=1;     //PA0輸出1
  5.               ...
  6.               PA0=0;     //PA0輸出0
  7.               當(dāng)需要PA0改為輸入時(shí),需要在使用前配置成輸入
  8.                                                         PA0_IN;    //PA0配置成上下拉輸入
  9.                                                         PA0=1;     //PA0配置成上拉輸入(PA0=0配置成下拉輸入)
  10.                                                         if(PA0in==0) PA11=1;  //讀取PA0的電平狀態(tài)
  11.                                                         當(dāng)PA0作為輸入使用完畢,PA0口又繼續(xù)上面的輸出工作,則重新再配置一次
  12.                                                         PA0_OUT;   //恢復(fù)PA0為輸出
  13.                                                         PA0=0;     //PA0輸出0
  14.                                                         
  15.                                                         PA_OUT;    //PA(16個(gè)IO口)配置成推挽輸出模式
  16.                                                         PA=0xFF00; //高8位輸出1,低8位輸出0
  17.                                                         PA_IN;     //PA(16個(gè)IO口)配置成上下拉輸入
  18.                                                         PA=0xFFFF; //PA(16個(gè)IO口)配置成上拉輸入
  19.                                                         PB0_OUT;   //PB0配置成推挽輸出模式
  20.                                                         if(PAin==0xFFFF)  PB0=1;   //如果PA16個(gè)IO都等于1,則PB0置1
  21.                                                         //注:讀取IO口時(shí),先配置成輸入,IO名要加in作為讀取識(shí)別,這是唯一一點(diǎn)和C51不同的地方
  22. _OUT          --推挽輸出
  23. _OUT_AF       --復(fù)用功能輸出
  24. _IN           --上下拉輸入  輸入前,P口置1,則是上拉輸入,反之是下拉輸入
  25. _IN_AN        --模擬輸入

  26. PA0_OUT;      //配置單個(gè)IO口為輸出模式
  27. PA0_OUT_AF;   //配置單個(gè)IO口為復(fù)用功能輸出模式
  28. PA0_IN;       //配置單個(gè)IO口為輸入模式
  29. PA0_IN_AN;    //配置單個(gè)IO口為模擬輸入模式
  30. PA_OUT;       //配置整個(gè)PA口(16個(gè)IO)為輸出模式
  31. PA_IN;        //配置整個(gè)PA口(16個(gè)IO)為輸入模式

  32. 注:PB3,PB4(JNTRST),PA13(SWD),PA14(SWC),PA15  為JTAG/SWD仿真器的調(diào)試接口(上電默認(rèn)為JTAG功能,不能用于普通IO口功能)
  33.     關(guān)閉對(duì)應(yīng)的的調(diào)試接口功能才能作為普通IO口使用,調(diào)試接口調(diào)置命令如下:
  34.                 SWJ_ON          ---SW+JTAG功能都打開(kāi)(上電默認(rèn)狀態(tài)),         PB3,PB4,PA13,PA14,PA15不能用作普通IO口功能   
  35.                 SWJ_NOJNTRST   ---SW+JTAG功能都打開(kāi),但是不用JTAG復(fù)位引腳(PB4),PB4用作普通IO口功能
  36.                 SWON_JTAGOFF   ---SW功能打開(kāi),JTAG功能關(guān)閉,            PB3,PB4,PA15用作普通IO口功能
  37.                 SWJ_OFF        ---SW+JTAG功能都關(guān)閉,但能用ST-LINK,        PB3,PB4,PA13,PA14,PA15用作普通IO口功能
  38. ----------------------------------------------------------------------------------*/
  39. #ifndef _C51MODE_H
  40. #define _C51MODE_H

  41. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  42. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
  43. #define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) )
  44. #define GPIOA_ODR_Addr (GPIOA_BASE+0x0C) //0x4001080C
  45. #define GPIOB_ODR_Addr (GPIOB_BASE+0x0C) //0x40010C0C
  46. #define GPIOC_ODR_Addr (GPIOC_BASE+0x0C) //0x4001100C
  47. #define GPIOD_ODR_Addr (GPIOD_BASE+0x0C) //0x4001140C
  48. #define GPIOE_ODR_Addr (GPIOE_BASE+0x0C) //0x4001180C
  49. #define GPIOF_ODR_Addr (GPIOF_BASE+0x0C) //0x40011808
  50. #define GPIOG_ODR_Addr (GPIOG_BASE+0x0C) //0x40011808
  51. #define GPIOA_IDR_Addr (GPIOA_BASE+0x08) //0x40010808
  52. #define GPIOB_IDR_Addr (GPIOB_BASE+0x08) //0x40010C08  
  53. #define GPIOC_IDR_Addr (GPIOC_BASE+0x08) //0x40011008
  54. #define GPIOD_IDR_Addr (GPIOD_BASE+0x08) //0x40011408
  55. #define GPIOE_IDR_Addr (GPIOE_BASE+0x08) //0x40011808
  56. #define GPIOF_IDR_Addr (GPIOF_BASE+0x08) //0x40011808
  57. #define GPIOG_IDR_Addr (GPIOG_BASE+0x08) //0x40011808
  58. //-----------------------------------------------------

  59. /*---------------------------------PA口引腳功能配置------------------------------------------*/
  60. #define PA0_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000003
  61. #define PA1_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000030
  62. #define PA2_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000300
  63. #define PA3_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00003000
  64. #define PA4_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00030000
  65. #define PA5_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00300000
  66. #define PA6_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x03000000
  67. #define PA7_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x30000000
  68. #define PA8_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000003
  69. #define PA9_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000030
  70. #define PA10_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000300
  71. #define PA11_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00003000
  72. #define PA12_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00030000
  73. #define PA13_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00300000
  74. #define PA14_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x03000000
  75. #define PA15_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x30000000
  76. #define PA0_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000008
  77. #define PA1_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000080
  78. #define PA2_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000800
  79. #define PA3_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00008000
  80. #define PA4_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00080000
  81. #define PA5_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00800000
  82. #define PA6_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x08000000
  83. #define PA7_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x80000000
  84. #define PA8_IN   RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000008
  85. #define PA9_IN   RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000080
  86. #define PA10_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000800
  87. #define PA11_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00008000
  88. #define PA12_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00080000
  89. #define PA13_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00800000
  90. #define PA14_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x08000000
  91. #define PA15_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x80000000


  92. #define PA0    BIT_ADDR(GPIOA_ODR_Addr, 0) //輸出
  93. #define PA1    BIT_ADDR(GPIOA_ODR_Addr, 1) //輸出
  94. #define PA2    BIT_ADDR(GPIOA_ODR_Addr, 2) //輸出
  95. #define PA3    BIT_ADDR(GPIOA_ODR_Addr, 3) //輸出
  96. #define PA4    BIT_ADDR(GPIOA_ODR_Addr, 4) //輸出
  97. #define PA5    BIT_ADDR(GPIOA_ODR_Addr, 5) //輸出
  98. #define PA6    BIT_ADDR(GPIOA_ODR_Addr, 6) //輸出
  99. #define PA7    BIT_ADDR(GPIOA_ODR_Addr, 7) //輸出
  100. #define PA8    BIT_ADDR(GPIOA_ODR_Addr, 8) //輸出
  101. #define PA9    BIT_ADDR(GPIOA_ODR_Addr, 9) //輸出
  102. #define PA10   BIT_ADDR(GPIOA_ODR_Addr, 10) //輸出
  103. #define PA11   BIT_ADDR(GPIOA_ODR_Addr, 11) //輸出
  104. #define PA12   BIT_ADDR(GPIOA_ODR_Addr, 12) //輸出
  105. #define PA13   BIT_ADDR(GPIOA_ODR_Addr, 13) //輸出
  106. #define PA14   BIT_ADDR(GPIOA_ODR_Addr, 14) //輸出
  107. #define PA15   BIT_ADDR(GPIOA_ODR_Addr, 15) //輸出
  108. #define PA0in  BIT_ADDR(GPIOA_IDR_Addr, 0) //輸入
  109. #define PA1in  BIT_ADDR(GPIOA_IDR_Addr, 1) //輸入
  110. #define PA2in  BIT_ADDR(GPIOA_IDR_Addr, 2) //輸入
  111. #define PA3in  BIT_ADDR(GPIOA_IDR_Addr, 3) //輸入
  112. #define PA4in  BIT_ADDR(GPIOA_IDR_Addr, 4) //輸入
  113. #define PA5in  BIT_ADDR(GPIOA_IDR_Addr, 5) //輸入
  114. #define PA6in  BIT_ADDR(GPIOA_IDR_Addr, 6) //輸入
  115. #define PA7in  BIT_ADDR(GPIOA_IDR_Addr, 7) //輸入
  116. #define PA8in  BIT_ADDR(GPIOA_IDR_Addr, 8) //輸入
  117. #define PA9in  BIT_ADDR(GPIOA_IDR_Addr, 9) //輸入
  118. #define PA10in BIT_ADDR(GPIOA_IDR_Addr, 10) //輸入
  119. #define PA11in BIT_ADDR(GPIOA_IDR_Addr, 11) //輸入
  120. #define PA12in BIT_ADDR(GPIOA_IDR_Addr, 12) //輸入
  121. #define PA13in BIT_ADDR(GPIOA_IDR_Addr, 13) //輸入
  122. #define PA14in BIT_ADDR(GPIOA_IDR_Addr, 14) //輸入
  123. #define PA15in BIT_ADDR(GPIOA_IDR_Addr, 15) //輸入


  124. #define PA   MEM_ADDR(GPIOA_ODR_Addr)          //PA  16個(gè)IO口同時(shí)動(dòng)作

  125. //PB-PG部分和SW/JTAG引腳功能設(shè)置請(qǐng)參考具體代碼
  126. //有不懂的地方歡迎留言
復(fù)制代碼

全部資料51hei下載地址:
C51Mode.zip (6.45 KB, 下載次數(shù): 72)



作者: admin    時(shí)間: 2018-6-22 17:47
好資料,51黑有你更精彩!!!
作者: nsj21n    時(shí)間: 2018-6-23 08:40
這個(gè)確實(shí)是很不錯(cuò)的東西,值得推薦
作者: wuxishun    時(shí)間: 2018-6-25 06:21
非常好,可以參考
作者: chenjialin12    時(shí)間: 2019-8-3 22:09
感謝大佬
作者: sec    時(shí)間: 2019-9-29 16:51
那么工程怎么建,和51一樣?還是也要搭建stm32的庫(kù)
作者: waerdeng    時(shí)間: 2019-9-29 20:22

非常好,非常適合我等新手,可以參考。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1