国学芯用 发表于 2023-4-7 09:47:15

STC32库函数20230323版及权威使用指南更新

STC32库函数20230323版及权威使用指南更新,欢迎专业建议 !
超级容易上手,极大的降低了32位8051和8051的应用入门难度,新人们有福了,这是超级强悍又简单上手的STC32库函数 !
2023.03.23
1.独立例程添加“A1-STC32G高级PWM1-PWM2-PWM3-PWM4输出测试程序”;
2.独立例程添加“A2-STC32G高级PWM5-PWM6-PWM7-PWM8输出测试程序”;
3.UART串口 函数库,在头文件添加阻塞模式/队列模式设置选择定义,可通过定义选择串口发送模式;
4,PWM库增加了另外一种风格的完整的PWM库
5.更新“STC32库函数使用说明”。
====不懂原理,也可以应用,离开数据手册也能开发 / 那是努力的方向,自成体系

为了方便初学者使用,快速的上手使用STC的单片机进行开发,STC制作了库函数例程包,
将单片机各个模块的寄存器配置通过函数封装起来,用户只要传递参数给函数并进行调用,
就可以完成寄存器的配置,不用花太多的时间精力去研究单片机寄存器的功能和用法,
极大的提升了开发速度。

用户在使用库函数例程包过程中可能还是会遇到各种各样的问题,所以我们打算写一份详细点
的使用说明,方便大家快速的熟悉与上手。这几天搭建了一个框架,大家有什么意见和建议可以
跟帖留言,我们一起来制作完善。

更新记录

2023.03.23
1.独立例程添加“A1-STC32G高级PWM1-PWM2-PWM3-PWM4输出测试程序”;
2.独立例程添加“A2-STC32G高级PWM5-PWM6-PWM7-PWM8输出测试程序”;
3.更新“STC32库函数使用说明”。

2023.03.18
1.UART总线函数库,在头文件添加阻塞模式/队列模式设置选择定义,可通过定义选择串口发送模式;
2.更新“STC32库函数使用说明”。

2023.02.27
1.CAN总线函数库与例程,帧信息使用结构体位段定义并添加帧类型(RTR)配置位段;
2.独立例程添加“A0-GPIO初始化程序-LAOXU版本”;
3.更新“STC32库函数使用说明”。

2023.02.07
1.修改独立例程“Independent_Programme”范例程序部分内容及排序;
2.修改综合例程“Synthetical_Programme”CAN总线函数库与例程;
3.更新“STC32库函数使用说明”。

amazing030 发表于 2023-4-7 09:53:47

STC仿STM32的库函数国内最早还是我做的{:lol:}{:lol:}

国学芯用 发表于 2023-4-7 10:49:30

amazing030 发表于 2023-4-7 09:53
STC仿STM32的库函数国内最早还是我做的
(引用自2楼)

大佬啊 期待您的添砖加瓦,19952583534加我微信,以下宝贝,您选,我安排

STC 全部 【免费 + 包邮】 送:
1,芯片:1T 8051, 32位8051,各种封装的芯片
2,核心功能实验板:
   屠龙刀-STC32G12K128核心功能实验板,MCU自带硬件USB下载, 支持SWD硬件仿真
   开天斧-STC8H8K64U核心功能实验板,MCU自带硬件USB仿真,MCU自带硬件USB下载
3,STC-USB Link1D /【专业仿真器,全自动在线下载器/自动停电上电,脱机烧录器,USB转双串口工具, 专业时钟校准工具】


国学芯用 发表于 2023-4-7 16:45:45

今天用S TC专业仿真器/全自动在线下载器/自动停电上电/脱机烧录器/USB转双串口工具-S TC-USB Link1D来仿真库函数中IO口-跑马灯程序,测试结果如下:

国学芯用 发表于 2023-4-7 16:54:53

本帖最后由 国学芯用 于 2023-4-7 16:56 编辑

国学芯用 发表于 2023-4-11 15:50:37

补充一下 嵌套向量中断介绍

国学芯用 发表于 2023-4-11 16:06:56

04-看门狗复位测试程序
*******功能说明   ***************
初始化翻转电平, 5秒后不喂狗, 等待看门狗复位.

国学芯用 发表于 2023-4-12 16:01:28

