繼做了基于UCOSII的IWDG獨立看門狗實驗后,繼續(xù)進行第25個實驗-基于UCOSII的EXTI外部按鍵中斷實驗,此實驗在基于UCOSII的IWDG實驗基礎(chǔ)上添加EXTI而來,三個按鍵,分別按下串口輸出按鍵信息!在多任務(wù)下添加了IWDG獨立看門狗。
//EXTI按鍵任務(wù)----------------------------------------
static void Task_EXTI(void* p_arg)
{
(void) p_arg;
while(1)
{ //看門狗更新設(shè)置喂狗操作
IWDGSET();
TESTKEY();
OSTimeDlyHMSM(0, 0, 0, 10);
}
}
unsigned char KEY=4;//外部中斷標志
unsigned char EXTIFLAG=0;//外部中斷標志
EXTI_InitTypeDef EXTI_InitStructure;
//EXTI口設(shè)置初始化
void EXTI_Config(void)
{
//聲明GPIO類型,EXTI類型
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//啟動GPIOB,GPIOD的時鐘,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE , ENABLE);
//初始化按鍵端口引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_3; //COL1,2,3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉(zhuǎn)速度為50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //COL4
GPIO_Init(GPIOE, &GPIO_InitStructure);
//設(shè)置按鍵初始值為高電平
GPIO_SetBits(GPIOC, GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_3);
GPIO_SetBits(GPIOE, GPIO_Pin_6);
//初始化中斷線
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);
//初始化外部中斷EXTI
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2; //PE2 作為鍵盤的行線。檢測狀態(tài)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_SetBits(GPIOE, GPIO_Pin_2); //起始值為高電平
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_KEY(void)
{
if(EXTIFLAG==1)
{
//判斷是否是PC5按下
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
GPIO_SetBits(GPIOE, GPIO_Pin_6);
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
KEY=0;
goto out_exit;
}
}
//判斷是否是PC2按下
GPIO_SetBits(GPIOC, GPIO_Pin_5);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
GPIO_SetBits(GPIOE, GPIO_Pin_6);
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
KEY=1;
goto out_exit;
}
}
//判斷是否是PC3按下
GPIO_SetBits(GPIOC, GPIO_Pin_5);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
GPIO_SetBits(GPIOE, GPIO_Pin_6);
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
KEY=2;
goto out_exit;
}
}
//判斷是否是PE6按下
GPIO_SetBits(GPIOC, GPIO_Pin_5);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
GPIO_ResetBits(GPIOE, GPIO_Pin_6);
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
Delay(0XBF);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
KEY=3;
goto out_exit;
}
}
out_exit:;
EXTIFLAG=0;
}
}
void TESTKEY(void)
{
EXTI_KEY();
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
GPIO_ResetBits(GPIOE, GPIO_Pin_6);
switch(KEY)
{
case 0:
USART_OUT(USART1,"r***你按下了K1****n");
KEY=4;
break;
case 1:
USART_OUT(USART1,"r***你按下了K2****n");
KEY=4;
break;
case 2:
USART_OUT(USART1,"r***你按下了K3****n");
KEY=4;
break;
default:break;
}
}
////////////////鍵盤行線2中斷
void EXTI2_IRQHandler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); //保存全局中斷標志,關(guān)總中斷
//存放中斷嵌套的層數(shù)(0~255)
OSIntNesting++; //OSSemPost(NMEA_MBOX);
OS_EXIT_CRITICAL(); //恢復全局中斷標志
if(EXTI_GetITStatus(EXTI_Line2) != RESET) //判別是否有鍵按下
{
EXTI_ClearITPendingBit(EXTI_Line2);
EXTIFLAG=1; //標志
}
//脫離中斷函數(shù)
OSIntExit(); //在os_core.c文件里定義,如果有更高優(yōu)先級的任務(wù)就緒了,則執(zhí)行一次任務(wù)切換
}
在此試驗中修正了以前實驗多任務(wù)下任務(wù)調(diào)度問題,比如ADC試驗中優(yōu)先級問題,TOUCH試驗中優(yōu)先級問題,還有在每個任務(wù)WHILE(1)中添加延時OSTimeDlyHMSM(0, 0, 0, 10); 此函數(shù)可以任務(wù)調(diào)度,還有就是在中斷函數(shù)中,每個中斷寫成了
void XXXXX_IRQHandler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); //保存全局中斷標志,關(guān)總中斷
//存放中斷嵌套的層數(shù)(0~255)
OSIntNesting++; //OSSemPost(NMEA_MBOX);
OS_EXIT_CRITICAL(); //恢復全局中斷標志
XXXXXX中斷處理XXXXXXXXX
//脫離中斷函數(shù)
OSIntExit(); //在os_core.c文件里定義,如果有更高優(yōu)先級的任務(wù)就緒了,則執(zhí)行一次任務(wù)切換
}
結(jié)果演示.....
上一篇:STM32與通常ARM的區(qū)別
下一篇:stm32之nRF24L01無線模塊(1):SPI2到SPI1的移植
推薦閱讀
史海拾趣
設(shè)計資源 培訓 開發(fā)板 精華推薦
- 動力電池“三國殺”:中企提前鎖定勝局,日韓廠商集體失守
- 研究人員開發(fā)出人工智能雷達技術(shù) 可用于高分辨率3D城市制圖
- 上半年動力電池TOP15:寧德時代和比亞迪裝車近200GWh 兩家公司新上榜
- 半年砸下數(shù)千億元!“并購”浪潮下,汽車芯片大戰(zhàn)再起風云
- 奇瑞人形機器人9月開售并將面向個人用戶,機器人時代該來了嗎?
- 華為李文廣:華為智能駕駛規(guī)劃曝光,加速追趕特斯拉
- 功能迭代和功能安全的矛盾及車端應(yīng)用層-下
- 功能迭代和功能安全的矛盾及車端應(yīng)用層-中
- 功能迭代和功能安全的矛盾及車端應(yīng)用層-上
- 車云一體其他層面的架構(gòu)設(shè)計借鑒-下
- Mentor線上研討會 | 教你在設(shè)計工具中進行DFM分析,輕松兼顧效率、成本和質(zhì)量
- 用 TI 汽車電子方案充充電吧,看你止步不前還是勇往直前!
- Littelfuse 2022 最新電池方案在線展廳
- 邀您注冊 VICOR 電池化成與測試迷你站
- EEworld年度盤點 萬元驚喜等你拿
- Follow me第二季第1期來啦!與得捷一起解鎖【Adafruit Circuit Playground Express】超能力!
- 免費申請評測:1.3元起的國產(chǎn)USB和Touchkey單片機CH554評估板
- [有獎轉(zhuǎn)發(fā)]Vishay新能源、航天/軍工解決方案