組み込みSTM32— 3日目に、キー割り込みキーがLEDライトの制御を実現します

1.ソフトウェアおよびエンジニアリング環境の構築

  • 紹介しません。既製の
    リンクを直接使用できます:https
    ://pan.baidu.com/s/1GaSYpNm6yh-lZZmqRdXxvQ抽出コード:dy63
  • 関連ライブラリファイル
    リンク:https
    ://pan.baidu.com/s/19PLYdtiuSoZZGdVD7_tumQ抽出コード:mrw8

2.キーを押して、LEDライトの制御を中断します

  • 割り込み処理プロセスについて学ぶ

割り込み処理プロセス:例外(割り込み)割り込みソース->割り込みの許可->割り込みの適用-> CPU応答->シーンの保護(スタック)->ジャンプ処理->リターン。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

  • 意義
    割り込みの割り込みは、プログラムイベントで非常に重要な位置を占めています。中断がない場合、CPUの効率は大幅に低下します。UARTモジュールと同様に、コンピューターから送信されたデータを受信するときは、while(){}メソッドを使用してステータスを照会します。コンピュータがデータを送信しない場合、プログラムはブロックを続け、CPUが他のことを実行できなくなります。メカニズムがある場合、CPUがデータが来るかどうかを周期的に照会する代わりに、ハードウェアは自動的にデータを受信し、データが受信されると自動的にCPUに通知し、CPUはデータを読み取ります。このように、データを受信する前に、CPUは他のことを行うことができ、作業効率は自然に向上します。CPUハードウェアでは、この機能は割り込みメカニズムによって実現されます。各オンチップ周辺ハードウェアは割り込み信号を提供します。モジュールが特定の動作状態を処理すると、CPUと通信するために割り込み信号が発生します。

  • 中断されたライブラリ関数をいくつか追加します
    ここに画像の説明を挿入します

  • 開発ボードの回路図を見てください。
    外部割り込みトリガー(割り込み)イベントの方法:1。立ち上がりエッジトリガー2.
    ここに画像の説明を挿入します
    立ち下がりエッジトリガー3.エッジトリガー前日に対応する対応するキーはKEY1-> PA0です。 、KEY2-> PD2、KEY3-> PC12、KEY1をクリックしてハイレベルにします。KEY2とKEY3はそれぞれローレベルです。
    立ち上がりエッジでの高レベルトリガー、立ち下がりエッジでの低レベルトリガー

  • 外部割り込みラインEXTISTM32F4xx
    ここに画像の説明を挿入します
    中国語リファレンスマニュアル.pdfを選択して、key1のPA0がEXTI0に対応し、key2のPD2がEXTI2に対応し、key3のPC12がEXTI12に対応するようにします。

  • システム構成コントローラー(SYSCFG)
    システム構成コントローラーは、主に、実行可能コードストレージ領域のアドレス再マッピングの管理、イーサネットPHYインターフェイスの選択
    、およびGPIOの外部割り込みライン接続の管理に使用されます
    特に指定のない限り、このセクションはSTM32F4xxシリーズ全体に適用されます。

  • 最初にLEDを初期化するので、これ以上は書きません。初日にLEDがある場合は、そうでない場合はチェックアウトしてから、Exit_Initが初期化されます。

/*******************************************************
*函数名:Exit_Init
*功  能:中断初始化
*参  数:无
*返  回:无
*备  注:注意开启PA0,PD2的PC12的映射SYSCFG时钟 ,使能外部中断
********************************************************/
void Exit_Init(void)
{
    
    		
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//开启SYSCFG时钟,简称重映射 
		EXTI_InitTypeDef  Exit_Key1,Exit_Key2,Exit_Key3;//定义外部中断结构体变量	
//		//key1
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //映射到PA0引脚到EXTI
		Exit_Key1.EXTI_Line = EXTI_Line0; //选择EXTI0
		Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key1.EXTI_Trigger = EXTI_Trigger_Rising;//选择上升沿触
		Exit_Key1.EXTI_LineCmd = ENABLE;//启用EXTI0
		EXTI_Init(&Exit_Key1);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI0_IRQn);//使能外部中断0线进行工作
		//key2
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2); //映射到PD2引脚到EXTI2	
		Exit_Key2.EXTI_Line = EXTI_Line2; //选择EXTI2
		Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key2.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
		Exit_Key2.EXTI_LineCmd = ENABLE;启用EXTI2
		EXTI_Init(&Exit_Key2);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI2_IRQn);//使能外部中断2线进行工作
		//key3
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource12); //映射到PC12引脚到EXTI3	
		Exit_Key3.EXTI_Line = EXTI_Line12; //选择EXTI12
		Exit_Key3.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key3.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
		Exit_Key3.EXTI_LineCmd = ENABLE;//启用EXTI3
		EXTI_Init(&Exit_Key3);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI15_10_IRQn);//由于没有EXTI12,所以使能外部中断15_10线进行工作		
}
  • (メインのものが来ています、彼は来ています)キーを押して中断し、クリックしてLEDライトを制御してオンとオフを切り替えます
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键一中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI1_flag;

void EXTI0_IRQHandler(void)//由中断自动触发
{
    
    
		 
		EXTI_ClearFlag(EXTI_Line0); //挂起寄存器PA0
		EXTI1_flag++;
		if(EXTI1_flag%2)
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		else 
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键二中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI2_flag;
void EXTI2_IRQHandler(void)//由中断自动触发
{
    
    
		EXTI_ClearFlag(EXTI_Line2); //挂起寄存器PD2
		EXTI2_flag++;
		if(EXTI2_flag%2)
		GPIO_ResetBits(GPIOC,GPIO_Pin_10);
		else 
		GPIO_SetBits(GPIOC,GPIO_Pin_10);
		
}

/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键三中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI3_flag;

void EXTI15_10_IRQHandler(void)
{
    
    
			EXTI3_flag++;
			if(EXTI3_flag%2)
			GPIO_ResetBits(GPIOC,GPIO_Pin_11);
			else 
			GPIO_SetBits(GPIOC,GPIO_Pin_11);
			EXTI_ClearFlag(EXTI_Line12);  //挂起寄存器PC2
}
  • 主な関数は関連する関数を呼び出します
LEDInit();//LED初始化
Exit_Init();//中断初始化
while(1)
	{
    
    
			//是不是很激动,这里什么都不用写,哈哈
	}

この時点で、キーの中断は完全に実現されています。クリックしてLEDライトを制御し、オンとオフを切り替えます。最後に、読んでいただきありがとうございます。その他の関連情報が必要な場合は、私に連絡してください。

おすすめ

転載: blog.csdn.net/weixin_45247466/article/details/114414069