数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2382|回复: 11

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

[复制链接]
头像被屏蔽
发表于 2023-4-4 10:13:59 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
STC32库函数20230323版及权威使用指南更新,改进意见征集中
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库函数使用说明”。

2022.09.01
1.  修改LCM例程显示液晶屏为常用的ILI9341驱动液晶屏。

2022.08.17
1.  修改SPI通道切换端口定义。

2022.07.08
1.  调整模拟串口发送程序位时间函数的延时参数;
2.  修改ADC_DMA通道使能寄存器高低位对应通道。

2022.06.09
1.  CAN、LIN总线中断添加地址寄存器保存与恢复功能,避免主循环里写完地址寄存器后产生中断,在中断里修改了地址寄存器内容。

2022.04.13
1.  STC32G系列芯片SFR寄存器全部支持位操作,修改SFR寄存器位操作方法;
2.  发布独立例程“Independent_Programme”30个范例程序;
3.  添加 library 文件夹,包含现有的外设驱动文件。

2022.04.06
1.  添加 CAN总线函数库及应用例程;
2.  添加 LIN总线函数库及应用例程;
3.  添加 USART/USART2 LIN总线函数库及应用例程;
4.  添加 高速SPI时钟配置函数库及应用例程;
5.  添加 高速PWM时钟配置函数库及应用例程。

2022.03.26
1.  初版发布综合例程“Synthetical_Programme”部分功能程序。




补充内容 (2023-4-18 09:36):
STC32库函数及权威使用指南
欢迎专业建议 !这是超级强悍又容易上手的STC32库函数 !降低了32位8051的应用难度
20230417版更新
头像被屏蔽
 楼主| 发表于 2023-4-18 09:38:44 | 显示全部楼层
STC32库函数及权威使用指南
欢迎专业建议 !这是超级强悍又容易上手的STC32库函数 !降低了32位8051的应用难度
20230417版更新
1.  更新“STC32库函数使用说明”;
2.  I2C、模拟I2C读写库函数添加设备地址参数;
3.  调整部分文件变量定义位置。
====不懂原理,也可以应用,离开数据手册也能开发 / 那是努力的方向,自成体系

为了方便初学者使用,快速上手使用STC的单片机进行开发,STC制作了库函数例程包,
将单片机各个模块的寄存器配置通过函数封装起来,用户只要传递参数给函数并进行调用,
就可以完成寄存器的配置,不用花太多的时间精力去研究单片机寄存器的功能和用法,
极大的提升了开发速度。
用户在使用库函数例程包过程中可能还是会遇到各种各样的问题,所以我们打算写一份详细点
的使用说明,方便大家快速的熟悉与上手。这几天搭建了一个框架,大家有什么意见和建议可以
跟帖留言,我们一起来制作完善。

更新记录
2023.04.17
1.  更新“STC32库函数使用说明”;
2.  I2C、模拟I2C读写库函数添加设备地址参数;
3.  调整部分文件变量定义位置。
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库函数使用说明”。
2022.09.01
1.  修改LCM例程显示液晶屏为常用的ILI9341驱动液晶屏。
2022.08.17
1.  修改SPI通道切换端口定义。
2022.07.08
1.  调整模拟串口发送程序位时间函数的延时参数;
2.  修改ADC_DMA通道使能寄存器高低位对应通道。
2022.06.09
1.  CAN、LIN总线中断添加地址寄存器保存与恢复功能,避免主循环里写完地址寄存器后产生中断,
    在中断里修改了地址寄存器内容。
2022.04.13
1.  STC32G系列芯片SFR寄存器全部支持位操作,修改SFR寄存器位操作方法;
2.  发布独立例程“Independent_Programme”30个范例程序;
3.  添加 library 文件夹,包含现有的外设驱动文件。
2022.04.06
1.  添加 CAN总线函数库及应用例程;
2.  添加 LIN总线函数库及应用例程;
3.  添加 USART/USART2 LIN总线函数库及应用例程;
4.  添加 高速SPI时钟配置函数库及应用例程;
5.  添加 高速PWM时钟配置函数库及应用例程。
2022.03.26
1.  初版发布综合例程“Synthetical_Programme”部分功能程序。

下面是 【独立例程目录】


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-14 16:23:08 | 显示全部楼层

4月14日:
比较器的相关源程序如下:





程序如下:

