STC32通用GPIO中断,库函数配置方式 AI8051U和STC32G已测试没有问题

近来STC的单片机已经出到32位了,并且个人自己打板测试了几个型号,相比之前的51完全不是一个量级,可以通过以下这张图片中的信息来感受一下如今的32位8051单片机的强大,也是很很期待25年的这一新作了!
在这里插入图片描述
配图为AI8052U或叫STC/AI32G144K256 预计今年夏天能用上。

GPIO_INT_LIB.h

#ifndef __GPIO_XINT_H
#define __GPIO_XINT_H
#include "config.h"
//--------------------------------定义变量-----------------------------------
//      7           6          5           4            3           2           1           0     --》
//  10000000    010000000   00100000    00010000    00001000    00000100    00000010    00000001  --》1<<Pin
//    0x80        0x40        0x20        0x10        0x08        0x04        0x02        0x01    --》位 Pin   管脚
#define  P0_ENABLE_IOINT(Pin)	        {P0INTE |= (Pin);}   //1使能
#define  P0_DISENABLE_IOINT(Pin)	    {P0INTE &= ~(Pin);}  //0失能
/*	端口1到7同上方式	*/

//端口中断优先级设置,这种方式看上去简单,但代码量多,不太建议
#define  PO_INT_Priority(n)	 do{ if(n == 0) PINIPH &= ~(0x01), PINIPL &= ~(0x01); \
                                 if(n == 1) PINIPH &= ~(0x01), PINIPL |=  (0x01); \
								 if(n == 2) PINIPH |=  (0x01), PINIPL &= ~(0x01); \
								 if(n == 3) PINIPH |=  (0x01), PINIPL |=  (0x01); \
								}while(0)
/*---------------*/
#define	PxINT_MODE_Fall		0	//下降沿中断
#define	PxINT_MODE_Rise     1	//上升沿中断
#define	PxINT_MODE_LOW		2	//低电平中断
#define	PxINT_MODE_HIGH     3	//高电平中断
//IO中断用户函数
u8 NVIC_PxINT_Init(u8 GPIO_Px, u8 Priority);
u8 GPIO_INT_InitE(u8 GPIO, GPIO_InitTypeDef *GPIOx);
#endif

接着来编写初始化函数

/***********************************************************************************
 * 函 数 名:u8 GPIO_INT_InitE(u8 GPIO, GPIO_InitTypeDef *GPIOx)
 * 功    能:初始化GPIO 端口中断,精确到每个IO口,初始化后立即使能,eg: P0INTE  的7个位对应P0.0到P0.7
 * 参    数:GPIO端口,I/O结构体(管脚和中断模式配置)
 * 返 回 值:无
 * 软件版本:V1.0
 **********************************************************************************/
u8 GPIO_INT_InitE(u8 GPIO_PX, GPIO_InitTypeDef *GPIOx)
{
	if(GPIO_PX > GPIO_P7)	return FAIL;	                //错误
	if(GPIOx->Mode > PxINT_MODE_HIGH)	return FAIL;	//错误
    switch(GPIO_PX)
    {
        case GPIO_P0:
        {
            if(GPIOx->Mode == PxINT_MODE_Fall)		{P0IM1 &= ~(GPIOx->Pin),   P0IM0 &= ~(GPIOx->Pin);}	 //下降沿中断
            if(GPIOx->Mode == PxINT_MODE_Rise)		{P0IM1 &= ~(GPIOx->Pin),   P0IM0 |=  (GPIOx->Pin);}	 //上升沿中断
            if(GPIOx->Mode == PxINT_MODE_LOW)		{P0IM1 |=  (GPIOx->Pin),   P0IM0 &= ~(GPIOx->Pin);}	 //低电平中断
            if(GPIOx->Mode == PxINT_MODE_HIGH)		{P0IM1 |=  (GPIOx->Pin),   P0IM0 |=  (GPIOx->Pin);}	 //高点平中断
            P0_MODE_IO_PU(GPIOx->Pin); //准双向口 内部若上拉,实际可能需要根据选择的中断方式对应配置I/O模式,这里先放到此处
            P0_ENABLE_IOINT(GPIOx->Pin)//使能P0.Pin中断
		}break;
		/* -------------其他端口------------ */
	}
	return SUCCESS;	        //成功
}

