这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STC32库函数20230417版及权威使用指南更新

共9条 1/1 1 跳转至

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

助工
2023-04-04 13:36:23     打赏

欢迎专业建议 !这是超级强悍又容易上手的STC32库函数 !降低了32位8051的应用难度
20230417版更新
1.  更新“STC32库函数使用说明”;
2.  I2C、模拟I2C读写库函数添加设备地址参数;
3.  调整部分文件变量定义位置。
====不懂原理,也可以应用,离开数据手册也能开发 / 那是努力的方向,自成体系

5555.png为了方便初学者使用,快速的上手使用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”部分功能程序。

STC32G-SOFTWARE-LIB-20230417.zip

STC32库函数使用说明-20230417.pdf




关键词: STC32     库函数    

助工
2023-04-04 14:06:00     打赏
2楼

2023年4月4日,测试IO跑马灯程序,结合最新的实验箱,结果如下:
keil仿真成功的界面:

硬件IO点亮图:

点亮图.jpg

便于学习开发使用。



助工
2023-04-06 13:22:12     打赏
3楼

今天测试了定时器。

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

程序如下:

#include        "config.h"
#include        "S TC32G_Timer.h"
#include        "S TC32G_GPIO.h"
#include        "S TC32G_NVIC.h"

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

程序演示5个定时器的使用, 均使用16位自动重装.

定时器0做16位自动重装, 中断频率为100000Hz,中断函数从P6.7取反输出50KHz方波信号.

定时器1做16位自动重装, 中断频率为10000Hz,中断函数从P6.6取反输出5KHz方波信号.

定时器2做16位自动重装, 中断频率为1000Hz,中断函数从P6.5取反输出500Hz方波信号.

定时器3做16位自动重装, 中断频率为100Hz,中断函数从P6.4取反输出50Hz方波信号.

定时器4做16位自动重装, 中断频率为50Hz,中断函数从P6.3取反输出25Hz方波信号.

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

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

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


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


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



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



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

        GPIO_InitStructure.Pin  = GPIO_Pin_HIGH | GPIO_Pin_3;                        //指定要初始化的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_P6,&GPIO_InitStructure);        //初始化

        GPIO_InitStructure.Pin  = GPIO_Pin_0;                                //指定要初始化的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);        //初始化
}

/************************ 定时器配置 ****************************/
void        Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 100000UL));                //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 10000));                        //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer1,&TIM_InitStructure);                                        //初始化Timer1          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer1_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 1000));                                //初值
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer2,&TIM_InitStructure);                                        //初始化Timer2          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer2_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级

        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = ENABLE;                                        //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / (100*12)));                //初值
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer3,&TIM_InitStructure);                                        //初始化Timer3          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer3_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级

        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = ENABLE;                                        //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / (50*12)));                //初值
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer4,&TIM_InitStructure);                                        //初始化Timer4          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer4_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级
}


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

        GPIO_config();
        Timer_config();
        EA = 1;
        P40 = 0;                     //打开实验箱LED电源

        while (1);
}

KEIL仿真界面如下:

图片.png

实验箱结果如下:

图片.png


助工
2023-04-07 15:15:15     打赏
4楼

测试外部中断如下:

相关函数如下:

图片.png

图片.png

图片.png

图片.png

图片.png

程序如下:

#include "config.h"

#include "STC32G_Exti.h"

#include "STC32G_GPIO.h"

#include "STC32G_UART.h"

#include "STC32G_NVIC.h"

#include "STC32G_Delay.h"

#include "STC32G_Switch.h"

 

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

 

演示INT0~INT4 5个唤醒源将MCU从休眠唤醒.

 

从串口输出唤醒源跟唤醒次数,115200,N,8,1.

 

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

 

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

 

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

 

sbit INT0 = P3^2;

sbit INT1 = P3^3;

sbit INT2 = P3^6;

sbit INT3 = P3^7;

sbit INT4 = P3^0;

 

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

 

u8 WakeUpCnt;

 

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

 

 

 

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

 

 

 

/******************** IO口配置 ********************/

void GPIO_config(void)

{

P3_MODE_IO_PU(GPIO_Pin_All);  //P3.0~P3.7 设置为准双向口

P3_PULL_UP_ENABLE(GPIO_Pin_All);//P3 口内部上拉电阻使能

P4_MODE_IO_PU(GPIO_Pin_6 | GPIO_Pin_7); //P4.6,P4.7 设置为准双向口

}

 

/******************** INT配置 ********************/

void Exti_config(void)

