单片机/MCU论坛
直播中

一个人勇敢

5年用户 24经验值
擅长:嵌入式技术
私信 关注
[文章]

中微BAT32G137-GPIO


中微BAT32G137-GPIO简介



BAT32G137所有端口按类型分为 5 种,分别是类型 1~类型 5,对应情况如下:
类型 1:双向 I/O 功能
类型 2:NOD 功能,对应管脚 P60-P63
类型 3:只有输入功能,如时钟,对应管脚 P121-P124
类型 4:只有输出功能,对应管脚 P130
类型 5:RESET 功能,对应管脚 RESETB  

大部分的类型是双向IO











实验功能:

           循环翻转GPIO

软件实现



  1. /***********************************************************************************************************************
  2. * Copyright (C) All rights reserved.
  3. ***********************************************************************************************************************/
  4. /***********************************************************************************************************************
  5. * [url=home.php?mod=space&uid=1455510]@file[/url]    gpio.h
  6. * [url=home.php?mod=space&uid=2666770]@Brief[/url]   This file implements device driver for GPIO module.
  7. * [url=home.php?mod=space&uid=644434]@version[/url] 1.0.0
  8. * @date    2019/12/24
  9. ***********************************************************************************************************************/
  10. #ifndef GPIO_H
  11. #define GPIO_H
  12. #ifndef __CORE_CM0PLUS_H_GENERIC
  13. #include "core_cm0plus.h"
  14. #endif
  15. /***********************************************************************************************************************
  16. Macro definitions (Register bit)
  17. ***********************************************************************************************************************/
  18. /***********************************************************************************************************************
  19. Macro definitions
  20. ***********************************************************************************************************************/
  21. /***********************************************************************************************************************
  22. Typedef definitions
  23. ***********************************************************************************************************************/
  24. typedef enum {
  25.         PORT0 = 0,
  26.         PORT1,
  27.         PORT2,
  28.         PORT3,
  29.         PORT4,
  30.         PORT5,
  31.         PORT6,
  32.         PORT7,
  33.         PORT8,
  34.         PORT9,
  35.         PORT10,
  36.         PORT11,
  37.         PORT12,
  38.         PORT13,
  39.         PORT14,
  40.        
  41. }PORT_TypeDef;
  42. typedef enum {
  43.         PIN0 = 0,
  44.         PIN1,
  45.         PIN2,
  46.         PIN3,
  47.         PIN4,
  48.         PIN5,
  49.         PIN6,
  50.         PIN7,
  51.        
  52. }PIN_TypeDef;
  53. typedef enum {
  54.         INPUT = 0,
  55.         PULLUP_INPUT,
  56.         TTL_INPUT,
  57.         ANALOG_INPUT,
  58.         OUTPUT,
  59.         OPENDRAIN_OUTPUT,
  60.        
  61. }PIN_ModeDef;
  62. #define PIN_MASK_0                 ((uint8_t)(0x01))  /*!< Pin 0 selected    */
  63. #define PIN_MASK_1                 ((uint8_t)(0x02))  /*!< Pin 1 selected    */
  64. #define PIN_MASK_2                 ((uint8_t)(0x04))  /*!< Pin 2 selected    */
  65. #define PIN_MASK_3                 ((uint8_t)(0x08))  /*!< Pin 3 selected    */
  66. #define PIN_MASK_4                 ((uint8_t)(0x10))  /*!< Pin 4 selected    */
  67. #define PIN_MASK_5                 ((uint8_t)(0x20))  /*!< Pin 5 selected    */
  68. #define PIN_MASK_6                 ((uint8_t)(0x40))  /*!< Pin 6 selected    */
  69. #define PIN_MASK_7                 ((uint8_t)(0x80))  /*!< Pin 7 selected    */
  70. /***********************************************************************************************************************
  71. Global functions
  72. ***********************************************************************************************************************/
  73. void GPIO_Output_Enable(__IO uint8_t *port, uint8_t pinMsk);
  74. void GPIO_Input_Enable(__IO uint8_t *port, uint8_t pinMsk);
  75. void GPIO_PullUp_Enable(__IO uint8_t *port, uint8_t pinMsk);
  76. void GPIO_PullUp_Disable(__IO uint8_t *port, uint8_t pinMsk);
  77. void GPIO_Nch_OpenDrain(__IO uint8_t *port, uint8_t pinMsk);
  78. void GPIO_Ttl_Input(__IO uint8_t *port, uint8_t pinMsk);
  79. void GPIO_Set_Value(__IO uint8_t *port, uint8_t value);
  80. uint8_t GPIO_Get_Value(__IO uint8_t *port);
  81. void PORT_Init(PORT_TypeDef PORTx,PIN_TypeDef PINx,PIN_ModeDef MODEx);
  82. //void PORT_SetBit(PORT_TypeDef PORTx,PIN_TypeDef PINx);
  83. //void PORT_ClrBit(PORT_TypeDef PORTx,PIN_TypeDef PINx);
  84. //void PORT_ToggleBit(PORT_TypeDef PORTx,PIN_TypeDef PINx);
  85. //uint8_t PORT_GetBit(PORT_TypeDef PORTx,PIN_TypeDef PINx);
  86. /*****************************************************************************
  87. ** brief         PORT_SetBit
  88. **                         
  89. ** param [in] PORTx : PORT_TypeDef
  90. **                                PINx: PIN_TypeDef
  91. ** return  none
  92. ** note         
  93. *****************************************************************************/
  94. #define   PORT_SetBit(PORTx,PINx)  do{
  95.                                                                                         *((uint8_t*)((uint8_t*)&PORT->P0+PORTx)) |= (1<P0+PORTx)) &= ~(1<P0+PORTx)) ^= (1<P0+PORTx)) & (1<PMS = 0x01;        /*!< Digital output level of the pin is read */
  96.     return (*port);          /*!< PL = value                              */
  97. }
  98. /**
  99.   * @brief  Initializes the PORTx
  100.   * [url=home.php?mod=space&uid=3142012]@param[/url]  PORTx: where x can be 0~14
  101.   * @param  PINx: where x can be 0~7
  102.   * @param  MODEx: such as INPUT,PULLUP_INPUT,TTL_INPUT,ANALOG_INPUT,OUTPUT,OPENDRAIN_OUTPUT      
  103.         *
  104.   * @retval None
  105.   */
  106. void PORT_Init(PORT_TypeDef PORTx,PIN_TypeDef PINx,PIN_ModeDef MODEx)
  107. {
  108.           uint8_t mode = MODEx;
  109.         uint8_t pos = 1<PMC0+PORTx)) &= ~pos;
  110.                         *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos;
  111.                         *((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos;
  112.                         *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos;
  113.                         *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos;
  114.                         break;
  115.                 case PULLUP_INPUT:
  116.                         *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos;
  117.                         *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos;
  118.                         *((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos;
  119.                         *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos;
  120.                         *((volatile uint8_t*)(&PORT->PU0+PORTx)) |= pos;
  121.                         break;
  122.                 case TTL_INPUT:
  123.                         *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos;
  124.                         *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos;
  125.                         *((volatile uint8_t*)(&PORT->PIM0+PORTx)) |= pos;
  126.                         *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos;
  127.                         *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos;
  128.                         break;
  129.                 case ANALOG_INPUT:
  130.                         *((volatile uint8_t*)(&PORT->PMC0+PORTx)) |= pos;
  131.                         break;
  132.                 case OUTPUT:
  133.                         *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos;
  134.                         *((volatile uint8_t*)(&PORT->PM0+PORTx)) &= ~pos;
  135.                         *((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos;
  136.                         *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos;
  137.                         break;
  138.                 case OPENDRAIN_OUTPUT:
  139.                         *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos;
  140.                         *((volatile uint8_t*)(&PORT->PM0+PORTx)) &= ~pos;
  141.                         *((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos;
  142.                         *((volatile uint8_t*)(&PORT->POM0+PORTx)) |= pos;
  143.                         break;
  144.         }
  145. }
C文件很多函数不能应用头文件的宏

建议使用
PORT_Init这个函数,可以单独初始化GPIO引脚

  1. #include
  2. #include "BAT32G137.h"
  3. #include "userdefine.h"
  4. #include "gpio.h"
  5. #include "sci.h"
  6. /***********************************************************************************************************************
  7. Global variables and functions
  8. ***********************************************************************************************************************/
  9. /***********************************************************************************************************************
  10. Global variables and functions
  11. ***********************************************************************************************************************/
  12. volatile uint32_t g_ticks;
  13. void delayMS(uint32_t n)
  14. {
  15.                 g_ticks = n;
  16.                 while(g_ticks);
  17. }
  18. unsigned char key_scan(void)
  19. {
  20. //   unsigned  char key_val = 0;
  21.           if((PORT_GetBit(PORT7,PIN0) &0x01) == 0)
  22.     {
  23.                         delayMS(5);
  24.                   if((PORT_GetBit(PORT7,PIN0) &0x01) == 0)
  25.                         {
  26.                                  while((PORT_GetBit(PORT7,PIN0) &0x01) == 0)
  27.                            return  1;
  28.                         }
  29.                 }                       
  30.                 return 0;
  31. }
  32. int main(void)
  33. {
  34.         uint32_t msCnt;         // count value of 1ms
  35.   unsigned char data_uart = 0;
  36. //-----------------------------------------------------------------------
  37. // Systick setting
  38. //-----------------------------------------------------------------------   
  39.         g_ticks = 1000;         // 1000ms
  40.         SystemCoreClockUpdate();
  41.         msCnt = SystemCoreClock / 1000;
  42.         SysTick_Config(msCnt);
  43.        
  44.         UART0_Init(SystemCoreClock, 115200);
  45.   PORT_Init(PORT7,PIN1,OUTPUT);
  46.         PORT_Init(PORT7,PIN2,OUTPUT);
  47.   PORT_Init(PORT7,PIN0,PULLUP_INPUT);
  48.         while(1)
  49.         {  
  50.                 //UART0_Receive
  51.                 if(key_scan())
  52.                 {
  53.                         UART0_Send('a');
  54.                         data_uart = UART0_Receive();
  55.                         UART0_Send(data_uart);
  56.                         delayMS(250);
  57.                         PORT_SetBit(PORT7,PIN1);
  58.                         delayMS(250);
  59.                         PORT_ClrBit(PORT7,PIN1);
  60.                         delayMS(250);
  61.                         PORT_SetBit(PORT7,PIN2);
  62.                         delayMS(250);
  63.                         PORT_ClrBit(PORT7,PIN2);
  64.                 }
  65.                
  66.         }
  67. }
  68. /***********************************************************************************************************************
  69. * Function Name: SysTick Handler
  70. * Description  : Decreament the g_ticks value
  71. * Arguments    : None
  72. * Return Value : None
  73. ***********************************************************************************************************************/
  74. void SysTick_Handler(void)
  75. {
  76.         WDT->WDTE = 0xAC;
  77.         g_ticks--;
  78. }








更多回帖

发帖
×
20
完善资料,
赚取积分