国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能)

這篇具有很好參考價值的文章主要介紹了ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.實驗?zāi)康模簩崿F(xiàn)KEY1/LEY2/KE3三個按鍵,中斷觸發(fā)打印一句話,并且燈的狀態(tài)取反;

key1 ----> LED3燈狀態(tài)取反;

key2 ----> LED2燈狀態(tài)取反;

key3 ----> LED1燈狀態(tài)取反;

2.分析框圖:

ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能),ARM,arm開發(fā),stm32,c語言

?3.代碼:

---key.h頭文件---
#ifndef __KEY_H__
#define __KEY_H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"

typedef enum
{
	FALLING_TRI,  //下降沿觸發(fā)方式
	RISING_TRI,  //上升沿觸發(fā)方式
}trigger_t;

//中斷RCC章節(jié)初始化 PF9 7 8
void hal_interrupt_rcc_init();

//EXTI初始化函數(shù)
//EXTI編號 GPIO組號 觸發(fā)方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix);

//GIC初始化函數(shù)
//中斷號,中斷優(yōu)先級
void hal_gic_init(unsigned int interruptx,unsigned int priority);

//led初始化函數(shù)
void led_init(gpio_t* gpiox,unsigned int pin);


#endif
---key.c函數(shù)實現(xiàn)---
#include "key.h"

//中斷RCC章節(jié)初始化 PF9 7 8
void hal_interrupt_rcc_init()
{
	//RCC章節(jié)初始化 PF9 [5]=1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	
}

//EXTI初始化函數(shù)
//EXTI編號 GPIO組號 觸發(fā)方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix)
{
	//GPIO章節(jié)初始化 設(shè)置三個按鍵為輸入模式
	GPIOF->MODER &= (~(0x3 << 2*extix));

	//EXTI章節(jié)初始化,引腳信號與EXTI連接
	//1.EXIT_EXTICR組 0x05
	EXTI->EXTICR[extix/4] &= (~(0xff << ((extix%4)*8)));
	EXTI->EXTICR[extix/4] |= (groupx << ((extix%4)*8));

	//2.EXTI_FTSR1 設(shè)置下降沿觸發(fā)方式
	if(trix == FALLING_TRI)
		EXTI->FTSR1 |= (0x1 << extix);
	else
		EXTI->RTSR1 |= (0x1 << extix);
		
	//3.EXTI_IMR1 設(shè)置中斷不屏蔽 =1
	EXTI->C1IMR1 |= (0x1 << extix);

}

//GIC初始化函數(shù)
//中斷號,中斷優(yōu)先級
void hal_gic_init(unsigned int interruptx,unsigned int priority)
{
	//GICD初始化
	//1.GICD_CTRL 使能組0 [0]=1
	GICD->CTRL |= (0x1 << 0);

	//2.GICD_ISENABLER組 設(shè)置GICD層中斷使能
	GICD->ISENABLER[interruptx/32] |= (0x1 << (interruptx % 32));

	//3.GICD_IPRIORITYR組 設(shè)置中斷優(yōu)先級  操作高5位
	GICD->IPRIORITYR[interruptx/4] &= (~(0x1f << (interruptx % 4 * 8 + 3)));
	GICD->IPRIORITYR[interruptx/4] |= (priority << (interruptx % 4  * 8 + 3));

	//4.GICD_ITARGETSR組 設(shè)置中斷目標(biāo)分配給CPU0
	GICD->ITARGETSR[interruptx/4] &= (~(0x3 << (interruptx % 4 * 8)));
	GICD->ITARGETSR[interruptx/4] |= (0x1 << (interruptx % 4 * 8));

	//GICC初始化
	//1.GICC_CTRL 設(shè)置GICC層組0使能 [0]=1
	GICC->CTRL |= (0x1 << 0);

	//2.GICC_PMR 設(shè)置GICC層中斷優(yōu)先級 
	GICC->PMR |= ((priority+1) << 3);
}

//led燈初始化
//參數(shù)1:GPIO組號
//參數(shù)2:引腳編號
void led_init(gpio_t* gpiox,unsigned int pin)
{
	//1輸出模式 
	gpiox->MODER &= ~(0x3 << (pin*2));
	gpiox->MODER |= (0x1 << (pin*2));

	//2輸出類型
	gpiox->OTYPER &= (~(0x1 << pin));

	//3輸出速率
	gpiox->OSPEEDR &= ~(0x3 << (pin*2));
	
	//4拉電阻
	gpiox->PUPDR &= ~(0x3 << (pin*2));
}

---do_irq.c終端處理函數(shù)---
#include "key.h"

extern void printf(const char *fmt, ...);

