OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5342|回复: 2

一开高速AD7663用外部中断来读取AD数据,ucosiii就不执行任务了一直不停的执行外部中断

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-12-10
在线时间
9 小时
发表于 2019-3-19 09:59:10 | 显示全部楼层 |阅读模式
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       
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-12-10
在线时间
9 小时
 楼主| 发表于 2019-3-19 10:19:36 | 显示全部楼层
/***************主函数*****************/
int main(void)
{
        OS_ERR                  err;
        CPU_SR_ALLOC();//变量cpu_sr申请,用于保存CPU状态寄存器的值
       
        Apply_Perpheral_Init();//板级硬件初始化
       
        OSInit(&err);                     //初始化UCOSIII
        OS_CRITICAL_ENTER(); //进入临界区                         
       
        /****创建开始任务****/
        OSTaskCreate((OS_TCB     *)&StartTaskTCB,                                            //任务控制块地址
                                                         (CPU_CHAR   *)"Start Task",                                            //任务名称
                                                         (OS_TASK_PTR )F_StartTask,                                       //任务函数
                                                         (void       *)0,                                                  //传递给任务函数(形参p_arg)的实参
                                                         (OS_PRIO     )START_TASK_PRIO,                                                //任务的优先级
                                                         (CPU_STK    *)&StartTask_STK[0],                                 //任务堆栈的基地址
                                                         (CPU_STK_SIZE)START_STK_SIZE / 10,                                                       //任务堆栈空间剩下1/10时限制其增长
                                                         (CPU_STK_SIZE)START_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);                                       //返回错误类型
        OS_CRITICAL_EXIT();        //退出临界区         
        OSStart(&err);      //开启UCOSIII
}
主函数执行到OSStart(&err);      //开启UCOSIII这句以后,程序就进入了外部中断线的中断函数了一直在读取AD7663的数据了。是AD7663的中断太快了吗?
回复

使用道具 举报

0

主题

6

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1069
金钱
1069
注册时间
2022-3-27
在线时间
84 小时
发表于 2022-10-18 09:49:40 | 显示全部楼层
帮顶 ,我也有同样的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 16:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表