完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
可以挂自己吧。。。
你看我们的PS2鼠标例程,里面就是中断里面挂起中断自己。 //位计数器 u8 BIT_Count=0; //中断15~10处理函数 //每11个bit,为接收1个字节 //每接收完一个包(11位)后,设备至少会等待50ms再发送下一个包 //只做了鼠标部分,键盘部分暂时未加入 void EXTI15_10_IRQHandler(void) { static u8 tempdata=0; static u8 parity=0; if(EXTI->R&(1<<11))//中断11产生了相应的中断 { EXTI->R=1<<11; //清除LINE11上的中断标志位 if(BIT_Count==0) { parity=0; tempdata=0; } BIT_Count++; if(BIT_Count>1&&BIT_Count<10)//这里获得数据 { tempdata>>=1; if(PS2_SDA) { tempdata|=0x80; parity++;//记录1的个数 } }else if(BIT_Count==10)//得到校验位 { if(PS2_SDA)parity|=0x80;//校验位为1 } if(BIT_Count==11)//接收到1个字节的数据了 { BIT_Count=parity&0x7f;//取得1的个数 if(((BIT_Count%2==0)&&(parity&0x80))||((BIT_Count%2==1)&&(parity&0x80)==0))//奇偶校验OK { //PS2_Status|=1<<7;//标记得到数据 BIT_Count=PS2_Status&0x0f; PS2_DATA_BUF[BIT_Count]=tempdata;//保存数据 if(BIT_Count<15)PS2_Status++; //数据长度加1 BIT_Count=PS2_Status&0x30; //得到模式 switch(BIT_Count) { case CMDMODE://命令模式下,每收到一个字节都会产生接收完成 PS2_Dis_Data_Report();//禁止数据传输 PS2_Status|=1<<7; //标记得到数据 break; case KEYBOARD: break; case MOUSE: if(MOUSE_ID==0)//标准鼠标,3个字节 { if((PS2_Status&0x0f)==3) { PS2_Status|=1<<7;//标记得到数据 PS2_Dis_Data_Report();//禁止数据传输 } }else if(MOUSE_ID==3)//扩展鼠标,4个字节 { if((PS2_Status&0x0f)==4) { PS2_Status|=1<<7;//标记得到数据 PS2_Dis_Data_Report();//禁止数据传输 } } break; } }else { PS2_Status|=1<<6;//标记校验错误 PS2_Status&=0xf0;//清除接收数据计数器 } BIT_Count=0; } } } //禁止数据传输 //把时钟线拉低,禁止数据传输 void S2_Dis_Data_Report(void) { PS2_Set_Int(0); //关闭中断 PS2_SET_SCL_OUT();//设置SCL为输出 PS2_SCL_OUT=0; //抑制传输 } //使能数据传输 //释放时钟线 void S2_En_Data_Report(void) { PS2_SET_SCL_IN(); //设置SCL为输入 PS2_SET_SDA_IN(); //SDA IN PS2_SCL_OUT=1; //上拉 PS2_SDA_OUT=1; PS2_Set_Int(1); //开启中断 } //PS2中断屏蔽设置 //en:1,开启;0,关闭; void S2_Set_Int(u8 en) { EXTI->R=1<<11; //清除LINE11上的中断标志位 if(en)EXTI->IMR|=1<<11;//不屏蔽line11上的中断 else EXTI->IMR&=~(1<<11);//屏蔽line11上的中断 } |
|
|
|
我指的是在uCOS中啊
TIM1的输出比较中断: void TIM1_CC_IRQHandler(void) { if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET) { TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); step++; if(step==6) { step=0; OSTaskSuspend(OS_PRIO_SELF); printf("%d,",10); } } } 串口接收中断中恢复TIM1: *void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; OSIntEnter(); if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 USART_SendData(USART1,Res); OSTaskResume(7); //#define pwmout_PRIO 7 } OSIntExit(); } |
|
|
|
ucosii的教程,貌似说了这种语句不能在中断里面用的吧!!!
|
|
|
|
但是我如果把OSTaskSuspend(OS_PRIO_SELF); 和 OSTaskResume(7); 换成其他任务的优先级,就能挂起和恢复。咋回事呢?
|
|
|
|
不解。。。
|
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1072浏览 3评论
195浏览 2评论
457浏览 2评论
370浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 00:28 , Processed in 1.160934 second(s), Total 87, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号