初探沁恒CH32V307VCT6评估板 1-1外部中断EXTI

旋转编码器计次

1,创建 .C .H 文件

Count_Sonser.c

Count_Sonser.h

2,包含头文件

#include "ch32v30x.h"
//#include "debug.h"

#include "Count_Sonser.h"

注意:如果不包含第一第二个头文件uint、int这些定义就会报错。

3,配置CountSonser_Init()相关

/*********************************************************************
1,开启GPIO时钟、AFIO时钟
2,初始化GPIO
3,AFIO复用GPIO到EXTI  

                              -->GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
4,初始化EXTI
5,给NVIC分组,一个工程只能分一次组。

                              -->NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
6,初始化NVIC
7,声明中断通道是一个中断          -->void EXTI0_IRQHandler(void)__attribute__((interrupt("WCH-Interrupt-fast")));
*/

#include "ch32v30x.h"
#include "Count_Sonser.h"
#include "debug.h"/*********************************************************************
1,开启GPIO时钟、AFIO时钟
2,初始化GPIO
3,AFIO复用GPIO到EXTI   -->GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
4,初始化EXTI
5,给NVIC分组                              -->NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
6,初始化NVIC
7,声明中断通道是一个中断          -->void EXTI0_IRQHandler(void)__attribute__((interrupt("WCH-Interrupt-fast")));
*/int16_t Get_Sonser ;
void CountSonser_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启AFIO、GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;           //上拉输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);   //AFIO复用EXTI-->EXTI_Lin0;GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);   //AFIO复用EXTI-->EXTI_Lin1;EXTI_InitTypeDef EXTI_InitStruct = {0};EXTI_InitStruct.EXTI_Line = EXTI_Line0 | EXTI_Line1;         //通道0和通道1EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;             //触发模式配置为中断模式EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;        //下降沿触发EXTI_Init(&EXTI_InitStruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);             //中断分组2,先占优先级和响应优先级都配置为2NVIC_InitTypeDef NVIC_InitStruct = {0};NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;               //EXTI中断0NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;   //先占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应优先级1NVIC_Init(&NVIC_InitStruct);NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;               //EXTI中断1NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;   //先占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //响应优先级2NVIC_Init(&NVIC_InitStruct);
}
//返回Get_Sonser的值
int16_t GetSonSer(void)
{int16_t temp ;temp = Get_Sonser;Get_Sonser = 0;return temp;
}
/** 声明这是一个中断,("WCH-Interrupt-fast")说明是个高速中断* 这句不能少* */
void EXTI0_IRQHandler(void)__attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) == SET)      //判断中断挂起标志位{if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == Bit_RESET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == Bit_RESET){Get_Sonser--;}}}EXTI_ClearITPendingBit(EXTI_Line0);       //清除中断挂起标志位
}void EXTI1_IRQHandler(void)__attribute__((interrupt("WCH-Interrupt-fast")));//声明这是一个中断,("WCH-Interrupt-fast")说明是个高速中断
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) == SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == Bit_RESET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == Bit_RESET){Get_Sonser++;}}}EXTI_ClearITPendingBit(EXTI_Line1);
}

4,实验现象 

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

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

相关文章

如何掌握 Java 正则表达式 的基本语法及在 Java 中的应用

正则表达式是一种用于匹配字符串的模式,在许多编程语言中广泛使用。Java 正则表达式提供了强大的文本处理能力,能够对字符串进行查找、替换、分割等操作。 一、正则表达式的基本语法 正则表达式由普通字符和特殊字符组成。普通字符包括字母、数字和标点…

通过 echo 命令向 /sys/class/gpio/export 写入一个GPIO编号,但遇到 “Device or resource busy

通过 echo 命令向 /sys/class/gpio/export 写入一个GPIO编号,但遇到 "Device or resource busy" 错误时,这通常意味着该GPIO引脚已经被其他驱动或用户空间程序导出并使用了。 要解决这个问题,可以尝试以下步骤: 检查GP…

SpEL表达式使用方法

1 SpEL简介 SpEL(Spring Expression Language)是一种用于在Spring框架中进行数据绑定和执行业务逻辑的表达式语言。Spring EL提供了一种简洁、灵活和强大的方式来访问对象的属性、调用方法、执行运算和逻辑判断等操作。 官方文档:https://d…

C# 多线程:并发编程的利器

在现今日益复杂的软件开发环境中,多线程编程已经成为提升应用程序性能和响应速度的关键技术。C# 作为一种现代、功能强大的编程语言,提供了丰富的多线程支持,使开发者能够充分利用多核处理器和并行计算的优势。本文将深入探讨C#中的多线程编程…

网络协议三

