初探沁恒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.pswp.cn/web/23614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23614.shtml
英文地址,請注明出處:http://en.pswp.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,包括其安裝過程、基本概念、主要功能和一個簡單游戲的開發流程。 一…