今日用:
STC-USB Link1D: 【STC专业仿真器, 全自动在线下载器/自动停电上电, 脱机烧录器, USB转双串口工具】
来测试库函数中的多路ADC转换-串口输出结果程序,测试结果如下:

国学芯用 发表于 2023-4-13 15:44:18

今日用:
STC-USB Link1D: 【STC专业仿真器, 全自动在线下载器/自动停电上电, 脱机烧录器, USB转双串口工具】
来测试库函数中的通过串口发送命令读写EEPROM测试程序,测试结果如下:

#include      "config.h"
#include      "STC32G_GPIO.h"
#include      "STC32G_UART.h"
#include      "STC32G_NVIC.h"
#include      "STC32G_Delay.h"
#include      "STC32G_EEPROM.h"
#include      "STC32G_Switch.h"

/*************      本程序功能说明      **************

通过串口2(P4.6 P4.7)对STC内部自带的EEPROM(FLASH)进行读写测试。

对FLASH做扇区擦除、写入、读出的操作,命令指定地址。

默认波特率:115200,N,8,1.

串口命令设置: (命令字母不区分大小写)
    E 0x000040             --> 对0x000040地址扇区内容进行擦除.
    W 0x000040 1234567890--> 对0x000040地址写入字符1234567890.
    R 0x000040 10          --> 对0x000040地址读出10个字节数据.

注意:下载时,下载界面"硬件选项"中设置用户EEPROM大小,

并确保串口命令中的地址在EEPROM设置的大小范围之内。

下载时, 选择时钟 22.1184MHz (可以在配置文件"config.h"中修改).

******************************************/

#define   Max_Length          100      //读写EEPROM缓冲长度

/*************      本地常量声明      **************/


/*************      本地变量声明      **************/
u8tmp;      //EEPROM操作缓冲


/*************      本地函数声明      **************/


/*************外部函数和变量声明 *****************/


/******************* IO配置函数 *******************/
void      GPIO_config(void)
{
      P4_MODE_IO_PU(GPIO_Pin_6 | GPIO_Pin_7);                //P4.6,P4.7 设置为准双向口
}

/***************串口初始化函数 *****************/
void      UART_config(void)
{
      COMx_InitDefine                COMx_InitStructure;                                        //结构定义
      COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
      COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
      COMx_InitStructure.UART_BaudRate= 115200ul;                        //波特率,   110 ~ 115200
      COMx_InitStructure.UART_RxEnable= ENABLE;                              //接收允许,   ENABLE或DISABLE
      UART_Configuration(UART2, &COMx_InitStructure);                //初始化串口 UART1,UART2,UART3,UART4
      NVIC_UART2_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

      UART2_SW(UART2_SW_P46_P47);                //UART2_SW_P10_P11,UART2_SW_P46_P47
}

/**********************************************/

u8      CheckData(u8 dat)
{
      if((dat >= '0') && (dat <= '9'))                return (dat-'0');
      if((dat >= 'A') && (dat <= 'F'))                return (dat-'A'+10);
      if((dat >= 'a') && (dat <= 'f'))                return (dat-'a'+10);
      return 0xff;
}

//========================================================================
// 函数: u32 GetAddress(void)
// 描述: 计算各种输入方式的地址.
// 参数: 无.
// 返回: 32位EEPROM地址.
// 版本: V1.0, 2013-6-6
//========================================================================
u32 GetAddress(void)
{
      u32 address;
      u8i,j;
      
      address = 0;
      if((RX2_Buffer == '0') && (RX2_Buffer == 'X'))
      {
                for(i=4; i<10; i++)
                {
                        j = CheckData(RX2_Buffer);
                        if(j >= 0x10)   return 0xffffffff;   //error
                        address = (address << 4) + j;
                }
                return (address);
      }
      return0xffffffff;//error
}

/**************** 获取要读出数据的字节数 ****************************/
u8 GetDataLength(void)
{
      u8i;
      u8length;
      
      length = 0;
      for(i=11; i<COM2.RX_Cnt; i++)
      {
                if(CheckData(RX2_Buffer) >= 10)break;
                length = length * 10 + CheckData(RX2_Buffer);
      }
      return (length);
}