数据中心 一、DNS 现在网站的数目非常多,常用的网站就有二三十个,如果全部用 IP 地址进行访问,恐怕很难记住 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址 …

汇凯金业:贵金属交易规则有哪些

贵金属投资目前非常火热,许多投资者从中获得了可观的收益。新手投资者在进入贵金属市场及其交易之前,务必要了解清楚贵金属的交易规则。了解规则和差异能帮助新手更好地进行贵金属投资交易。下面我们以现货类贵金属为例,详细说明贵金属的交易…

一周学会Django5 Python Web开发 - Django5内置Auth认证系统-用户修改密码实现

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计59条视频,包括:2024版 Django5 Python we…

关于在 Ubuntu 下安装配置和调优 FTP 服务器

今天我在阿贝云的免费服务器上部署测试FTP服务器,这个阿贝云真是个不错的免费云服务器啊,配置虽然不高,但完全足够搭建一个FTP服务器使用了。1核CPU、1G内存、10G硬盘、5M带宽,对我这个喜欢折腾的家伙来说可太好用了。 首先,让我简单介绍下今天要用到的FTP服务器软…

Mybatis杂记

group by查询返回map类型 1,2 List<Map<String, Object>> getCount();xml: <select id"getCount" resultType"java.util.HashMap">SELECT company_id, ifnull(sum(count_a count_b),0) ctFROM test.com_countWHERE is_del 0 GROUP BY…

天气数据集2-应用RNN做天气预测

二、用循环神经网络做天气(温度)预测 本项目是基于Pytorch的 RNN&GRU模型&#xff0c;用于预测未来温度 数据集: https://mp.weixin.qq.com/s/08BmF4RnnwQ-jX5s_ukDUA 项目代码: https://github.com/disanda/b_code/tree/master/Weather_Prediction RNN 模型本质是用于预…

MySQL(四)查询

1、MySQL限性约束 —非空、唯一(自增)、主外键、检查(MySQL存在但是不能用)。 约束主要完成对数据的校验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 1)常用五类约束 not null :非空约束,指定某列不为空。 unique:唯一约束,指定某列和几列组…

基于springboot的-仓库 管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍&#xff1a; 管理员…

【VUE】el-table表格 实现滚动到底部加载更多数据

废话不多说&#xff0c;直接上代码 <template></template>部分代码 <!-- 表格 --> <el-tableid"mytable"v-loading"listLoading"highlight-current-rowrow-key"project_id":data"tableData"border:reload"…

java中的三种拷贝方法

在Java编程中&#xff0c;理解深拷贝&#xff08;Deep Copy&#xff09;、浅拷贝&#xff08;Shallow Copy&#xff09;和引用拷贝&#xff08;Reference Copy&#xff09;是非常重要的。这三种拷贝方式涉及对象复制和内存管理。以下是对它们的详细解释&#xff1a; 1. 引用拷…

数字IC后端物理验证PV | TSMC 12nm Calibre Base Layer DRC案例解析

基于TSMC 12nm ARM A55 upf flow后端设计实现训练营将于6月中旬正式开班&#xff01;小班教学&#xff01;目前还有3个名额&#xff0c;招满为止&#xff01;有需要可以私信小编 ic-backend2018报名。吾爱IC社区所有训练营课程均为直播课&#xff01; 这个课程支持升级成双核A…

服务器禁止密码登陆

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/139444224 文章目录 一、前言二、编辑sshd_config文件三、重启服务四、总结 一、前言 复杂的密码&#xff0c;登陆服务器的时候&#xff0c;也是很不方便的。并且频繁登陆&#xff0c;暴露给外界&am…

事件总线vueEvent

一个组件结束后要更新另一个组件数据&#xff0c;但是另一个组件和这个组件没有上下级关系 在 Vue 中&#xff0c;非父子组件之间进行通信通常需要使用事件总线或者其他的全局事件管理器。在你的代码片段中&#xff0c;vueEvent 似乎是一个事件总线对象&#xff0c;通过 emit 方…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

如何实现JavaScript中的寄生组合式继承?

在JavaScript中&#xff0c;寄生组合式继承是一种继承机制&#xff0c;它结合了寄生式继承和组合继承的特点。其核心思想是通过构造函数来继承属性&#xff0c;同时通过原型链来继承方法。以下是实现寄生组合式继承的基本步骤&#xff1a; 首先定义一个辅助函数 inheritProtot…

Pygame:新手指南与入门教程

在游戏开发领域,pygame 是一个广受欢迎的 Python 库,它提供了开发二维游戏的丰富工具和方法。这个库让开发者可以较少地关注底层图形处理细节,更多地专注于游戏逻辑和玩法的实现。本文将详细介绍 pygame,包括其安装过程、基本概念、主要功能和一个简单游戏的开发流程。 一…