29aH 发表于 2025-3-4 17:24:45

32芯片IO配置自动生成

使用EXCEL表格填写IO模式及定义,使用宏程序一键复制初始化代码,支持LQFP32、LQFP64封装



通过以下程序进行初始化配置


#include "GPIO.h"

/*===========================================================================================================================      
                              **GPIO模式配置函数**
                              
*参数*          Pn:IO口组号   *p:模式代号字符串(长度固定8个字符)      Pu:是否启用内部上拉电阻(加载"BIN.h"文件,使用二进制代入)   Init:IO初始状态电平

*返回值*         -1:模式字符错误                -2:Pn端口数据错误    1:执行完成

*声明*                1、代号高位在前,代号允许空格符间隔;      2、使能内部4.1k上拉电阻采用虚拟二进制表达时需严格按照BIN.h文件中的格式,格式高位在前

*用法*                GPIO(0,"SSSSKKKK",B0000_1010,B0000_0000);//P0.0到P0.3设置为开漏模式,P0.4到P0.7设为双向口 使能P0.2和P0.3的上拉电阻,IO初始状态为0000 0000   

      PnM0PnM1      MOD               代号
      0                        0                              准双向口                              'S'
      0                        1                              高阻输入                              'Z'
      1                        0                              推挽输出                              'T'
      1                        1                              开漏输出                              'K'
      
===========================================================================================================================*/
char GPIO(char Pn,char *p,unsigned char Pu,char Init)
{
      char Mod0=0,Mod1=0;//模式配置缓存
      char i=8;//字符串检索长度,固定8个
      uchar psw2 = 0;
      
      psw2 = P_SW2;//记录当前权限状态
      
      while(i--)//检索字符串配置
      {
                Mod0 <<= 1;
                Mod1 <<= 1;
               
                switch (*p++)//匹配字符命令
                {
                        case 'S':                         //准双向口
                              Mod0 &= 0xFE;//最低位设0
                              Mod1 &= 0xFE;//最低位设0
                              break;
                        case 'Z':                         //高阻输入
                              Mod0 &= 0xFE;//最低位设0
                              Mod1 |= 0x01;//最低位设1
                              break;
                        case 'T':                         //推挽输出
                              Mod0 |= 0x01;//最低位设1
                              Mod1 &= 0xFE;//最低位设0
                              break;      
                        case 'K':                         //开漏输出
                              Mod0 |= 0x01;//最低位设1
                              Mod1 |= 0x01;//最低位设1
                              break;
                        case ' ':                         //空格符
                              i++;                                  //忽略本次循环
                              Mod0 >>= 1;         //移动回来
                              Mod1 >>= 1;         //移动回来
                              break;
                              
                        default:                //非法字符
                              return -1;//返回错误
                              break;
                }      
      }
      
      P_SW2 |= 0x80;//使能访问XFR外设端口寄存器
      switch (Pn)                //配置模式、上拉电阻、初始电平
      {
                case 0://P0口配置
                        P0M0=Mod0;      P0M1=Mod1; P0PU=Pu;      P0=Init;
                        break;
                case 1://P1口配置
                        P1M0=Mod0;      P1M1=Mod1; P1PU=Pu;      P1=Init;
                        break;
                case 2://P2口配置
                        P2M0=Mod0;      P2M1=Mod1; P2PU=Pu;      P2=Init;
                        break;
                case 3://P3口配置
                        P3M0=Mod0;      P3M1=Mod1; P3PU=Pu;      P3=Init;
                        break;
                case 4://P4口配置
                        P4M0=Mod0;      P4M1=Mod1; P4PU=Pu;      P4=Init;
                        break;
                case 5://P5口配置
                        P5M0=Mod0;      P5M1=Mod1; P5PU=Pu;      P5=Init;
                        break;
                case 6://P6口配置
                        P6M0=Mod0;      P6M1=Mod1; P6PU=Pu;      P6=Init;
                        break;
                case 7://P7口配置
                        P7M0=Mod0;      P7M1=Mod1; P7PU=Pu;      P7=Init;
                        break;
                        
                default:                              //非法数据
                        P_SW2 &=~0x80;//禁能访问XFR外设端口寄存器
                        return -2;                //返回错误
                        break;
      }
      P_SW2 = psw2;//还原权限状态
      return 1;                                 //返回完成
}


国芯人工智能 发表于 2025-3-4 17:28:00

STC32芯片的IO配置自动生成工具通过EXCEL表格简化了开发流程。用户只需在表格中填写IO模式及定义,即可利用宏程序一键生成初始化代码,显著提升了开发效率。该工具支持LQFP32和LQFP64封装,适应多种应用场景。

初始化配置程序示例如下:

c
#include "GPIO.h"

/*===========================================================================================================================      
                              **GPIO模式配置函数**
===========================================================================================================================*/
void GPIO_Config(void) {
    // 根据EXCEL表格生成的代码自动配置IO模式
    // 示例代码
    P0M1 = 0x00; P0M0 = 0xFF; // 配置P0口为推挽输出
    P1M1 = 0xFF; P1M0 = 0x00; // 配置P1口为开漏输入
    // 更多配置根据用户定义自动生成
}

此工具不仅减少了手动编写代码的错误率,还大幅缩短了开发周期,适用于批量生产和快速原型开发。建议开发者充分利用这一工具,以提升项目效率。

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-3-4 17:33:00

针对32芯片的IO配置自动生成,采用EXCEL表格进行IO模式及定义的输入,结合宏程序实现一键复制初始化代码,极大提升了开发效率。该方案支持LQFP32、LQFP64等多种封装形式,适用于不同硬件平台。通过调用GPIO库中的配置函数,开发者可快速完成IO初始化。以下为示例代码:

c
#include "GPIO.h"

/*===========================================================================================================================      
                              **GPIO模式配置函数**
void GPIO_Config(void) {
    // 根据EXCEL表格生成的配置代码
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 配置示例
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

此方法简化了IO配置流程,降低了出错率,适用于大规模项目开发。

[本文内容由国芯人工智能辅助生成,仅供参考]

zhudean11 发表于 2025-3-11 05:25:05

好办法

jwd 发表于 2025-3-11 07:49:55

{:4_174:}

小知青 发表于 2025-4-22 20:34:08

这个好!收藏了
页: [1]
查看完整版本: 32芯片IO配置自动生成