#include        "config.h"
#include        "STC32G_GPIO.h"
#include        "STC32G_NVIC.h"
#include        "STC32G_Compare.h"

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


/*************        本地变量声明        **************/


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


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


/************************ 比较器配置 ****************************/
void        CMP_config(void)
{
        CMP_InitDefine CMP_InitStructure;                                                //结构定义
        CMP_InitStructure.CMP_EN = ENABLE;                                                                //允许比较器                ENABLE,DISABLE
        CMP_InitStructure.CMP_P_Select     = CMP_P_P37;                //比较器输入正极选择, CMP_P_P37/CMP_P_P50/CMP_P_P51, CMP_P_ADC: 由ADC模拟输入端做正输入.
        CMP_InitStructure.CMP_N_Select     = CMP_N_GAP;                //比较器输入负极选择, CMP_N_GAP: 选择内部BandGap经过OP后的电压做负输入, CMP_N_P36: 选择P3.6做负输入.
        CMP_InitStructure.CMP_InvCMPO      = DISABLE;                        //比较器输出取反,         ENABLE,DISABLE
        CMP_InitStructure.CMP_100nsFilter  = ENABLE;                        //内部0.1us滤波,          ENABLE,DISABLE
        CMP_InitStructure.CMP_Outpt_En     = ENABLE;                        //允许比较结果输出,ENABLE,DISABLE
        CMP_InitStructure.CMP_OutDelayDuty = 16;                                        //比较结果变化延时周期数, 0~63
        CMP_Inilize(&CMP_InitStructure);                                //初始化比较器
        NVIC_CMP_Init(RISING_EDGE|FALLING_EDGE,Priority_0);        //中断使能, RISING_EDGE/FALLING_EDGE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

/************************ IO口配置 ****************************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
        GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;                                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_HighZ;                                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化

        GPIO_InitStructure.Pin  = GPIO_Pin_7;                                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);        //初始化
}

/************************ 定时器配置 ****************************/

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

        GPIO_config();
        CMP_config();

        EA = 1;
        while (1);
}

编译如下:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-4-13 15:58:20 | 显示全部楼层
越来越完美了。好样的
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-13 15:41:56 | 显示全部楼层
4.13  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缓冲长度

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


/*************        本地变量声明        **************/
u8  tmp[Max_Length];        //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;
        u8  i,j;
       
        address = 0;
        if((RX2_Buffer[2] == '0') && (RX2_Buffer[3] == 'X'))
        {
                for(i=4; i<10; i++)
                {
                        j = CheckData(RX2_Buffer);
                        if(j >= 0x10)   return 0xffffffff;   //error
                        address = (address << 4) + j;
                }
                return (address);
        }
        return  0xffffffff;  //error
}

/**************** 获取要读出数据的字节数 ****************************/
u8 GetDataLength(void)
{
        u8  i;
        u8  length;
       
        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)
{
        u8  i,j;
        u32 addr;
        u8  status;

        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[1] == ' ')) //最短命令为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[0] == 'E')    //判断指令类型是否为“E”擦除指令
                                                {
                                                        EEPROM_SectorErase(addr);           //擦除扇区
                                                        PrintString2("已擦除\xfd扇区内容!\r\n");
                                                        status = 0; //命令正确
                                                }

                                                else if((RX2_Buffer[0] == 'W') && (RX2_Buffer[10] == ' '))    //判断指令类型是否为“W”写入指令
                                                {
                                                        j = COM2.RX_Cnt - 11;
                                                        if(j > Max_Length)  j = Max_Length; //越界检测
                                                        //EEPROM_SectorErase(addr);           //擦除扇区
                                                        EEPROM_write_n(addr,&RX2_Buffer[11],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[0] == 'R') && (RX2_Buffer[10] == ' '))   //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;
                        }
                }
        }
}

编译如下:

下载软件发送结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-12 15:06:06 | 显示全部楼层
4.12  ADC库函数源文件介绍:





范例程序如下:

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

/*************        功能说明        **************

本程序演示16路ADC查询采样,通过串口1(P3.0,P3.1)发送给上位机,波特率115200,N,8,1。

需要在"STC32G_UART.h"里设置: #define        PRINTF_SELECT  UART1

用定时器做波特率发生器,建议使用1T模式(除非低波特率用12T),并选择可被波特率整除的时钟频率,以提高精度。

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

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


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


/*************        本地变量声明        **************/


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


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