//中斷處理函數(shù)
void do_irq(void) 
{
	//1獲取中斷號 IAR[9:0]
	unsigned int num = 0;
	num = GICC->IAR & 0x3ff;
	
	//2判斷中斷號,并且打印一句話
	switch(num)
	{
	case 99:
		printf("KEY1按鍵中斷,LED3燈取反\n");
		
		//led3燈狀態(tài)取反
		GPIOE->ODR ^= (0x1 << 8);

		//3清除EXTI層中斷掛起標(biāo)志位 [9]=1
		//EXTI_FDR1 [9]=1
		EXTI->FPR1 |= (0x1 << 9);

		//4清除GICD層中斷掛起標(biāo)志位
		//GICD_ICPENDR3 [3]=1
		GICD->ICPENDR[3] |= (0x1 << 3);

		break;

	case 97:
		printf("KEY2按鍵中斷,LED2燈取反\n");

		//led2燈狀態(tài)取反
		GPIOF->ODR ^= (0x1 << 10);

		//清除EXTI層中斷掛起標(biāo)志位 [9]=1
		EXTI->FPR1 |= (0x1 << 7);
		GICD->ICPENDR[3] |= (0x1 << 1);
		
		break;

	case 98:
		printf("KEY3按鍵中斷,LED1燈取反\n");	
	
		//led1燈狀態(tài)取反
		GPIOE->ODR ^= (0x1 << 10);
	
		EXTI->FPR1 |= (0x1 << 8);
		GICD->ICPENDR[3] |= (0x1 << 2);
	
		break;
	}
	
	//5清楚獲取到的中斷號
	GICC->EOIR = num;

}
---main.c測試文件---
#include "key.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

#define GPIO_PIN10 10  //引腳編號
#define GPIO_PIN8 8
#define EXTI9 9   //EXTI編號
#define EXTI7 7
#define EXTI8 8
#define GPIOF_GROUP 0x05   //GPIOF組號
#define KEY1_ID 99   //中斷號
#define KEY2_ID 97
#define KEY3_ID 98
#define KEY1_PRIORITY 9   //中斷優(yōu)先級
#define KEY2_PRIORITY 7
#define KEY3_PRIORITY 8

int main()
{
	//使能三盞燈PE10 PF10 PE8
	RCC->MP_AHB4ENSETR |= (0x3 << 4);

	//led初始化函數(shù)
	led_init(GPIOE,GPIO_PIN10);
	led_init(GPIOF,GPIO_PIN10);
	led_init(GPIOE,GPIO_PIN8);

	//中斷RCC章節(jié)初始化 PF9 7 8
	hal_interrupt_rcc_init();

	//EXTI初始化函數(shù)
	hal_exti_init(EXTI9,GPIOF_GROUP,FALLING_TRI);
	hal_exti_init(EXTI7,GPIOF_GROUP,FALLING_TRI);
	hal_exti_init(EXTI8,GPIOF_GROUP,FALLING_TRI);

	//GIC初始化函數(shù)
	hal_gic_init(KEY1_ID,KEY1_PRIORITY);
	hal_gic_init(KEY2_ID,KEY2_PRIORITY);
	hal_gic_init(KEY3_ID,KEY3_PRIORITY);

	while(1)
	{

	}

	return 0;

}

4.實驗現(xiàn)象:?

ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能),ARM,arm開發(fā),stm32,c語言

ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能),ARM,arm開發(fā),stm32,c語言文章來源地址http://www.zghlxwxcb.cn/news/detail-674628.html