/***********************************************************************************
 * 函 数 名: NVIC_PxINT_Init
 * 描    述: PxINT嵌套向量中断控制器初始化.
 * 参    数: Priority: 中断优先级, Priority_0,Priority_1,Priority_2,Priority_3.
 * 返    回: 执行结果 SUCCESS/FAIL.
 * 版    本: V1.0
 **********************************************************************************/
u8 NVIC_PxINT_Init(u8 GPIO_Px, u8 Priority)
{
    if(GPIO_Px > GPIO_P7)	return FAIL;
    if(Priority <= Priority_3)
    {
        if(Priority_0 == Priority) PINIPH &= ~(0x01<<GPIO_Px), PINIPL &= ~(0x01<<GPIO_Px);
        if(Priority_1 == Priority) PINIPH &= ~(0x01<<GPIO_Px), PINIPL |=  (0x01<<GPIO_Px);
		if(Priority_2 == Priority) PINIPH |=  (0x01<<GPIO_Px), PINIPL &= ~(0x01<<GPIO_Px);
		if(Priority_3 == Priority) PINIPH |=  (0x01<<GPIO_Px), PINIPL |=  (0x01<<GPIO_Px);

//        switch(GPIO_Px)  //两种方式都可以,上面的方式代码量小
//        {
//            case GPIO_P0: PO_INT_Priority(Priority); break;
				/*	-------------------   */
//            default: 
//                break;
//        }
    }
    else  return FAIL;
    
	return SUCCESS;
}

最后写测试函数

/***********************************************************************************
 * 函 数 名:void GPIO_PxINT_Init()
 * 功    能:IO端口中断,初始化,设置中断IO,以及中断模式、端口优先级等
 * 参    数:无
 * 返 回 值:无
 * 说    明:AI8051U或STC32G支持所有普通I/O可中断,切记需要手动清除中断标志位(详见中断服务函数)
 **********************************************************************************/
void GPIO_PxINT_Init()
{
    GPIO_InitTypeDef  GPIO_PxINT_Structure;

    GPIO_PxINT_Structure.Pin  = GPIO_Pin_0|GPIO_Pin_3;  //要初始化的I/O  eg: GPIO_Pin_0|GPIO_Pin_2;
    GPIO_PxINT_Structure.Mode = PxINT_MODE_Fall;        //初始化的I/O 模式 下降沿触发中断
    GPIO_INT_InitE(GPIO_P0,&GPIO_PxINT_Structure);      //初始化管脚中断模式行 并 >使能< 其管脚中断!!!
//    P0_ENABLE_IOINT(Pinx);                              //  使能P0.Pinx管脚 IO中断,失能:P0_DISENABLE_IOINT(Pin)
    //根据初始化的中断模式选择是否需要开启,内部上下拉电阻
    P0_PULL_UP_ENABLE(GPIO_Pin_0);                      //使能P0.0 口内部上拉电阻!!!

    NVIC_PxINT_Init(GPIO_P0,Priority_0);                //中断优先级配置,对象是端口 PO_INT_Priority(Priority_0);
}

/***********************************************************************************
 * 函 数 名:void Test_GPIO_PxINT()
 * 功    能:STC GPIO中断测试函数,中断服务函数中LED0状态,借用13号中断,或添加支持31以上中断号
 * 参    数:无
 * 返 回 值:无
 * 说    明:AI8051U或STC32G支持所有普通I/O可中断,切记需要手动清除中断标志位(详见中断服务函数)
 **********************************************************************************/