/******************* IO配置函数 *******************/
void        GPIO_config(void)
{
        P0_MODE_IN_HIZ(GPIO_Pin_LOW | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);        //P0.0~P0.6 设置为高阻输入
        P1_MODE_IN_HIZ(GPIO_Pin_All);                //P1.0~P1.7 设置为高阻输入
        P3_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);        //P3.0,P3.1 设置为准双向口
}

/******************* AD配置函数 *******************/
void        ADC_config(void)
{
        ADC_InitTypeDef                ADC_InitStructure;                //结构定义
        ADC_InitStructure.ADC_SMPduty   = 31;                //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
        ADC_InitStructure.ADC_CsSetup   = 0;                //ADC 通道选择时间控制 0(默认),1
        ADC_InitStructure.ADC_CsHold    = 1;                //ADC 通道选择保持时间控制 0,1(默认),2,3
        ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X16T;                //设置 ADC 工作时钟频率        ADC_SPEED_2X1T~ADC_SPEED_2X16T
        ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;        //ADC结果调整,        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
        ADC_Inilize(&ADC_InitStructure);                //初始化
        ADC_PowerControl(ENABLE);                                                //ADC电源开关, ENABLE或DISABLE
        NVIC_ADC_Init(DISABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

/***************  串口初始化函数 *****************/
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_Timer1;                        //选择波特率发生器, BRT_Timer1,BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
        COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率,     110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
        UART_Configuration(UART1, &COMx_InitStructure);                //初始化串口 UART1,UART2,UART3,UART4
        NVIC_UART1_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

/**********************************************/
void main(void)
{
        u8        i;
        u16        j;

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

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

        printf("STC32G AD to UART Test Programme!\r\n");        //UART发送一个字符串

        while (1)
        {
                for(i=0; i<16; i++)
                {
                        delay_ms(200);

                        //Get_ADCResult(i);                //参数0~15,查询方式做一次ADC, 丢弃一次
                        j = Get_ADCResult(i);        //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
                        printf("AD%02d=%04d ",i,j);
                        if((i & 7) == 7)        printf("\r\n");
                }
                printf("\r\n");
        }
}

KEIL编译如下:

烧录到芯片后,下载软件上发送数据测试如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-11 14:46:12 | 显示全部楼层
本帖最后由 疯狂的兔子来了 于 2023-4-11 15:00 编辑

4月11日:
串口源文件介绍:








串口1与电脑收发程序如下:
#include        "config.h"
#include        "STC32G_GPIO.h"
#include        "STC32G_UART.h"
#include        "STC32G_NVIC.h"
#include        "STC32G_Delay.h"
#include        "STC32G_Switch.h"

/*************        功能说明        **************

双串口全双工中断方式收发通讯程序。

通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回, 默认波特率:115200,N,8,1.

通过开启 UART.h 头文件里面的 UART1~UART4 定义,启动不同通道的串口通信。

用定时器做波特率发生器,建议使用1T模式(除非低波特率用12T),并选择可被波特率整除的时钟频率,以提高精度。

下载时, 选择时钟 22.1184MHz (用户可在"config.h"修改频率).

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

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


/*************        本地变量声明        **************/


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


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


/******************* IO配置函数 *******************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                //结构定义

        GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
        GPIO_InitStructure.Mode = GPIO_PullUp;        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
}

/***************  串口初始化函数 *****************/
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_Timer1;                        //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
        COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率, 一般 110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
        COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
        UART_Configuration(UART1, &COMx_InitStructure);                //初始化串口1 UART1,UART2,UART3,UART4
        NVIC_UART1_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}


/**********************************************/
void main(void)
{
        u8        i;

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

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

        PrintString1("STC32G UART1 Test Programme!\r\n");        //UART1发送一个字符串
        
        while (1)
        {
                delay_ms(1);
                if(COM1.RX_TimeOut > 0)                //超时计数
                {
                        if(--COM1.RX_TimeOut == 0)
                        {
                                if(COM1.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM1.RX_Cnt; i++)        TX1_write2buff(RX1_Buffer);        //收到的数据原样返回
                                }
                                COM1.RX_Cnt = 0;
                        }
                }
        }
}

下载串口程序,成功发送数据如下:







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-10 14:33:57 | 显示全部楼层
本帖最后由 疯狂的兔子来了 于 2023-4-11 09:34 编辑