到了這里,關(guān)于ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(異步通知)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(異步通知)

    Linux 系統(tǒng)中也有很多信號,在 Linux 內(nèi)核源文件 includeuapiasm-genericsignal.h 中,有很多信號的宏定義: 就 APP 而言,你想處理 SIGIO 信息,那么需要提供信號處理函數(shù),并且要跟 SIGIO 掛鉤。這可以通過一個 signal 函數(shù) 來“給某個信號注冊處理函數(shù)”,用法如下: 重點從②開始:

    2024年02月15日
    瀏覽(20)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(工作隊列)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(工作隊列)

    定時器、下半部 tasklet,它們都是在中斷上下文中執(zhí)行,它們無法休眠。當(dāng)要處理更復(fù)雜的事情時,往往更耗時。這些更耗時的工作放在定時器或是下半部中,會使得系統(tǒng)很卡;并且循環(huán)等待某件事情完成也太浪費CPU 資源了。如果使用線程來處理這些耗時的工作,那就可以解

    2024年02月15日
    瀏覽(25)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(tasklet)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(tasklet)

    閱讀Linux 系統(tǒng)中異常與中斷可知,Linux 系統(tǒng)對中斷處理的演進過程中,實現(xiàn)了中斷的擴展:硬件中斷、軟件中斷 硬件中斷有:GPIO,網(wǎng)絡(luò)中斷(net),系統(tǒng)滴答中斷(tick)等 軟件中斷有:定時器,tasklet等 內(nèi)核中的軟中斷: 該數(shù)組里面有個action成員,該成員是個函數(shù),函數(shù)會調(diào)

    2024年02月14日
    瀏覽(80)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(POLL 機制)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(POLL 機制)

    使用休眠-喚醒的方式等待某個事件發(fā)生時,有一個缺點:等待的時間可能很久。我們可以加上一個超時時間,這時就可以使用 poll 機制。 ① APP 不知道驅(qū)動程序中是否有數(shù)據(jù),可以先調(diào)用 poll 函數(shù)查詢一下,poll 函數(shù)可以傳入超時時間; ② APP 進入內(nèi)核態(tài), 調(diào)用到驅(qū)動程序的

    2024年02月15日
    瀏覽(19)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(定時器)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(定時器)

    定時器涉及函數(shù)參考內(nèi)核源碼:includelinuxtimer.h 給定時器的各個參數(shù)賦值: 設(shè)置定時器 :主要是初始化 timer_list 結(jié)構(gòu)體,設(shè)置其中的函數(shù)、參數(shù)。 a) 向內(nèi)核添加定時器。timer-expires 表示超時時間。 b) 當(dāng)超時時間到達,內(nèi)核就會調(diào)用這個函數(shù):timer-function(timer-data)。 修改定時

    2024年02月15日
    瀏覽(23)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(線程化處理)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(線程化處理)

    工作隊列是在內(nèi)核的線程的上下文中執(zhí)行的 工作隊列中有多個 work,前一個 work 沒處理完會影響后面的 work。解決方法有如下2種: 比如自己創(chuàng)建一個內(nèi)核線程,不跟別的 work 在一塊。例如存儲設(shè)備比如 SD/TF采用的就是單獨一個線程。 使用線程化的中斷處理。中斷的處理仍然

    2024年02月16日
    瀏覽(23)
  • STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(休眠與喚醒)

    STM32MP157驅(qū)動開發(fā)——按鍵驅(qū)動(休眠與喚醒)

    當(dāng)應(yīng)用程序必須等待某個事件發(fā)生,比如必須等待按鍵被按下時,可以使用“休眠-喚醒”機制: ① APP 調(diào)用 read 等函數(shù)試圖讀取數(shù)據(jù),比如讀取按鍵; ② APP 進入內(nèi)核態(tài),也就是調(diào)用驅(qū)動中的對應(yīng)函數(shù),發(fā)現(xiàn)有數(shù)據(jù)則復(fù)制到用戶空間并馬上返回; ③ 如果 APP 在內(nèi)核態(tài),也就

    2024年02月16日
    瀏覽(52)
  • SQLite3移植STM32MP157 ARM開發(fā)板

    SQLite3移植STM32MP157 ARM開發(fā)板

    移植首先就得有源碼,從SQLite官網(wǎng)下載最新版源碼 下載地址 這里使用的環(huán)境為Ubuntu16 所以直接在Ubuntu下下載的。 下載完成后解壓文件 進入解壓后的目錄 進入后可以看到解壓出的源碼文件如下 配置生成Makefile 在源碼個目錄下執(zhí)行如下命令 –host為指定交叉編譯器為arm-linux-

    2024年02月07日
    瀏覽(17)
  • 驅(qū)動開發(fā),stm32mp157a開發(fā)板的led燈控制實驗

    驅(qū)動開發(fā),stm32mp157a開發(fā)板的led燈控制實驗

    ????????編寫LED燈的驅(qū)動,在應(yīng)用程序中編寫控制LED燈亮滅的代碼邏輯實現(xiàn)LED燈功能的控制; LED1-PE10 LED1亮滅: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (輸出) 0X50006000 GPIOE_ODR[10]-1(輸出高電平) 0(輸出低電平)0X50006014 LED2-PF10 LED2亮滅: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    瀏覽(24)
  • 【STM32】外部中斷實現(xiàn)按鍵實驗

    【STM32】外部中斷實現(xiàn)按鍵實驗

    ??作者:一只大喵咪1201 ??專欄:《STM32學(xué)習(xí)》 ??格言: 你只管努力,剩下的交給時間! 在前面的文章控制LED和蜂鳴器的按鍵實驗中詳細(xì)的講解了怎樣通過GPIO的輸入模式來控制LED燈和蜂鳴器的狀態(tài)。這篇文章同樣是實現(xiàn)上訴的功能,但是方式是采用外部中斷的方式實現(xiàn)的

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包