初级会员

- 积分
- 59
- 金钱
- 59
- 注册时间
- 2013-12-10
- 在线时间
- 9 小时
|
30金钱
我是刚刚研究ucos,很多都不太懂。今天尝试用ucosiii来做个东西,我用到了一颗220K的高速AD7663,并口的AD。我是用外部中断的方式来读取AD数据的,然后我用ucos创建了一个显示数据的任务,可是我一开AD7663的外部中断(这个外部中断的优先级是最低的),ucos的其他任务就都不执行了,关掉外部中断就执行正常。请大家帮忙看看,是什么原因导致的,可有解决办法,谢谢了。void AD766X_EXTI6_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
//GPIOE.6 中断线以及中断初始化配置 下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6);
EXTI_InitStructure.EXTI_Line = EXTI_Line6;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //配置外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
//外部中断服务程序
void EXTI9_5_IRQHandler(void)
{
OSIntEnter(); //进入中断
if (EXTI_GetITStatus(EXTI_Line6) == SET)//标志位置1,只要PE6的下降沿中断触发,则说明AD766x转换完成
{
AD766x_CNVST = SET; //准备下次转换
// g_u2AD766x_AD_Average = F_S_SlipAverage_Filter((u16)GPIOF->IDR);
g_u2AD766x_AD_Average = (u16)GPIOF->IDR;
AD766x_CNVST = RESET; //启动转换
EXTI_ClearITPendingBit(EXTI_Line6);//清除LINE0上的中断标志位
}
OSIntExit(); //退出中断
}
//创建送显任务
OSTaskCreate((OS_TCB *)&DGUS_DIS_TaskTCB, //任务控制块地址
(CPU_CHAR *)"DGUS_DIS Task", //任务名称
(OS_TASK_PTR )F_DGUS_DIS_Task, //任务函数
(void *)0, //传递给任务函数(形参p_arg)的实参
(OS_PRIO )DGUS_DIS_TASK_PRIO, //任务的优先级
(CPU_STK *)&DGUS_DIS_Task_STK[0], //任务堆栈的基地址
(CPU_STK_SIZE)DGUS_DIS_STK_SIZE / 10, //任务堆栈空间剩下1/10时限制其增长
(CPU_STK_SIZE)DGUS_DIS_STK_SIZE, //任务堆栈空间(单位:sizeof(CPU_STK))
(OS_MSG_QTY )5u, //任务可接收的最大消息数
(OS_TICK )0u, //任务的时间片节拍数(0表默认值 OSCfg_TickRate_Hz/10)
(void *)0, //任务扩展(0表不扩展)
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
(OS_ERR *)&err);
/****送显任务***/
void F_DGUS_DIS_Task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
F_WriteDGUS_VariableBuff_s32(0x0022,(s32)(g_fAD7714_V));//显示滤波电压
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时0.5s
}
}
|
|