{

EXTI_InitTypeDef Exti_InitStructure;       //结构定义

 

Exti_InitStructure.EXTI_Mode      = EXT_MODE_Fall;//中断模式,   EXT_MODE_RiseFall,EXT_MODE_Fall

Ext_Inilize(EXT_INT0,&Exti_InitStructure);    //初始化

NVIC_INT0_Init(ENABLE,Priority_0);  //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

 

Exti_InitStructure.EXTI_Mode      = EXT_MODE_Fall;//中断模式,   EXT_MODE_RiseFall,EXT_MODE_Fall

Ext_Inilize(EXT_INT1,&Exti_InitStructure);    //初始化

NVIC_INT1_Init(ENABLE,Priority_0);  //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

 

NVIC_INT2_Init(ENABLE,NULL);  //中断使能, ENABLE/DISABLE; 无优先级

NVIC_INT3_Init(ENABLE,NULL);  //中断使能, ENABLE/DISABLE; 无优先级

// NVIC_INT4_Init(ENABLE,NULL);  //中断使能, ENABLE/DISABLE; 无优先级

}

 

/****************  串口初始化函数 *****************/

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;    //接收允许,   ENABLEDISABLE

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

}

 

/******************** 主函数***********************/

void main(void)

{

WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快

EAXSFR();  //扩展SFR(XFR)访问使能

CKCON = 0;      //提高访问XRAM速度

 

GPIO_config();

UART_config();

Exti_config();

EA  = 1;  //Enable all interrupt

 

PrintString2("STC32G EXINT Wakeup Test Programme!\r\n"); //UART发送一个字符串


while(1)

{

while(!INT0); //等待外中断为高电平

while(!INT1); //等待外中断为高电平

while(!INT2); //等待外中断为高电平

while(!INT3); //等待外中断为高电平

//  while(!INT4); //等待外中断为高电平

delay_ms(10); //delay 10ms

 

while(!INT0); //等待外中断为高电平

while(!INT1); //等待外中断为高电平

while(!INT2); //等待外中断为高电平

while(!INT3); //等待外中断为高电平

//  while(!INT4); //等待外中断为高电平

 

WakeUpSource = 0;

PrintString2("MCU进入休眠状态!\r\n");

delay_ms(10); //delay 10ms,等待串口数据发送完成

 

PD = 1;  //Sleep

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();


if(WakeUpSource == 1) PrintString2("外中断INT0唤醒  ");

if(WakeUpSource == 2) PrintString2("外中断INT1唤醒  ");

if(WakeUpSource == 3) PrintString2("外中断INT2唤醒  ");

if(WakeUpSource == 4) PrintString2("外中断INT3唤醒  ");

if(WakeUpSource == 5) PrintString2("外中断INT4唤醒  ");


WakeUpCnt++;

TX2_write2buff((u8)(WakeUpCnt/100+'0'));

TX2_write2buff((u8)(WakeUpCnt%100/10+'0'));

TX2_write2buff((u8)(WakeUpCnt%10+'0'));

PrintString2("次唤醒\r\n");

}

 

}

仿真如下:

外部中断仿真.jpg


助工
2023-04-10 15:44:47     打赏
5楼

看门狗复位测试如下:

相关函数:

图片.png

图片.png

图片.png

看门狗复位程序如下:

#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++;
                }
        }
}

编译如下:






助工
2023-04-11 14:36:06     打赏
6楼

串口中断模式与电脑收发测试如下:

相关函数如下:

image.png


串口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[i]); //收到的数据原样返回

}

COM1.RX_Cnt = 0;

}

}

}

}

编译如下:

7.png

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

群.png






助工
2023-04-12 16:16:19     打赏
7楼

多路ADC转换-串口输出结果测试如下:

相关函数:

1.png

2.jpg


程序如下:

#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"

 

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

 

本程序演示16ADC查询采样,通过串口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电源开关, ENABLEDISABLE

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;    //接收允许,   ENABLEDISABLE

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");

}

}

编译如下:

5.png

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

7.png



助工
2023-04-13 16:52:25     打赏
8楼

测试EEPROM如下:

相关函数如下:


通过串口发送命令读写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;
                        }
                }
        }
}

编译如下:

4.png

下载软件发送结果如下:

555.jpg


助工
2023-04-14 17:05:36     打赏
9楼

测试比较器如下:

相关函数如下:

利用P3.7做比较器正极输入源,内部1.19V或P3.6口做负极输入源程序如下:

#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);

}

编译如下:

6.png



共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]