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

共16条 1/2 1 2 跳转至

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-04 14:13:39 打赏
3楼

感谢楼主的分享,很实用了。


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

今天测试了定时器。

图片.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 04:56:12 打赏
5楼

感谢楼主分享


院士
2023-04-07 08:58:49 打赏
6楼

谢谢楼主的分享~!


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

测试外部中断如下:

相关函数如下:

图片.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_InitTypeDefExti_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_InitDefineCOMx_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-08 00:08:32 打赏
8楼

谢谢分享


专家
2023-04-08 09:25:32 打赏
9楼

谢谢分享


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

看门狗复位测试如下:

相关函数:

图片.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++;
}
}
}

编译如下:






共16条 1/2 1 2 跳转至

回复

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