/********************* 主函数 *************************/
void main(void)
{
      u8i,j;
      u32 addr;
      u8status;

      WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
      EAXSFR();                //扩展SFR(XFR)访问使能
      CKCON = 0;      //提高访问XRAM速度

      GPIO_config();
      UART_config();
      EA = 1;

      PrintString2("STC32系列单片机EEPROM测试程序,串口命令设置如下:\r\n");    //UART2发送一个字符串
    delay_ms(5);    //等待串口数据发送完成
      PrintString2("E 0x000040             --> 对0x000040地址扇区进行擦除\xfd.\r\n");   //UART2发送一个字符串
    delay_ms(5);    //等待串口数据发送完成
      PrintString2("W 0x000040 1234567890--> 对0x000040地址写入字符1234567890.\r\n");//UART2发送一个字符串
    delay_ms(5);    //等待串口数据发送完成
      PrintString2("R 0x000040 10          --> 对0x000040地址读出10个字节内容.\r\n");    //UART2发送一个字符串
    delay_ms(5);    //等待串口数据发送完成
      while(1)
      {
                delay_ms(1);    //每1毫秒执行一次主循环,也可以使用定时器计时
                if(COM2.RX_TimeOut > 0)                //判断超时计数器
                {
                        if(--COM2.RX_TimeOut == 0)
                        {
      //                        printf("收到内容如下: ");
      //                        for(i=0; i<COM2.RX_Cnt; i++)    printf("%c", RX2_Buffer);    //把收到的数据原样返回,用于测试
      //                        printf("\r\n");

                              status = 0xff;//状态给一个非0值
                              if((COM2.RX_Cnt >= 10) && (RX2_Buffer == ' ')) //最短命令为10个字节
                              {
                                        for(i=0; i<10; i++)
                                        {
                                                if((RX2_Buffer >= 'a') && (RX2_Buffer <= 'z'))    RX2_Buffer = RX2_Buffer - 'a' + 'A';//小写转大写
                                        }
                                        addr = GetAddress();
                                        if(addr < 0x00ffffff)    //限制地址范围
                                        {
                                                if(RX2_Buffer == 'E')    //判断指令类型是否为“E”擦除指令
                                                {
                                                      EEPROM_SectorErase(addr);         //擦除扇区
                                                      PrintString2("已擦除\xfd扇区内容!\r\n");
                                                      status = 0; //命令正确
                                                }

                                                else if((RX2_Buffer == 'W') && (RX2_Buffer == ' '))    //判断指令类型是否为“W”写入指令
                                                {
                                                      j = COM2.RX_Cnt - 11;
                                                      if(j > Max_Length)j = Max_Length; //越界检测
                                                      //EEPROM_SectorErase(addr);         //擦除扇区
                                                      EEPROM_write_n(addr,&RX2_Buffer,j);      //写N个字节
                                                      PrintString2("已写入");
                                                      if(j >= 100)    {TX2_write2buff((u8)(j/100+'0'));   j = j % 100;}
                                                      if(j >= 10)   {TX2_write2buff((u8)(j/10+'0'));    j = j % 10;}
                                                      TX2_write2buff((u8)(j%10+'0'));
                                                      PrintString2("字节!\r\n");
                                                      status = 0; //命令正确
                                                }

                                                else if((RX2_Buffer == 'R') && (RX2_Buffer == ' '))   //PC请求返回N字节EEPROM数据
                                                {
                                                      j = GetDataLength();
                                                      if(j > Max_Length)j = Max_Length; //越界检测
                                                      if(j > 0)
                                                      {
                                                                PrintString2("读出");
                                                                TX2_write2buff((u8)(j/10+'0'));
                                                                TX2_write2buff((u8)(j%10+'0'));
                                                                PrintString2("个字节内容如下:\r\n");
                                                                EEPROM_read_n(addr,tmp,j);
                                                                for(i=0; i<j; i++)TX2_write2buff(tmp);
                                                                TX2_write2buff(0x0d);
                                                                TX2_write2buff(0x0a);
                                                                status = 0; //命令正确
                                                      }
                                                }
                                        }
                              }
                              if(status != 0) PrintString2("命令错误!\r\n");
                              COM2.RX_Cnt = 0;
                        }
                }
      }
}
/**********************************************/
页: [1]
查看完整版本: STC32库函数20230323版及权威使用指南更新