硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4327|回复: 4
收起左侧

[有问必答] RTX下怎么使用GPIO外部中断

[复制链接]

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2018-10-22 11:12:07 | 显示全部楼层 |阅读模式
现想在RTX下使用ADS1256采集信号,如何做到像裸机一样在中断中采集数据?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-10-22 11:32:41 | 显示全部楼层
RTX里面使用中断,跟你裸机里面使用方法一样。
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2018-10-22 13:12:46 | 显示全部楼层
eric2013 发表于 2018-10-22 11:32
RTX里面使用中断,跟你裸机里面使用方法一样。

为何我开启之后就像死机了呢?

void bsp_Init(void)
{
        /*
                由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
                启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。

                系统时钟缺省配置为72MHz,如果需要更改,可以修改 system_stm32f10x.c 文件
        */
       
        /* 使能CRC校验, 用于开启STemWin的使用 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
       
        /* 优先级分组设置为4 */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

        bsp_InitDWT();
        bsp_InitUart();         /* 初始化串口 */
        bsp_InitLed();                 /* 初始LED指示灯端口 */
        //bsp_InitKey();                /* 初始化按键 */
       
        bsp_InitI2C();
        DS3231_Init();
        LCD_InitHard();               /* 初始化显示器硬件(配置GPIO和FSMC,给LCD发送初始化指令) */
       
        bsp_InitADS1256();
        ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_500SPS, 1);
        ADS1256_StartScan();
}

void ADS1256_StartScan(void)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
       
        /* 使能SYSCFG时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
       
        /* 连接 EXTI Line6 到 PB6 引脚 */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource6);
       
        /* 配置 EXTI LineXXX */
        EXTI_InitStructure.EXTI_Line = EXTI_Line6;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;        /* 下降沿(等待 DRDY 由1变0的时刻) */
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
               
        /* 设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级 */
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
       
        /* 中断优先级配置 最低优先级 这里一定要分开的设置中断,不能够合并到一个里面设置 */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X01;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        /* 开始扫描前, 清零结果缓冲区 */       
        {
                uint8_t i;
               
                g_tADS1256.Channel = 0;
               
                for (i = 0; i < 8; i++)
                {
                        g_tADS1256.AdcNow = 0;
                }       
        }
}

程序仿真之后,如下图所示!

1.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-10-22 13:30:01 | 显示全部楼层
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2018-10-22 13:48:06 | 显示全部楼层
eric2013 发表于 2018-10-22 13:30
看此贴:

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=88785&highlight=%C6%F4%B6%AF%CE%C4% ...

谢谢,已搞定!

原因为如下:
#ifndef EXTI9_5_ISR_MOVE_OUT                /* bsp.h 中定义此行,表示本函数移到 stam32f4xx_it.c。 避免重复定义 */
void EXTI9_5_IRQHandler(void)
{       
        if (EXTI_GetITStatus(EXTI_Line6) != RESET)
        {       
                EXTI_ClearITPendingBit(EXTI_Line6);                /* 清除中断标志位 */
       
                ADS1256_ISR();
               
                /* 执行上面的代码完毕后,再次清零中断标志 */
                EXTI_ClearITPendingBit(EXTI_Line6);                /* 清除中断标志位 */
        }                          
}
#endif
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 16:38 , Processed in 0.037733 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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