void Test_GPIO_PxINT()
{

    GPIO_LED_Init();
    GPIO_PxINT_Init();          //请前往 STC32_GPIO_ISR.C 中对应的中断服务函数中编写中断服务程序
    Global_IRQ_Enable();

//    OLED_CLS();
//    OLED_P6x8Str(10, 0, "Test P00_INT");

    while(1)
    {
        ;
    }
}

最后想了像还是把中盾服务函数的实现也放出来吧,虽然你说看下手册很容就能够写出来,但是啊,还是展现出来更为直观。
需要注意的是,STC/AI32的GPIO中断是以端口触发的,想要确定具体是哪个管脚则需要软件查询,以下给出简单的查询方式,亦或者自己再细分处理,建立枚举表,通过端口触发后精确到具体的每个I/O上。

//========================================================================
// 函数: void P0xINT_ISR_Handler
// 描述: GPIO P0端口中断函数
// 参数: none.
// 返回: none.
// 版本: V1.0, 2024-11-18
//      如果if判断,将中断服务函数写在其中,不美观,可单独设立一个函数,来写中断服务内容,在进中断后调用
//========================================================================
void P0INT_ISR_Handler (void) interrupt P0INT_VECTOR		//进中断后手动清除标志位
{
    u8 P0x_IRQ;
    P0x_IRQ = P0INTF;       //P0端口中断标志寄存器
    if(P0x_IRQ)
    {
        P0INTF = 0x00;      //清除P0端口中断标志位
        if(P0x_IRQ&GPIO_Pin_0)    /* P0.0中断服务*/
        {
            // TODO: 在此处添加用户代码
            LED_Ctrl(LED0,RVS);
        }

        if(P0x_IRQ&GPIO_Pin_3)    /* P0.3中断服务*/
        {
            // TODO: 在此处添加用户代码
//            LED_Ctrl(LED1,RVS);
        }
/*  还可以继续添加其他管脚的中断服务程序  */
    }
}

完整工程 程序库,后续我会放到个人gitee仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git进阶之旅:Git Hub注册创建仓库

介绍&#xff1a; GitHub 是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持 git 作为唯一的版本库格式进行托管&#xff0c;故名 GitHub 仓库注册&#xff1a; GitHub官网&#xff1a;https://github.com/ 修改本地仓库用户名&#xff1a; git config --local…

【B站保姆级视频教程:Jetson配置YOLOv11环境(五)Miniconda安装与配置】

Jetson配置YOLOv11环境&#xff08;5&#xff09;Miniconda安装与配置 文章目录 0. Anaconda vs Miniconda in Jetson1. 下载Miniconda32. 安装Miniconda33. 换源3.1 conda 换源3.2 pip 换源 4. 创建环境5. 设置默认启动环境 0. Anaconda vs Miniconda in Jetson Jetson 设备资…

Cesium ArcGisMapServerImageryProvider API 介绍

作为一名GIS研究生&#xff0c;WebGIS 技术无疑是我们必学的核心之一。说到WebGIS&#xff0c;要提的就是 Cesium —— 这个让3D地球可视化变得简单又强大的工具。为了帮助大家更好地理解和使用 Cesium&#xff0c;我决定把我自己在学习 Cesium 文档过程中的一些心得和收获分享…

STM32-时钟树

STM32-时钟树 时钟 时钟

【Unity3D】实现横版2D游戏——单向平台(简易版)

目录 问题 项目Demo直接使用免费资源&#xff1a;Hero Knight - Pixel Art &#xff08;Asset Store搜索&#xff09; 打开Demo场景&#xff0c;进行如下修改&#xff0c;注意Tag是自定义标签SingleDirCollider using System.Collections; using System.Collections.Generic;…

基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 .…

学习笔记 ---- 平衡树 总结