看门狗源文件介绍:



看门狗独立例程:

看门狗复位程序如下:

#include        "config.h"
#include        "STC32G_WDT.h"
#include        "STC32G_GPIO.h"
#include        "STC32G_Delay.h"

/*************   功能说明   ***************

初始化翻转电平, 5秒后不喂狗, 等待看门狗复位.

下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).

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

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


/*************        本地变量声明        **************/
u16 ms_cnt;
u8  second;    //测试用的计数变量

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


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



/******************** IO口配置 ********************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                        //结构定义

        GPIO_InitStructure.Pin  = GPIO_Pin_7;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);            //初始化
}

/******************** WDT配置 ********************/
void        WDT_config(void)
{
        WDT_InitTypeDef        WDT_InitStructure;                                        //结构定义

        WDT_InitStructure.WDT_Enable     = ENABLE;                        //看门狗使能   ENABLE或DISABLE
        WDT_InitStructure.WDT_IDLE_Mode  = WDT_IDLE_STOP;        //IDLE模式是否停止计数                WDT_IDLE_STOP,WDT_IDLE_RUN
        WDT_InitStructure.WDT_PS         = WDT_SCALE_16;        //看门狗定时器时钟分频系数        WDT_SCALE_2,WDT_SCALE_4,WDT_SCALE_8,WDT_SCALE_16,WDT_SCALE_32,WDT_SCALE_64,WDT_SCALE_128,WDT_SCALE_256
        WDT_Inilize(&WDT_InitStructure);                                        //初始化
}

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

        GPIO_config();
        
        P47 = 0;
        delay_ms(200);
        P47 = 1;
        delay_ms(200);
        P47 = 0;
        delay_ms(200);
        P47 = 1;
        delay_ms(200);
        
        WDT_config();

        RSTFLAG |= 0x04;   //设置看门狗复位需要检测P3.2的状态,否则看门狗复位后进入USB下载模式

        while(1)
        {
                delay_ms(1);    //延时1ms
                if(second <= 5)    //5秒后不喂狗, 将复位,
                        WDT_Clear();    // 喂狗

                if(++ms_cnt >= 1000)
                {
                        ms_cnt = 0;
                        second++;
                }
        }
}

编译如下,可以看看门狗的表现:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-7 14:49:56 | 显示全部楼层
本帖最后由 疯狂的兔子来了 于 2023-4-8 11:25 编辑


1.外部中断源文件介绍:


2.外部中断库函数简介:




3.外部中断主程序如下:




4.KEIL编译范例仿真如下:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-6 11:51:08 | 显示全部楼层

原版STC32最新软件库函数,  可从最新的 STC-ISP V6.91M 版软件或以后的版本获得:

库函数源文件介绍:





程序如下:




最新的实验箱9.6 实践 库函数的定时器,仿真成功:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-4-4 23:08:41 | 显示全部楼层
STC32库函数简单应用 - I/O口流水灯
通过简单的例程来介绍库函数的使用方法。
首先在项目里面添加需要用到的库函数文件:


然后在主程序文件里面添加IO口初始化程序和主循环程序:
void GPIO_config(void)
{
    P2_MODE_IO_PU(GPIO_Pin_All);       //P2 设置为准双向口
}


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


    GPIO_config();


    while(1)
    {
        P20 = 0;                //LED On
        delay_ms(250);
        P20 = 1;                //LED Off
        P21 = 0;                //LED On
        delay_ms(250);
        P21 = 1;                //LED Off
        P22 = 0;                //LED On
        delay_ms(250);
        P22 = 1;                //LED Off
        P23 = 0;                //LED On
        delay_ms(250);
        P23 = 1;                //LED Off
        P24 = 0;                //LED On
        delay_ms(250);
        P24 = 1;                //LED Off
        P25 = 0;                //LED On
        delay_ms(250);
        P25 = 1;                //LED Off
        P26 = 0;                //LED On
        delay_ms(250);
        P26 = 1;                //LED Off
        P27 = 0;                //LED On
        delay_ms(250);
        P27 = 1;                //LED Off
    }
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-4-4 11:43:39 | 显示全部楼层
2023年4月4日,测试IO程序,结合最新的实验箱,仿真如下:
keil仿真成功的界面如下:


硬件IO点亮图:

非常实用方便,网友们学起来!




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 19:29 , Processed in 0.202801 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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