找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5123|回复: 6
打印 上一主题 下一主题
收起左侧

听说你害怕学stm32?专治stm32的办法来了,stm32仿C51操作方式操作IO口(支持P...

  [复制链接]
跳转到指定楼层
楼主
ID:142059 发表于 2018-6-18 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写给初学stm32的小白,如果你不想深入学习stm32,又想用stm32的高性能优点来替换C51,那么这里提供了stm32变C51的一个捷径,有的人可能会有疑问,这会不会降低stm32的速度,这你完全不用担心,因为这个位绑定就是stm32自身提供的功能,属于硬件级别的支持,所以放心大胆使用吧,对于老手,有的人可能会嘲笑stm32跑去仿C51这不是倒退么,其实不然,只要是方便快捷的东西我们就保持,不好的就丢弃而不是一味否认旧东西。从51转32的同学大部分都是不适应的,以前都是直接操作寄存器,现在全是库函数,一大串长长的库函数名就让人头疼,这还是标准库,现在ST公司又大力主推HAL库,对于刚学完标准库的同学又是一棒打击,因为学习成本和学习时间太多了,有的人则说学什么库函数,直接学寄存器操作,那么我想说,除非你在自娱自乐,因为想要深入学习,你不仅要学会写代码,而且要能读懂别人的代码,现在网上大多数stm32程序都是库函编写,所以你不想学也必须学,stm32f1由于出的早,大多数资料例程都是标准库函数编写的,而f7已经开始不支持标准库了,f4处于中间的尴尬位置,虽有标准库支持,但是st已经停止更新,主推hal库。所以说想深入学习,hal库是最好的选择,优点是一次编写,全st平台适用,缺点是单片机效率降低。话不多说,对stm32f1来说,C51操作方式还是不可能过时的,因为它是51和32之间的桥梁。


stm32f1系位绑定实现的stm32仿C51方式配置和操作GPIO口,自从用上这个就回不去了。
部分代码如下:
  1. /*--------------------P口输入输出模式配置----------------------------------------
  2. 使用说明:
  3. //举例:       PA0_OUT;   //PA0配置成推挽输出模式
  4.               PA0=1;     //PA0输出1
  5.               ...
  6.               PA0=0;     //PA0输出0
  7.               当需要PA0改为输入时,需要在使用前配置成输入
  8.                                                         PA0_IN;    //PA0配置成上下拉输入
  9.                                                         PA0=1;     //PA0配置成上拉输入(PA0=0配置成下拉输入)
  10.                                                         if(PA0in==0) PA11=1;  //读取PA0的电平状态
  11.                                                         当PA0作为输入使用完毕,PA0口又继续上面的输出工作,则重新再配置一次
  12.                                                         PA0_OUT;   //恢复PA0为输出
  13.                                                         PA0=0;     //PA0输出0
  14.                                                         
  15.                                                         PA_OUT;    //PA(16个IO口)配置成推挽输出模式
  16.                                                         PA=0xFF00; //高8位输出1,低8位输出0
  17.                                                         PA_IN;     //PA(16个IO口)配置成上下拉输入
  18.                                                         PA=0xFFFF; //PA(16个IO口)配置成上拉输入
  19.                                                         PB0_OUT;   //PB0配置成推挽输出模式
  20.                                                         if(PAin==0xFFFF)  PB0=1;   //如果PA16个IO都等于1,则PB0置1
  21.                                                         //注:读取IO口时,先配置成输入,IO名要加in作为读取识别,这是唯一一点和C51不同的地方
  22. _OUT          --推挽输出
  23. _OUT_AF       --复用功能输出
  24. _IN           --上下拉输入  输入前,P口置1,则是上拉输入,反之是下拉输入
  25. _IN_AN        --模拟输入

  26. PA0_OUT;      //配置单个IO口为输出模式
  27. PA0_OUT_AF;   //配置单个IO口为复用功能输出模式
  28. PA0_IN;       //配置单个IO口为输入模式
  29. PA0_IN_AN;    //配置单个IO口为模拟输入模式
  30. PA_OUT;       //配置整个PA口(16个IO)为输出模式
  31. PA_IN;        //配置整个PA口(16个IO)为输入模式

  32. 注:PB3,PB4(JNTRST),PA13(SWD),PA14(SWC),PA15  为JTAG/SWD仿真器的调试接口(上电默认为JTAG功能,不能用于普通IO口功能)
  33.     关闭对应的的调试接口功能才能作为普通IO口使用,调试接口调置命令如下:
  34.                 SWJ_ON          ---SW+JTAG功能都打开(上电默认状态),         PB3,PB4,PA13,PA14,PA15不能用作普通IO口功能   
  35.                 SWJ_NOJNTRST   ---SW+JTAG功能都打开,但是不用JTAG复位引脚(PB4),PB4用作普通IO口功能
  36.                 SWON_JTAGOFF   ---SW功能打开,JTAG功能关闭,            PB3,PB4,PA15用作普通IO口功能
  37.                 SWJ_OFF        ---SW+JTAG功能都关闭,但能用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个IO口同时动作

  125. //PB-PG部分和SW/JTAG引脚功能设置请参考具体代码
  126. //有不懂的地方欢迎留言
复制代码

全部资料51hei下载地址:
C51Mode.zip (6.45 KB, 下载次数: 71)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-6-22 17:47 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:64089 发表于 2018-6-23 08:40 | 只看该作者
这个确实是很不错的东西,值得推荐
回复

使用道具 举报

地板
ID:243748 发表于 2018-6-25 06:21 来自手机 | 只看该作者
非常好,可以参考
回复

使用道具 举报

5#
ID:492640 发表于 2019-8-3 22:09 | 只看该作者
感谢大佬
回复

使用道具 举报

6#
ID:315853 发表于 2019-9-29 16:51 | 只看该作者
那么工程怎么建,和51一样?还是也要搭建stm32的库
回复

使用道具 举报

7#
ID:71535 发表于 2019-9-29 20:22 | 只看该作者

非常好,非常适合我等新手,可以参考。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表