文章目录 平衡树的含义二叉搜索树 t r e a p treap treap S p l a y Splay Splay&#xff08;延伸树&#xff09;优化思想 S p l a y Splay Splay 的定义核心操作文艺平衡树&#xff08;序列操作&#xff09;练习题平衡树维护序列平衡树维护数集 F H Q t r e a p FHQ \ treap F…

Windows基础

一. Windows防火墙与Defender 介绍&#xff1a;Windows防火墙与Defender是Windows操作系统中两大重要的安全组件&#xff0c;它们共同工作以保护计算机免受各种网络威胁和病毒攻击。 Windows防火墙&#xff1a;Windows防火墙是一种软件防火墙&#xff0c;旨在监控和控制进出计…

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令&#xff0c;我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后&#xff0c;启动我们的linux&#xff0c;输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…

人工智能|基本概念|人工智能相关重要概念---AI定义以及模型相关知识

一、 前言&#xff1a; 最近deepseek&#xff08;深度求索&#xff09;公司的开源自然语言处理模型非常火爆。 本人很早就对人工智能比较感兴趣&#xff0c;但由于种种原因没有过多的深入此领域&#xff0c;仅仅是做了一点初步的了解&#xff0c;借着这个deepseek&#xff0…

【疑海破局】一个注解引发的线上事故

【疑海破局】一个注解引发的线上事故 1、问题背景 在不久前一个阳光明媚的上午,我的思绪正在代码中游走、双手正在键盘上飞舞。突然,公司内部通讯工具上,我被拉进了一个临时工作群,只见群中产品、运营、运维、测试等关键人员全部严阵以待,我就知道大的可能要来了。果不其…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.1 NumPy高级索引:布尔型与花式索引的底层原理

2.1 NumPy高级索引&#xff1a;布尔型与花式索引的底层原理 目录 #mermaid-svg-NpcC75NxxU2mkB3V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NpcC75NxxU2mkB3V .error-icon{fill:#552222;}#mermaid-svg-NpcC75…

如何在 ACP 中建模复合罐

概括 本篇博文介绍了 ANSYS Composite PrepPost (ACP) 缠绕向导。此工具允许仅使用几个条目自动定义高压罐中常见的悬垂复合结构。 ACP 绕线向导 将必要的信息输入到绕组向导中。重要的是要注意“参考半径”&#xff0c;它代表圆柱截面的半径&#xff0c;以及“轴向”&#x…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

【算法-位运算】求数字的补数

文章目录 1. 题目2. 思路3. 代码4. 小结 1. 题目 476. 数字的补数 对整数的二进制表示取反&#xff08;0 变 1 &#xff0c;1 变 0&#xff09;后&#xff0c;再转换为十进制表示&#xff0c;可以得到这个整数的补数。 例如&#xff0c;整数 5 的二进制表示是 “101” &…

DeepSeek能下围棋吗?(续)

休息了一下&#xff0c;接着琢磨围棋&#xff0c;其实前面一篇里的规则有个漏洞的&#xff0c;就是邻居关系定义有问题&#xff0c;先回顾一下游戏规则&#xff1a; 游戏规则 定义&#xff1a; 1.数字对&#xff0c;是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

origin如何在已经画好的图上修改数据且不改变原图像的画风和格式

例如我现在的.opju文件长这样 现在我换了数据集&#xff0c;我想修改这两个图表里对应的算法里的数据&#xff0c;但是我还想保留这图像现在的形式&#xff0c;可以尝试像下面这样做&#xff1a; 右击第一个图&#xff0c;出现下面&#xff0c;选择Book[sheet1] 选择工作簿 出…

Workbench 中的热源仿真

探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下&#xff0c;热源 &#xff08;q&#xff09; 不是通…

Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能

开篇 Midjourney中有3个图片“微调”&#xff0c;它们分别为&#xff1a; 强变化&#xff1b;弱变化&#xff1b;局部重绘&#xff1b; 在Discord里分别都是用命令唤出的&#xff0c;但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中&#xff0c;我们发觉这样的逆天…