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

最后写测试函数,这里我在发这个文章的时候,也就是25年1月31日,去STC官网看了STC32G的手册 ,发现其中关于下降沿和上升沿模式的注意说明如下:
在这里插入图片描述
其中提到,这两个模式暂不要使用,但笔者测试可用,不知道时芯片本版本还是什么原因,我测试使用的就是STC32G12K128不带其他后缀字母的,暂时没有发现有什么问题

/************************************************************************************ 函 数 名: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仓库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Pygame制作“Flappy Bird”游戏

1. 前言 Flappy Bird 是一款“点击上浮、松手下落”的横向卷轴游戏&#xff1a; 场景中持续出现上下成对的管道&#xff0c;玩家需要让小鸟在管道之间穿行&#xff1b;每穿过一对管道记 1 分&#xff1b;若小鸟碰到管道或掉到地面&#xff0c;则游戏结束&#xff1b;一旦上手…

java求职学习day23

MySQL 单表 & 约束 & 事务 1. DQL操作单表 1.1 创建数据库,复制表 1) 创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8; 2) 将 db1 数据库中的 emp 表 复制到当前 db2 数据库 1.2 排序 通过 ORDER BY 子句 , 可以将查询出的结果进行排序 ( 排序只…

markdown公式特殊字符

个人学习笔记 根号 在 Markdown 中&#xff0c;要表示根号 3&#xff0c;可以使用 LaTeX 语法来实现。常见的有以下两种方式&#xff1a; 行内公式形式&#xff1a;使用一对美元符号 $ 将内容包裹起来&#xff0c;即 $\sqrt{3}$ &#xff0c;在支持 LaTeX 语法渲染的 Markdow…

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…

系统学习算法: 专题七 递归

递归算法简而言之就是当一个大问题拆分为多个子问题时&#xff0c;如果每个子问题的操作步骤都一样&#xff0c;就可以用递归&#xff0c;其中递归在递的时候要有结束条件&#xff0c;不能一直递下去&#xff0c;结束条件后就归 这里不建议学习递归的时候抠细节&#xff0c;还…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

OpenEuler学习笔记(十五):在OpenEuler上搭建Java运行环境

一、在OpenEuler上搭建Java运行环境 在OpenEuler上搭建Java运行环境可以通过以下几种常见方式&#xff0c;下面分别介绍基于包管理器安装OpenJDK和手动安装Oracle JDK的步骤。 使用包管理器安装OpenJDK OpenJDK是Java开发工具包的开源实现&#xff0c;在OpenEuler上可以方便…

【二叉搜索树】

二叉搜索树 一、认识二叉搜索树二、二叉搜索树实现2.1插入2.2查找2.3删除 总结 一、认识二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 若它的左子树不为空&#xff0c;则…

洛谷P3372 【模板】线段树 1以及分块

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

Linux运维之Linux的安装和配置

目录 Linux的基本概念&#xff1a; 1.为什么要使用Linux&#xff1f; 2.什么是Linux&#xff1f; Linux的安装和配置&#xff1a; 1.下载Linux的虚拟机和镜像文件&#xff1a; 1.1下载虚拟机 1.2下载镜像文件 2.在虚拟机或者物理机中安装Linux操作系统 3.配置虚拟机的…

【ArcMap零基础训练营】01 ArcMap使用入门及绘图基础

ArcMap入门及使用技巧 230106直播录像 ArcMap使用技巧及制图入门 ArcGIS的安装 本次教学使用的ArcMap版本为10.7&#xff0c;建议各位安装ArcGIS10.0及其以上版本的英文版本。 下载及安装详细教程可参考ArcGIS 10.8 for Desktop 完整安装教程 麻辣GIS 改善使用体验的几个操作…

程序员学英文之At the Airport Customs

Dialogue-1 Making Airline Reservation预定机票 My cousin works for Xiamen Airlines. 我表哥在厦航上班。I’d like to book an air ticket. 我想预定一张机票。Don’t judge a book by its cover. 不要以貌取人。I’d like to book / re-serve a table for 10. 我想预定一…

Python 写的几个经典游戏 新年放烟花、 贪吃蛇、俄罗斯方块、超级玛丽、五子棋、蜘蛛纸牌

0、新年放烟花 import pygame import random import math# 初始化Pygame pygame.init()# 设置窗口 WIDTH 800 HEIGHT 600 screen pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("新年放烟花")# 颜色定义 BLACK (0, 0, 0) WHITE (255, 2…

Python Typing: 实战应用指南

文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…

14-8C++STL的queue容器

一、queue容器 (1)queue容器的简介 queue为队列容器&#xff0c;“先进先出”的容器 (2)queue对象的构造 queue<T>q; queue<int>que Int;//存放一个int的queue容器 queue<string>queString;//存放一个string的queue容器 (3)queue容器的push()与pop()方…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…

C语言指针专题一 -- 指针基础原理

目录 1. 指针概念 地址和变量 指针 2. 指针的声明与初始化 3. 指针的使用 指针访问 指针的运算 指针与数组 指针与函数 4. 编程实例 5. 指针的常见陷阱与防御 6. 总结 1. 指针概念 地址和变量 在C语言中&#xff0c;地址和变量是两个基本但非常重要的概念。 1. 变…

【Python】已解决:ModuleNotFoundError: No module named ‘cv2’

个人简介&#xff1a;某不知名博主&#xff0c;致力于全栈领域的优质博客分享 | 用最优质的内容带来最舒适的阅读体验&#xff01;文末获取免费IT学习资料&#xff01; &#x1f345; 文末获取更多信息 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅收藏 &#x…

从0开始,来看看怎么去linux排查Java程序故障

一&#xff0c;前提准备 最基本前提&#xff1a;你需要有liunx环境&#xff0c;如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后&#xff0c;你还需要安装jdk和配置环境变量 1. 安装JDK&#xff08;以OpenJDK 17为例&#xff09; 下载JDK…