• STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置


    1. I/O工作模式 STC 32G系列单片机最多有64Pin引脚,最多有60个I/O口。如下图示:

    STC32G系列单片机的 I/O口都有4种工作模式:准双向口(弱上拉)、推挽输出(强上拉)、高阻输入(电流不能流入也不能流出)、开漏输出。P30、P31上电复位状态为准双向(弱上拉)模式,其余I/O口上电复位状态为高阻输入,这与STC15系列,有所不同。

    要使用I/O口需配置 I/O口的工作模式,STC32G系列单片机除有与工作模式配置有关的端口配置寄存器(PxM0、PxM1)、端口数据寄存器外Px,还有端口上拉电阻控制寄存器(enable/disable 内部4.1K上拉电阻)PxPU、端口施密特触发控制寄存器(enable/disable 施密特触发功能)PxNCS、端口电平转换速度控制寄存器(使转换速度可进行快慢切换)、端口驱动电流控制寄存器(使端口驱动能力能在一般驱动能力与增强驱动能力间切换)PxSR、端口数字信号输入使能控制寄存器(enable/disable 数字信号输入)PxIE、端口下拉电阻控制寄存器(enable/disable内部10K下拉电阻)。较STC15系列单片机要复杂得多。

    STC32G系列单片机的 I/O口的工作模式通过端口配置寄存器(PxM0、PxM1)来配置,配置方法如下:

    2.不同工作模式下的I/O结构图

     STC32G系列单片机的准双向 I/O结构图如下:

      STC32G系列单片机的推挽输出 I/O结构图如下:

    STC32G系列单片机的高阻输入 I/O结构图如下: 

     STC32G系列单片机的开漏 I/O结构图如下:

      STC32G系列单片机相对于STC8位8051单片机新增了4.1K上拉电阻于10K下拉电阻,如下:

     4.库函数  STC 官网上提供了STC32G的库函数目前的最新为第4版,发布日期为2022年6月9号。下载解压后,在library文件夹下可看到的文件如下:

    其中STC32G_GPIO.h的代码如下:

    1. /*---------------------------------------------------------------------*/
    2. /* --- STC MCU Limited ------------------------------------------------*/
    3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
    4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
    5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
    6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
    7. /* --- Web: www.STCMCU.com --------------------------------------------*/
    8. /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
    9. /* --- QQ: 800003751 -------------------------------------------------*/
    10. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
    11. /*---------------------------------------------------------------------*/
    12. #ifndef __STC32G_GPIO_H
    13. #define __STC32G_GPIO_H
    14. #include "config.h"
    15. //========================================================================
    16. // 端口模式设置
    17. //========================================================================
    18. //准双向口
    19. #define P0_MODE_IO_PU(Pin) {P0M1 &= ~(Pin), P0M0 &= ~(Pin);}
    20. #define P1_MODE_IO_PU(Pin) {P1M1 &= ~(Pin), P1M0 &= ~(Pin);}
    21. #define P2_MODE_IO_PU(Pin) {P2M1 &= ~(Pin), P2M0 &= ~(Pin);}
    22. #define P3_MODE_IO_PU(Pin) {P3M1 &= ~(Pin), P3M0 &= ~(Pin);}
    23. #define P4_MODE_IO_PU(Pin) {P4M1 &= ~(Pin), P4M0 &= ~(Pin);}
    24. #define P5_MODE_IO_PU(Pin) {P5M1 &= ~(Pin), P5M0 &= ~(Pin);}
    25. #define P6_MODE_IO_PU(Pin) {P6M1 &= ~(Pin), P6M0 &= ~(Pin);}
    26. #define P7_MODE_IO_PU(Pin) {P7M1 &= ~(Pin), P7M0 &= ~(Pin);}
    27. //高阻输入
    28. #define P0_MODE_IN_HIZ(Pin) {P0M1 |= (Pin), P0M0 &= ~(Pin);}
    29. #define P1_MODE_IN_HIZ(Pin) {P1M1 |= (Pin), P1M0 &= ~(Pin);}
    30. #define P2_MODE_IN_HIZ(Pin) {P2M1 |= (Pin), P2M0 &= ~(Pin);}
    31. #define P3_MODE_IN_HIZ(Pin) {P3M1 |= (Pin), P3M0 &= ~(Pin);}
    32. #define P4_MODE_IN_HIZ(Pin) {P4M1 |= (Pin), P4M0 &= ~(Pin);}
    33. #define P5_MODE_IN_HIZ(Pin) {P5M1 |= (Pin), P5M0 &= ~(Pin);}
    34. #define P6_MODE_IN_HIZ(Pin) {P6M1 |= (Pin), P6M0 &= ~(Pin);}
    35. #define P7_MODE_IN_HIZ(Pin) {P7M1 |= (Pin), P7M0 &= ~(Pin);}
    36. //漏极开路
    37. #define P0_MODE_OUT_OD(Pin) {P0M1 |= (Pin), P0M0 |= (Pin);}
    38. #define P1_MODE_OUT_OD(Pin) {P1M1 |= (Pin), P1M0 |= (Pin);}
    39. #define P2_MODE_OUT_OD(Pin) {P2M1 |= (Pin), P2M0 |= (Pin);}
    40. #define P3_MODE_OUT_OD(Pin) {P3M1 |= (Pin), P3M0 |= (Pin);}
    41. #define P4_MODE_OUT_OD(Pin) {P4M1 |= (Pin), P4M0 |= (Pin);}
    42. #define P5_MODE_OUT_OD(Pin) {P5M1 |= (Pin), P5M0 |= (Pin);}
    43. #define P6_MODE_OUT_OD(Pin) {P6M1 |= (Pin), P6M0 |= (Pin);}
    44. #define P7_MODE_OUT_OD(Pin) {P7M1 |= (Pin), P7M0 |= (Pin);}
    45. //推挽输出
    46. #define P0_MODE_OUT_PP(Pin) {P0M1 &= ~(Pin), P0M0 |= (Pin);}
    47. #define P1_MODE_OUT_PP(Pin) {P1M1 &= ~(Pin), P1M0 |= (Pin);}
    48. #define P2_MODE_OUT_PP(Pin) {P2M1 &= ~(Pin), P2M0 |= (Pin);}
    49. #define P3_MODE_OUT_PP(Pin) {P3M1 &= ~(Pin), P3M0 |= (Pin);}
    50. #define P4_MODE_OUT_PP(Pin) {P4M1 &= ~(Pin), P4M0 |= (Pin);}
    51. #define P5_MODE_OUT_PP(Pin) {P5M1 &= ~(Pin), P5M0 |= (Pin);}
    52. #define P6_MODE_OUT_PP(Pin) {P6M1 &= ~(Pin), P6M0 |= (Pin);}
    53. #define P7_MODE_OUT_PP(Pin) {P7M1 &= ~(Pin), P7M0 |= (Pin);}
    54. //========================================================================
    55. // 端口内部4.1K上拉设置
    56. //========================================================================
    57. //上拉使能
    58. #define P0_PULL_UP_ENABLE(Pin) P0PU |= (Pin)
    59. #define P1_PULL_UP_ENABLE(Pin) P1PU |= (Pin)
    60. #define P2_PULL_UP_ENABLE(Pin) P2PU |= (Pin)
    61. #define P3_PULL_UP_ENABLE(Pin) P3PU |= (Pin)
    62. #define P4_PULL_UP_ENABLE(Pin) P4PU |= (Pin)
    63. #define P5_PULL_UP_ENABLE(Pin) P5PU |= (Pin)
    64. #define P6_PULL_UP_ENABLE(Pin) P6PU |= (Pin)
    65. #define P7_PULL_UP_ENABLE(Pin) P7PU |= (Pin)
    66. //上拉禁止
    67. #define P0_PULL_UP_DISABLE(Pin) P0PU &= ~(Pin)
    68. #define P1_PULL_UP_DISABLE(Pin) P1PU &= ~(Pin)
    69. #define P2_PULL_UP_DISABLE(Pin) P2PU &= ~(Pin)
    70. #define P3_PULL_UP_DISABLE(Pin) P3PU &= ~(Pin)
    71. #define P4_PULL_UP_DISABLE(Pin) P4PU &= ~(Pin)
    72. #define P5_PULL_UP_DISABLE(Pin) P5PU &= ~(Pin)
    73. #define P6_PULL_UP_DISABLE(Pin) P6PU &= ~(Pin)
    74. #define P7_PULL_UP_DISABLE(Pin) P7PU &= ~(Pin)
    75. //========================================================================
    76. // 端口施密特触发设置
    77. //========================================================================
    78. //施密特触发使能
    79. #define P0_ST_ENABLE(Pin) P0NCS &= ~(Pin)
    80. #define P1_ST_ENABLE(Pin) P1NCS &= ~(Pin)
    81. #define P2_ST_ENABLE(Pin) P2NCS &= ~(Pin)
    82. #define P3_ST_ENABLE(Pin) P3NCS &= ~(Pin)
    83. #define P4_ST_ENABLE(Pin) P4NCS &= ~(Pin)
    84. #define P5_ST_ENABLE(Pin) P5NCS &= ~(Pin)
    85. #define P6_ST_ENABLE(Pin) P6NCS &= ~(Pin)
    86. #define P7_ST_ENABLE(Pin) P7NCS &= ~(Pin)
    87. //施密特触发禁止
    88. #define P0_ST_DISABLE(Pin) P0NCS |= (Pin)
    89. #define P1_ST_DISABLE(Pin) P1NCS |= (Pin)
    90. #define P2_ST_DISABLE(Pin) P2NCS |= (Pin)
    91. #define P3_ST_DISABLE(Pin) P3NCS |= (Pin)
    92. #define P4_ST_DISABLE(Pin) P4NCS |= (Pin)
    93. #define P5_ST_DISABLE(Pin) P5NCS |= (Pin)
    94. #define P6_ST_DISABLE(Pin) P6NCS |= (Pin)
    95. #define P7_ST_DISABLE(Pin) P7NCS |= (Pin)
    96. //========================================================================
    97. // 端口电平转换速度设置
    98. //========================================================================
    99. //电平转换慢速,相应的上下冲比较小
    100. #define P0_SPEED_LOW(Pin) P0SR |= (Pin)
    101. #define P1_SPEED_LOW(Pin) P1SR |= (Pin)
    102. #define P2_SPEED_LOW(Pin) P2SR |= (Pin)
    103. #define P3_SPEED_LOW(Pin) P3SR |= (Pin)
    104. #define P4_SPEED_LOW(Pin) P4SR |= (Pin)
    105. #define P5_SPEED_LOW(Pin) P5SR |= (Pin)
    106. #define P6_SPEED_LOW(Pin) P6SR |= (Pin)
    107. #define P7_SPEED_LOW(Pin) P7SR |= (Pin)
    108. //电平转换快速,相应的上下冲比较大
    109. #define P0_SPEED_HIGH(Pin) P0SR &= ~(Pin)
    110. #define P1_SPEED_HIGH(Pin) P1SR &= ~(Pin)
    111. #define P2_SPEED_HIGH(Pin) P2SR &= ~(Pin)
    112. #define P3_SPEED_HIGH(Pin) P3SR &= ~(Pin)
    113. #define P4_SPEED_HIGH(Pin) P4SR &= ~(Pin)
    114. #define P5_SPEED_HIGH(Pin) P5SR &= ~(Pin)
    115. #define P6_SPEED_HIGH(Pin) P6SR &= ~(Pin)
    116. #define P7_SPEED_HIGH(Pin) P7SR &= ~(Pin)
    117. //========================================================================
    118. // 端口驱动电流控制设置
    119. //========================================================================
    120. //一般驱动能力
    121. #define P0_DRIVE_MEDIUM(Pin) P0DR |= (Pin)
    122. #define P1_DRIVE_MEDIUM(Pin) P1DR |= (Pin)
    123. #define P2_DRIVE_MEDIUM(Pin) P2DR |= (Pin)
    124. #define P3_DRIVE_MEDIUM(Pin) P3DR |= (Pin)
    125. #define P4_DRIVE_MEDIUM(Pin) P4DR |= (Pin)
    126. #define P5_DRIVE_MEDIUM(Pin) P5DR |= (Pin)
    127. #define P6_DRIVE_MEDIUM(Pin) P6DR |= (Pin)
    128. #define P7_DRIVE_MEDIUM(Pin) P7DR |= (Pin)
    129. //增强驱动能力
    130. #define P0_DRIVE_HIGH(Pin) P0DR &= ~(Pin)
    131. #define P1_DRIVE_HIGH(Pin) P1DR &= ~(Pin)
    132. #define P2_DRIVE_HIGH(Pin) P2DR &= ~(Pin)
    133. #define P3_DRIVE_HIGH(Pin) P3DR &= ~(Pin)
    134. #define P4_DRIVE_HIGH(Pin) P4DR &= ~(Pin)
    135. #define P5_DRIVE_HIGH(Pin) P5DR &= ~(Pin)
    136. #define P6_DRIVE_HIGH(Pin) P6DR &= ~(Pin)
    137. #define P7_DRIVE_HIGH(Pin) P7DR &= ~(Pin)
    138. //========================================================================
    139. // 端口数字信号输入使能
    140. //========================================================================
    141. //使能数字信号输入
    142. #define P0_DIGIT_IN_ENABLE(Pin) P0IE |= (Pin)
    143. #define P1_DIGIT_IN_ENABLE(Pin) P1IE |= (Pin)
    144. #define P2_DIGIT_IN_ENABLE(Pin) P2IE |= (Pin)
    145. #define P3_DIGIT_IN_ENABLE(Pin) P3IE |= (Pin)
    146. #define P4_DIGIT_IN_ENABLE(Pin) P4IE |= (Pin)
    147. #define P5_DIGIT_IN_ENABLE(Pin) P5IE |= (Pin)
    148. #define P6_DIGIT_IN_ENABLE(Pin) P6IE |= (Pin)
    149. #define P7_DIGIT_IN_ENABLE(Pin) P7IE |= (Pin)
    150. //禁止数字信号输入
    151. #define P0_DIGIT_IN_DISABLE(Pin) P0IE &= ~(Pin)
    152. #define P1_DIGIT_IN_DISABLE(Pin) P1IE &= ~(Pin)
    153. #define P2_DIGIT_IN_DISABLE(Pin) P2IE &= ~(Pin)
    154. #define P3_DIGIT_IN_DISABLE(Pin) P3IE &= ~(Pin)
    155. #define P4_DIGIT_IN_DISABLE(Pin) P4IE &= ~(Pin)
    156. #define P5_DIGIT_IN_DISABLE(Pin) P5IE &= ~(Pin)
    157. #define P6_DIGIT_IN_DISABLE(Pin) P6IE &= ~(Pin)
    158. #define P7_DIGIT_IN_DISABLE(Pin) P7IE &= ~(Pin)
    159. //========================================================================
    160. // 定义声明
    161. //========================================================================
    162. #define GPIO_PullUp 0 //上拉准双向口
    163. #define GPIO_HighZ 1 //浮空输入
    164. #define GPIO_OUT_OD 2 //开漏输出
    165. #define GPIO_OUT_PP 3 //推挽输出
    166. #define GPIO_Pin_0 0x01 //IO引脚 Px.0
    167. #define GPIO_Pin_1 0x02 //IO引脚 Px.1
    168. #define GPIO_Pin_2 0x04 //IO引脚 Px.2
    169. #define GPIO_Pin_3 0x08 //IO引脚 Px.3
    170. #define GPIO_Pin_4 0x10 //IO引脚 Px.4
    171. #define GPIO_Pin_5 0x20 //IO引脚 Px.5
    172. #define GPIO_Pin_6 0x40 //IO引脚 Px.6
    173. #define GPIO_Pin_7 0x80 //IO引脚 Px.7
    174. #define GPIO_Pin_LOW 0x0F //IO低4位引脚
    175. #define GPIO_Pin_HIGH 0xF0 //IO高4位引脚
    176. #define GPIO_Pin_All 0xFF //IO所有引脚
    177. #define GPIO_P0 0 //
    178. #define GPIO_P1 1
    179. #define GPIO_P2 2
    180. #define GPIO_P3 3
    181. #define GPIO_P4 4
    182. #define GPIO_P5 5
    183. #define GPIO_P6 6
    184. #define GPIO_P7 7
    185. typedef struct
    186. {
    187. u8 Mode; //IO模式, GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    188. u8 Pin; //要设置的端口
    189. } GPIO_InitTypeDef;
    190. u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);
    191. #endif

    STC32G_GPIO.c中的代码如下:

    1. /*---------------------------------------------------------------------*/
    2. /* --- STC MCU Limited ------------------------------------------------*/
    3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
    4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
    5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
    6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
    7. /* --- Web: www.STCMCU.com --------------------------------------------*/
    8. /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
    9. /* --- QQ: 800003751 -------------------------------------------------*/
    10. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
    11. /*---------------------------------------------------------------------*/
    12. #include "STC32G_GPIO.h"
    13. //========================================================================
    14. // 函数: u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
    15. // 描述: 初始化IO口.
    16. // 参数: GPIOx: 结构参数,请参考timer.h里的定义.
    17. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
    18. // 版本: V1.0, 2012-10-22
    19. //========================================================================
    20. u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
    21. {
    22. if(GPIO > GPIO_P7) return FAIL; //错误
    23. if(GPIOx->Mode > GPIO_OUT_PP) return FAIL; //错误
    24. if(GPIO == GPIO_P0)
    25. {
    26. if(GPIOx->Mode == GPIO_PullUp) P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //上拉准双向口
    27. if(GPIOx->Mode == GPIO_HighZ) P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //浮空输入
    28. if(GPIOx->Mode == GPIO_OUT_OD) P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin; //开漏输出
    29. if(GPIOx->Mode == GPIO_OUT_PP) P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin; //推挽输出
    30. }
    31. if(GPIO == GPIO_P1)
    32. {
    33. if(GPIOx->Mode == GPIO_PullUp) P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //上拉准双向口
    34. if(GPIOx->Mode == GPIO_HighZ) P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //浮空输入
    35. if(GPIOx->Mode == GPIO_OUT_OD) P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin; //开漏输出
    36. if(GPIOx->Mode == GPIO_OUT_PP) P1M1 &= ~GPIOx->Pin, P1M0 |= GPIOx->Pin; //推挽输出
    37. }
    38. if(GPIO == GPIO_P2)
    39. {
    40. if(GPIOx->Mode == GPIO_PullUp) P2M1 &= ~GPIOx->Pin, P2M0 &= ~GPIOx->Pin; //上拉准双向口
    41. if(GPIOx->Mode == GPIO_HighZ) P2M1 |= GPIOx->Pin, P2M0 &= ~GPIOx->Pin; //浮空输入
    42. if(GPIOx->Mode == GPIO_OUT_OD) P2M1 |= GPIOx->Pin, P2M0 |= GPIOx->Pin; //开漏输出
    43. if(GPIOx->Mode == GPIO_OUT_PP) P2M1 &= ~GPIOx->Pin, P2M0 |= GPIOx->Pin; //推挽输出
    44. }
    45. if(GPIO == GPIO_P3)
    46. {
    47. if(GPIOx->Mode == GPIO_PullUp) P3M1 &= ~GPIOx->Pin, P3M0 &= ~GPIOx->Pin; //上拉准双向口
    48. if(GPIOx->Mode == GPIO_HighZ) P3M1 |= GPIOx->Pin, P3M0 &= ~GPIOx->Pin; //浮空输入
    49. if(GPIOx->Mode == GPIO_OUT_OD) P3M1 |= GPIOx->Pin, P3M0 |= GPIOx->Pin; //开漏输出
    50. if(GPIOx->Mode == GPIO_OUT_PP) P3M1 &= ~GPIOx->Pin, P3M0 |= GPIOx->Pin; //推挽输出
    51. }
    52. if(GPIO == GPIO_P4)
    53. {
    54. if(GPIOx->Mode == GPIO_PullUp) P4M1 &= ~GPIOx->Pin, P4M0 &= ~GPIOx->Pin; //上拉准双向口
    55. if(GPIOx->Mode == GPIO_HighZ) P4M1 |= GPIOx->Pin, P4M0 &= ~GPIOx->Pin; //浮空输入
    56. if(GPIOx->Mode == GPIO_OUT_OD) P4M1 |= GPIOx->Pin, P4M0 |= GPIOx->Pin; //开漏输出
    57. if(GPIOx->Mode == GPIO_OUT_PP) P4M1 &= ~GPIOx->Pin, P4M0 |= GPIOx->Pin; //推挽输出
    58. }
    59. if(GPIO == GPIO_P5)
    60. {
    61. if(GPIOx->Mode == GPIO_PullUp) P5M1 &= ~GPIOx->Pin, P5M0 &= ~GPIOx->Pin; //上拉准双向口
    62. if(GPIOx->Mode == GPIO_HighZ) P5M1 |= GPIOx->Pin, P5M0 &= ~GPIOx->Pin; //浮空输入
    63. if(GPIOx->Mode == GPIO_OUT_OD) P5M1 |= GPIOx->Pin, P5M0 |= GPIOx->Pin; //开漏输出
    64. if(GPIOx->Mode == GPIO_OUT_PP) P5M1 &= ~GPIOx->Pin, P5M0 |= GPIOx->Pin; //推挽输出
    65. }
    66. if(GPIO == GPIO_P6)
    67. {
    68. if(GPIOx->Mode == GPIO_PullUp) P6M1 &= ~GPIOx->Pin, P6M0 &= ~GPIOx->Pin; //上拉准双向口
    69. if(GPIOx->Mode == GPIO_HighZ) P6M1 |= GPIOx->Pin, P6M0 &= ~GPIOx->Pin; //浮空输入
    70. if(GPIOx->Mode == GPIO_OUT_OD) P6M1 |= GPIOx->Pin, P6M0 |= GPIOx->Pin; //开漏输出
    71. if(GPIOx->Mode == GPIO_OUT_PP) P6M1 &= ~GPIOx->Pin, P6M0 |= GPIOx->Pin; //推挽输出
    72. }
    73. if(GPIO == GPIO_P7)
    74. {
    75. if(GPIOx->Mode == GPIO_PullUp) P7M1 &= ~GPIOx->Pin, P7M0 &= ~GPIOx->Pin; //上拉准双向口
    76. if(GPIOx->Mode == GPIO_HighZ) P7M1 |= GPIOx->Pin, P7M0 &= ~GPIOx->Pin; //浮空输入
    77. if(GPIOx->Mode == GPIO_OUT_OD) P7M1 |= GPIOx->Pin, P7M0 |= GPIOx->Pin; //开漏输出
    78. if(GPIOx->Mode == GPIO_OUT_PP) P7M1 &= ~GPIOx->Pin, P7M0 |= GPIOx->Pin; //推挽输出
    79. }
    80. return SUCCESS; //成功
    81. }

    注意STC32G_GPIO.h中包含了头文件config.h及自定义的数据类型符号,需从Independent_Programme文件夹下的子目录下将下面两个头文件Copy到library文件夹下,否则编译会报错。

    下面是我自己写的库函数,头文件如下:

    1. /*STC32G_GPIO.h
    2. Designed by Bill Liu
    3. Version 0.0
    4. Modified last by Bill Liu on 06/23/2022
    5. */
    6. #ifndef __STC32G_GPIO_H
    7. #define __STC32G_GPIO_H
    8. #include <STC32G.h>
    9. #include "config.h"
    10. #include "mtype.h"
    11. //***************************************
    12. typedef enum
    13. {
    14. PIN0 = 0x01,
    15. PIN1 = 0x02,
    16. PIN2 = 0x04,
    17. PIN3 = 0x08,
    18. PIN4 = 0x10,
    19. PIN5 = 0x20,
    20. PIN6 = 0x40,
    21. PIN7 = 0x80
    22. }IOPORT_PIN;
    23. //***************************************
    24. typedef enum
    25. {
    26. SCT_P0 = 0x01, //P0 port
    27. SCT_P1 = 0x02, //P1 port
    28. SCT_P2 = 0x04, //P2 port
    29. SCT_P3 = 0x08, //P3 port
    30. SCT_P4 = 0x10, //P4 port
    31. SCT_P5 = 0x20, //P5 port
    32. SCT_P6 = 0x40, //P6 port
    33. SCT_P7 = 0x80 //P7 port
    34. }STC32G_IOPORT;
    35. //***************************************
    36. typedef enum
    37. {
    38. BI_IO = 0, //bidirectional I/O
    39. PP_OUT, //push_pull out
    40. HI_IN, //high impendence in
    41. ODR_OUT //open drain out
    42. }STC32G_IOMODE;
    43. /****************************************
    44. Function: STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    45. Return value: void
    46. pins: pins to init,
    47. mode: configure work mode
    48. pullUpEnable: 0-pullup disable, 1-pull up enable
    49. pullDownEnable: 0-pull down disable,1-pull down enable
    50. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    51. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    52. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    53. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    54. Example:
    55. STC32G_P0PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    56. ****************************************/
    57. void STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    58. /****************************************
    59. Function: STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    60. Return value: void
    61. pins: pins to init,
    62. mode: configure work mode
    63. pullUpEnable: 0-pullup disable, 1-pull up enable
    64. pullDownEnable: 0-pull down disable,1-pull down enable
    65. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    66. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    67. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    68. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    69. Example:
    70. STC32G_P1PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    71. ****************************************/
    72. void STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    73. /****************************************
    74. Function: STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    75. Return value: void
    76. pins: pins to init,
    77. mode: configure work mode
    78. pullUpEnable: 0-pullup disable, 1-pull up enable
    79. pullDownEnable: 0-pull down disable,1-pull down enable
    80. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    81. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    82. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    83. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    84. Example:
    85. STC32G_P2PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    86. ****************************************/
    87. void STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    88. /****************************************
    89. Function: STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    90. Return value: void
    91. pins: pins to init,
    92. mode: configure work mode
    93. pullUpEnable: 0-pullup disable, 1-pull up enable
    94. pullDownEnable: 0-pull down disable,1-pull down enable
    95. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    96. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    97. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    98. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    99. Example:
    100. STC32G_P3PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    101. ****************************************/
    102. void STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    103. /****************************************
    104. Function: STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    105. Return value: void
    106. pins: pins to init,
    107. mode: configure work mode
    108. pullUpEnable: 0-pullup disable, 1-pull up enable
    109. pullDownEnable: 0-pull down disable,1-pull down enable
    110. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    111. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    112. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    113. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    114. Example:
    115. STC32G_P4PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    116. ****************************************/
    117. void STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    118. /****************************************
    119. Function: STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    120. Return value: void
    121. pins: pins to init,
    122. mode: configure work mode
    123. pullUpEnable: 0-pullup disable, 1-pull up enable
    124. pullDownEnable: 0-pull down disable,1-pull down enable
    125. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    126. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    127. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    128. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    129. Example:
    130. STC32G_P5PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    131. ****************************************/
    132. void STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    133. /****************************************
    134. Function: STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    135. Return value: void
    136. pins: pins to init,
    137. mode: configure work mode
    138. pullUpEnable: 0-pullup disable, 1-pull up enable
    139. pullDownEnable: 0-pull down disable,1-pull down enable
    140. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    141. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    142. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    143. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    144. Example:
    145. STC32G_P6PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    146. ****************************************/
    147. void STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    148. /****************************************
    149. Function: STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    150. Return value: void
    151. pins: pins to init,
    152. mode: configure work mode
    153. pullUpEnable: 0-pullup disable, 1-pull up enable
    154. pullDownEnable: 0-pull down disable,1-pull down enable
    155. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    156. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    157. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    158. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    159. Example:
    160. STC32G_P7PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    161. ****************************************/
    162. void STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    163. /****************************************
    164. Function: STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    165. Return value: void
    166. ports: ports to init
    167. pins: pins to init,
    168. mode: configure work mode
    169. pullUpEnable: 0-pullup disable, 1-pull up enable
    170. pullDownEnable: 0-pull down disable,1-pull down enable
    171. drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
    172. speedHi; 1- I/O speed high enable, 0- I/O speed high disable
    173. dIEnable: 1- digital singal input enable, 0- digital singal input enable
    174. sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
    175. Example:
    176. STC32G_PortsPinsInit(SCT_P0|SCT_P1|SCT_P6,PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
    177. ****************************************/
    178. void STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
    179. #endif

    库函数源代码如下:

    1. /*STC32G_GPIO.h
    2. Designed by Bill Liu
    3. Version 0.0
    4. Modified last by Bill Liu on 06/23/2022
    5. */
    6. #include "STC32G_GPIO.h"
    7. //*********************************************************************************************************************************************/
    8. void STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    9. {
    10. SysInit();
    11. switch(mode)
    12. {
    13. case BI_IO:
    14. P0M1 &= ~pins;
    15. P0M0 &= ~pins;
    16. break;
    17. case PP_OUT:
    18. P0M1 &= ~pins;
    19. P0M0 |= pins;
    20. break;
    21. case HI_IN:
    22. P0M1 |= pins;
    23. P0M0 &= pins;
    24. break;
    25. case ODR_OUT:
    26. P0M1 |= pins;
    27. P0M0 |= pins;
    28. break;
    29. }
    30. if(pullUpEnable)
    31. P0PU |= pins;
    32. else
    33. P0PU &= ~pins;
    34. if(pullDownEnable)
    35. P0DR |= pins;
    36. else
    37. P0DR &= ~pins;
    38. if(drvEn)
    39. P0DR &= ~pins;
    40. else
    41. P0DR |= pins;
    42. if(speedHi)
    43. P0SR &= ~pins;
    44. else
    45. P0SR |= pins;
    46. if(dIEnable)
    47. P0IE |= pins;
    48. else
    49. P0IE &= ~pins;
    50. if(sTEnable)
    51. P0NCS &= ~pins;
    52. else
    53. P0NCS |= pins;
    54. }
    55. //End of STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    56. //*********************************************************************************************************************************************/
    57. void STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    58. {
    59. SysInit();
    60. switch(mode)
    61. {
    62. case BI_IO:
    63. P1M1 &= ~pins;
    64. P1M0 &= ~pins;
    65. break;
    66. case PP_OUT:
    67. P1M1 &= ~pins;
    68. P1M0 |= pins;
    69. break;
    70. case HI_IN:
    71. P1M1 |= pins;
    72. P1M0 &= pins;
    73. break;
    74. case ODR_OUT:
    75. P1M1 |= pins;
    76. P1M0 |= pins;
    77. break;
    78. }
    79. if(pullUpEnable)
    80. P1PU |= pins;
    81. else
    82. P1PU &= ~pins;
    83. if(pullDownEnable)
    84. P1DR |= pins;
    85. else
    86. P1DR &= ~pins;
    87. if(drvEn)
    88. P1DR &= ~pins;
    89. else
    90. P1DR |= pins;
    91. if(speedHi)
    92. P1SR &= ~pins;
    93. else
    94. P1SR |= pins;
    95. if(dIEnable)
    96. P1IE |= pins;
    97. else
    98. P1IE &= ~pins;
    99. if(sTEnable)
    100. P1NCS &= ~pins;
    101. else
    102. P1NCS |= pins;
    103. }
    104. //End of STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    105. //**********************************************************************************************************************************************/
    106. void STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    107. {
    108. SysInit();
    109. switch(mode)
    110. {
    111. case BI_IO:
    112. P2M1 &= ~pins;
    113. P2M0 &= ~pins;
    114. break;
    115. case PP_OUT:
    116. P2M1 &= ~pins;
    117. P2M0 |= pins;
    118. break;
    119. case HI_IN:
    120. P2M1 |= pins;
    121. P2M0 &= pins;
    122. break;
    123. case ODR_OUT:
    124. P2M1 |= pins;
    125. P2M0 |= pins;
    126. break;
    127. }
    128. if(pullUpEnable)
    129. P2PU |= pins;
    130. else
    131. P2PU &= ~pins;
    132. if(pullDownEnable)
    133. P2DR |= pins;
    134. else
    135. P2DR &= ~pins;
    136. if(drvEn)
    137. P2DR &= ~pins;
    138. else
    139. P2DR |= pins;
    140. if(speedHi)
    141. P2SR &= ~pins;
    142. else
    143. P2SR |= pins;
    144. if(dIEnable)
    145. P2IE |= pins;
    146. else
    147. P2IE &= ~pins;
    148. if(sTEnable)
    149. P2NCS &= ~pins;
    150. else
    151. P2NCS |= pins;
    152. }
    153. //End of STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    154. //*********************************************************************************************************************************************/
    155. void STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    156. {
    157. SysInit();
    158. switch(mode)
    159. {
    160. case BI_IO:
    161. P3M1 &= ~pins;
    162. P3M0 &= ~pins;
    163. break;
    164. case PP_OUT:
    165. P3M1 &= ~pins;
    166. P3M0 |= pins;
    167. break;
    168. case HI_IN:
    169. P3M1 |= pins;
    170. P3M0 &= pins;
    171. break;
    172. case ODR_OUT:
    173. P3M1 |= pins;
    174. P3M0 |= pins;
    175. break;
    176. }
    177. if(pullUpEnable)
    178. P3PU |= pins;
    179. else
    180. P3PU &= ~pins;
    181. if(pullDownEnable)
    182. P3DR |= pins;
    183. else
    184. P3DR &= ~pins;
    185. if(drvEn)
    186. P3DR &= ~pins;
    187. else
    188. P3DR |= pins;
    189. if(speedHi)
    190. P3SR &= ~pins;
    191. else
    192. P3SR |= pins;
    193. if(dIEnable)
    194. P3IE |= pins;
    195. else
    196. P3IE &= ~pins;
    197. if(sTEnable)
    198. P3NCS &= ~pins;
    199. else
    200. P3NCS |= pins;
    201. }
    202. //End of STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    203. //**********************************************************************************************************************************************/
    204. void STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    205. {
    206. SysInit();
    207. switch(mode)
    208. {
    209. case BI_IO:
    210. P4M1 &= ~pins;
    211. P4M0 &= ~pins;
    212. break;
    213. case PP_OUT:
    214. P4M1 &= ~pins;
    215. P4M0 |= pins;
    216. break;
    217. case HI_IN:
    218. P4M1 |= pins;
    219. P4M0 &= pins;
    220. break;
    221. case ODR_OUT:
    222. P4M1 |= pins;
    223. P4M0 |= pins;
    224. break;
    225. }
    226. if(pullUpEnable)
    227. P4PU |= pins;
    228. else
    229. P4PU &= ~pins;
    230. if(pullDownEnable)
    231. P4DR |= pins;
    232. else
    233. P4DR &= ~pins;
    234. if(drvEn)
    235. P4DR &= ~pins;
    236. else
    237. P4DR |= pins;
    238. if(speedHi)
    239. P4SR &= ~pins;
    240. else
    241. P4SR |= pins;
    242. if(dIEnable)
    243. P4IE |= pins;
    244. else
    245. P4IE &= ~pins;
    246. if(sTEnable)
    247. P4NCS &= ~pins;
    248. else
    249. P4NCS |= pins;
    250. }
    251. //End of STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    252. //**********************************************************************************************************************************************/
    253. void STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    254. {
    255. SysInit();
    256. switch(mode)
    257. {
    258. case BI_IO:
    259. P5M1 &= ~pins;
    260. P5M0 &= ~pins;
    261. break;
    262. case PP_OUT:
    263. P5M1 &= ~pins;
    264. P5M0 |= pins;
    265. break;
    266. case HI_IN:
    267. P5M1 |= pins;
    268. P5M0 &= pins;
    269. break;
    270. case ODR_OUT:
    271. P5M1 |= pins;
    272. P5M0 |= pins;
    273. break;
    274. }
    275. if(pullUpEnable)
    276. P5PU |= pins;
    277. else
    278. P5PU &= ~pins;
    279. if(pullDownEnable)
    280. P5DR |= pins;
    281. else
    282. P5DR &= ~pins;
    283. if(drvEn)
    284. P5DR &= ~pins;
    285. else
    286. P5DR |= pins;
    287. if(speedHi)
    288. P5SR &= ~pins;
    289. else
    290. P5SR |= pins;
    291. if(dIEnable)
    292. P5IE |= pins;
    293. else
    294. P5IE &= ~pins;
    295. if(sTEnable)
    296. P5NCS &= ~pins;
    297. else
    298. P5NCS |= pins;
    299. }
    300. //End of STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    301. //**********************************************************************************************************************************************/
    302. void STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    303. {
    304. SysInit();
    305. switch(mode)
    306. {
    307. case BI_IO:
    308. P6M1 &= ~pins;
    309. P6M0 &= ~pins;
    310. break;
    311. case PP_OUT:
    312. P6M1 &= ~pins;
    313. P6M0 |= pins;
    314. break;
    315. case HI_IN:
    316. P6M1 |= pins;
    317. P6M0 &= pins;
    318. break;
    319. case ODR_OUT:
    320. P6M1 |= pins;
    321. P6M0 |= pins;
    322. break;
    323. }
    324. if(pullUpEnable)
    325. P6PU |= pins;
    326. else
    327. P6PU &= ~pins;
    328. if(pullDownEnable)
    329. P6DR |= pins;
    330. else
    331. P6DR &= ~pins;
    332. if(drvEn)
    333. P6DR &= ~pins;
    334. else
    335. P6DR |= pins;
    336. if(speedHi)
    337. P6SR &= ~pins;
    338. else
    339. P6SR |= pins;
    340. if(dIEnable)
    341. P6IE |= pins;
    342. else
    343. P6IE &= ~pins;
    344. if(sTEnable)
    345. P6NCS &= ~pins;
    346. else
    347. P6NCS |= pins;
    348. }
    349. //End of STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    350. //**********************************************************************************************************************************************/
    351. void STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    352. {
    353. SysInit();
    354. switch(mode)
    355. {
    356. case BI_IO:
    357. P7M1 &= ~pins;
    358. P7M0 &= ~pins;
    359. break;
    360. case PP_OUT:
    361. P7M1 &= ~pins;
    362. P7M0 |= pins;
    363. break;
    364. case HI_IN:
    365. P7M1 |= pins;
    366. P7M0 &= pins;
    367. break;
    368. case ODR_OUT:
    369. P7M1 |= pins;
    370. P7M0 |= pins;
    371. break;
    372. }
    373. if(pullUpEnable)
    374. P7PU |= pins;
    375. else
    376. P7PU &= ~pins;
    377. if(pullDownEnable)
    378. P7DR |= pins;
    379. else
    380. P7DR &= ~pins;
    381. if(drvEn)
    382. P7DR &= ~pins;
    383. else
    384. P7DR |= pins;
    385. if(speedHi)
    386. P7SR &= ~pins;
    387. else
    388. P7SR |= pins;
    389. if(dIEnable)
    390. P7IE |= pins;
    391. else
    392. P7IE &= ~pins;
    393. if(sTEnable)
    394. P7NCS &= ~pins;
    395. else
    396. P7NCS |= pins;
    397. }
    398. //End of STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    399. /***************************************************************************************************************************************************/
    400. void STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
    401. {
    402. ui8 i;
    403. for(i = 0; i < 8; i++)
    404. {
    405. if(ports & (1 << i))
    406. {
    407. switch(i)
    408. {
    409. case 0:
    410. STC32G_P0PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    411. break;
    412. case 1:
    413. STC32G_P1PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    414. break;
    415. case 2:
    416. STC32G_P2PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    417. break;
    418. case 3:
    419. STC32G_P3PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    420. break;
    421. case 4:
    422. STC32G_P4PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    423. break;
    424. case 5:
    425. STC32G_P5PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    426. break;
    427. case 6:
    428. STC32G_P6PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    429. break;
    430. case 7:
    431. STC32G_P7PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
    432. break;
    433. }
    434. }
    435. }
    436. }
    437. //End of STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

    我也将config.h 做了修改,修改后的代码如下:

    1. /*STC32G_GPIO.h
    2. Designed by Bill Liu
    3. Version 0.0
    4. Modified last by Bill Liu on 06/23/2022
    5. */
    6. #ifndef __CONFIG_H__
    7. #define __CONFIG_H__
    8. #define FOSC 35000000UL
    9. //#define FOSC 24000000UL
    10. //#define FOSC 27000000UL
    11. //#define FOSC 30000000UL
    12. //#define FOSC 33177600UL
    13. //********************************************************
    14. void SysInit(); //init System speed fastest
    15. #endif

    config.c的源代码如下:

    1. /*config.c
    2. Designed by Bill Liu
    3. Version 0.0
    4. Modified last by Bill Liu on 06/22/2022
    5. */
    6. #include <STC32G.h>
    7. #include "config.h"
    8. //********************************************************
    9. void SysInit() //init System speed fastest
    10. {
    11. EAXFR = 1; //visit XFR enable
    12. CKCON = 0x00; //set outer data bus speed fastest
    13. WTST = 0x00; //CPU wait 0 to run program
    14. }
    15. //End of SysInit()

    5. I/O配置实例 下面将用我自己写的库函数来演示验证I/O配置。我将以下面这块板来做验证

     这块板用白线隔开将板分成了三个区域,左边为电源区,中间为模拟采样及MCU区域,右边为逻辑输入输出区。再看一下单片机的型号:

     先编译下面的空程序,将其下载到单片机中,看能否下在成功。

    1. /*main.c
    2. Designed by Bill Liu
    3. Version 0.0
    4. Modified last by Bill Liu on 06/22/2022
    5. */
    6. #include "main.h"
    7. #include "config.h"
    8. void main()
    9. {
    10. }
    11. //End of main()

     下载成功,如下:

     测一下I/O口的输出电压,随意选一个I/O口测试(实际测试的是P73),测试结果如下。

    视乎输出了低电平,应该是既不输出高电平也不输出低电平(没电流流入,也没电流流出), 看它能否驱动Led,下面是一个能够正常点亮的LED:

    先将接电源端不变,另一端将其 接在与P73连接的排针上,看LED是否任被点亮,结果如下:

    LED未被点亮 说明确实没有电流输入。SCT32G上电复位时I/O口处于高阻输入状态,一方面可以增强抗干扰能力,另一方面可以避免该单片机控制的电路载单片机上电复位时误动作。

    在main()函数中插入如下代码:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 0, 0, 0, 0);
    4. P73 = 0;
    5. while(1);
    6. }
    7. //End of main()

    编译下载,如果库函数没有问题,LED应该亮起,结果如下:

    说明库函数没有错误。将main()函数中的代码修改如下:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 0, 0, 0, 0);
    4. P73 = 1;
    5. while(1);
    6. }
    7. //End of main()

     编译下载到单片机,先来测试下双向I/O弱上拉的正向驱动能力。结果如下:

    LED仅发出微弱的亮光,说明I/O正向驱动能力弱。现将上拉电阻使能,即库函数的第三个参数设为1,修改main()函数中的代码如下:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 0, 0, 0, 0);
    4. P73 = 1;
    5. while(1);
    6. }
    7. //End of main()

    编译下载后的结果如下:

     LED变亮,说明正向驱动能力有所增强。现将驱动电流增大,将下面红框中的变量设为1,看下结果如和变化:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 1, 0, 0, 0);
    4. P73 = 1;
    5. while(1);
    6. }
    7. //End of main()

     编译下载,结果如下:

    感觉与双向I/O弱上拉的正向驱动能力差不多。再看一下,打开下拉电阻时双向I/O弱上拉的正向驱动能力。修改main()函数代码如下:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 0, 1, 0, 0, 0, 0);
    4. P73 = 1;
    5. while(1);
    6. }
    7. //End of main()

    编译下载到单片机的结果如下:

     感觉LED亮度变化并不明显。

    STC32G的 I/O 较STC15  的I/O新增新的功能与寄存器,从上面的测试可以看出,I/O的负向驱动能力较强(可承受较大的灌电流),正向驱动能力弱,如果要使I/O口有较大的正向驱动能力,需将其设置为推挽模式,如果设置为双向I/O,需使能上拉电阻才能使其正向驱动能力有所提升,使能PxDR对提供双向I/O的正向驱动能力并不明显,可能仅是对提高I/O的电平转换速度有用。

    下面再测试一下I/O的读写,将main()函数的代码修改如下:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 1, 0, 1, 0);
    4. P73 = 1;
    5. STC32G_P0PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1); //init to bidirectional I/O, pull up disable, pull down disable , dive ability enhance disable,
    6. //high speed disable, digital singal input enable, schmitt trigger enable
    7. STC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1);
    8. P0 = 0xA0;
    9. P2 = 0xFF
    10. while(1);
    11. {
    12. if(P2==P0)
    13. P73 = 1;
    14. else
    15. P73 = 0;
    16. }
    17. }
    18. //End of main()

    编译下载后的结果如下:

     LED为P73正向驱动,LED亮,说明P2、P0正常读取数据。现将将main()函数的代码修改如下:

    1. void main()
    2. {
    3. STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 1, 0, 1, 0);
    4. P73 = 1;
    5. STC32G_P0PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1); //init to bidirectional I/O, pull up disable, pull down disable , dive ability enhance disable,
    6. //high speed disable, digital singal input enable, schmitt trigger enable
    7. STC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 0);
    8. P0 = 0xA0;
    9. P2 = 0xFF
    10. while(1);
    11. {
    12. if(P2==P0)
    13. P73 = 1;
    14. else
    15. P73 = 0;
    16. }
    17. }
    18. //End of main()

     编译下载结果如下:

     说明即使不使能施密特触发器,依然可以读取数据。

  • 相关阅读:
    Week-T10 数据增强
    软件设计不是CRUD(15):低耦合模块设计理论——行为抽象与设计模式(中)
    Electron(v26.2.1)无法加载React Developer Tools(v4.28.0)
    数据链路层-概述
    leetcode(力扣)135. 分发糖果 (贪心)
    JavaScript动态设置浏览器可视区域元素的文字颜色、监听滚动条、querySelectorAll、getBoundingClientRect
    vue相关面试题:Vuex是什么?
    基于JavaSwing开发个人简历程序 课程设计 大作业
    【.NET 6+Loki+Grafana】实现轻量级日志可视化服务功能
    CSDN 成为开放原子开源基金会黄金捐赠人,共建中国十万亿技术大生态
  • 原文地址:https://blog.csdn.net/billliu66/article/details/125491349