OpenEdv-开源电子网

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

求助:main函数中加入中断初始化函数屏幕不显示,但屏蔽掉中断初始化函数屏幕就能显示。

[复制链接]

4

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-6-28
在线时间
60 小时
发表于 2018-8-14 09:45:27 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 Bazinga2018 于 2018-8-14 12:24 编辑

本人最近在做一个项目,单片机是STM32F103RCT6,屏幕是原子的2.8寸屏。项目目的是用开关控制气泵给气囊充气,将压力传感器采集到的信号通过外部AD,以SPI的方式传输,并将实时采集的气压值显示在屏幕上。
但在main函数中,将中断初始化函数屏蔽,屏幕能显示字符和波形,但加上中断初始化函数,屏幕就白屏。屏幕显示的内容、中断函数和main函数贴在下面:


中断函数:
#include "stm32f10x_it.h"
#include "delay.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "pump.h"
#include "my_it.h"

extern u8 Start_End_Flag;    //启动停止标志
u16 time;
u16 count;
u8 mode;  // mode:1 单腔 ;2 多腔
u8 level;  //治疗强度 level:1  低  ; 2  中  ; 3  高
u16 settime = 20*60;             //治疗时间最低为20min



//外部中断初始化函数
void EXTIX_Init(void)
{

           EXTI_InitTypeDef EXTI_InitStructure;
           NVIC_InitTypeDef NVIC_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

          KEY_Init();//初始化按键对应io模式
        
        //KEY 1
    //GPIOC.4 中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);

          EXTI_InitStructure.EXTI_Line=EXTI_Line4;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

        //KEY 2
    //GPIOC.5          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

          EXTI_InitStructure.EXTI_Line=EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

        //KEY 3
    //GPIOB.0          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);

           EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
        
        //KEY 4
    //GPIOB.1          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);

           EXTI_InitStructure.EXTI_Line=EXTI_Line1;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



          NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级0
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
               
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级1,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);


           NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级3,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);

}


void EXTI4_IRQHandler(void)
{
        u8 key1_time;
        if(EXTI_GetITStatus(EXTI_Line4) == 1)
        {
               
                delay_ms(10);                           //消抖
               
                if(key1_time%2==1)                 //按奇数次
                {
                        mode = 1;                //单腔模式
                        LCD_ShowChar(80,78,'*',16,10);              //在相应的模式后面显示“*”               
                        key1_time++;
                }
                else if(key1_time%2==0)             //按偶数次
                {
                        mode = 2;                      //多腔模式
                        LCD_ShowChar(80,106,'*',16,10);
                        key1_time++;
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line4);  //清除EXTI4线路挂起位
}

void EXTI9_5_IRQHandler(void)
{                        
        u8 key2_time;
        if(EXTI_GetITStatus(EXTI_Line5) == 1)
        {
               
                delay_ms(10);                           //消抖
               
                if(key2_time%3==1)                 //按1次
                {
                        level = 1;                //“低”强度
                        LCD_ShowChar(25,162,'*',16,10);              //在相应的模式后面显示“*”               
                        key2_time++;
                }
                else if(key2_time%3==2)             //按2次
                {
                        level = 1;                //“中”强度
                        LCD_ShowChar(55,16,'*',16,10);
                        key2_time++;
                }
                else if(key2_time%3==0)             //按3次
                {
                        level = 1;                //“高”强度
                        LCD_ShowChar(85,16,'*',16,10);
                        key2_time++;
                }
        }
         EXTI_ClearITPendingBit(EXTI_Line5);    //清除LINE5上的中断标志位  
}


void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) == 1)
        {
                delay_ms(10);
                settime += 5;                                         //按一次增加5min
        }
         EXTI_ClearITPendingBit(EXTI_Line0);  //清除LINE0线路挂起位
}


void EXTI1_IRQHandler(void)
{
        u8 key4_time;
        if(EXTI_GetITStatus(EXTI_Line1) == 1)
        {
               
                delay_ms(10);                           //消抖
               
                if(key4_time%2==1)
                {
                        Start_End_Flag = 1;
                }
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_3);
        }
         EXTI_ClearITPendingBit(EXTI_Line1);  //清除LINE1线路挂起位
}

void  BASIC_TIM6_IRQHandler (void)
{
        if ( TIM_GetITStatus( TIM6, TIM_IT_Update) != RESET )
        {        
                time++;
               
          if(time>=60)   //定时120 S
                {
                        Start_End_Flag=0;  //系统停止工作
                        time=0;
                        TIM_Cmd(TIM6, DISABLE); //关闭定时器
                }
               
                TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);                  
        }                        
}



main函数:
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "key.h"
#include "lcd.h"
#include "usart.h"
#include "ad.h"
#include "pump.h"
#include "my_it.h"
#include "text.h"
#include "waveform.h"

u8 Start_End_Flag=0;    //启动停止标志
u8 lcd_id[12];                        //存放LCD ID字符串
u16 pressure[7];       //存放要显示的压力值   
float temp;

extern uint8_t  ADC128_Channel[];
extern u16 time;
extern u8 mode;

extern double ADC_Result[8];

int main()
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        
        delay_init();
        uart_init(9600);
        KEY_Init();        
        TIM6_Int_Init(9999,7199); //基本定时器初始化
        
        LCD_Init();
//        EXTIX_Init();                //外部中断初始化                                           就是将这个函数屏蔽掉,屏幕能正常显示
        SPI1_Init();
        Pump_GPIOInit();

        LCD_Fill(120,50,310,190,CYAN);         //波形显示区域

        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(10,17,200,16,16,"CH1:");              
        LCD_ShowString(90,17,200,16,16,"CH2:");
        LCD_ShowString(170,17,200,16,16,"CH3:");              
        LCD_ShowString(250,17,200,16,16,"CH4:");
        LCD_ShowString(170,207,200,16,16,"CH5:");              
        LCD_ShowString(250,207,200,16,16,"CH6:");
        LCD_ShowString(90,207,200,16,16,"Main:");
        
        LCD_ShowString(10,50,200,16,16,"Mode:");
        
        LCD_Show_Font(10,78,11);                //单腔模式
        LCD_Show_Font(10+20,78,12);
        LCD_Show_Font(10+40,78,13);
        LCD_Show_Font(10+60,78,14);
               
        LCD_Show_Font(10,106,15);              //多腔模式
        LCD_Show_Font(30,106,12);
        LCD_Show_Font(50,106,13);
        LCD_Show_Font(70,106,14);
        
        LCD_ShowString(10,134,200,16,16,"Intensity:");
        
        LCD_Show_Font(10,162,16);             //低、中、高
        LCD_Show_Font(40,162,17);
        LCD_Show_Font(70,162,18);
        
        LCD_ShowString(10,207,200,16,16,"Time:");

        while(1)
        {               
                if(Start_End_Flag == 1)
                {
                  System_Work(mode);        
                }
                else
                {
                        GPIO_ResetBits(GPIOC,GPIO_Pin_3);               
                }
               
                printf("%d\t",Get_Adc_Average(ADC128_Channel[4],10));
                printf("%d\t",Get_Adc_Average(ADC128_Channel[3],10));
                printf("%d\t",Get_Adc_Average(ADC128_Channel[5],10));
                printf("%d\t\n",Get_Adc_Average(ADC128_Channel[2],10));
                delay_ms(100);

                temp = (float)((Get_Adc_Average(ADC128_Channel[4],10))*Modulus-30.2) / Modulus_Pressure;
                display_wave(temp);
               
        }


}


希望哪位大神能解答一下。

这是屏蔽掉中断初始化函数后,屏幕显示的内容

这是屏蔽掉中断初始化函数后,屏幕显示的内容

治疗仪.rar

5.63 MB, 下载次数: 17

这是全部代码,因为屏幕不显示,所以中断部分功能还未验证。

最佳答案

查看完整内容[请看2#楼]

看你用的原子的LCD驱动,那你的B0、B1、C4、C5是不是用在屏幕驱动上了,然后你又初始化成了外部中断?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-8-14 09:45:28 | 显示全部楼层
看你用的原子的LCD驱动,那你的B0、B1、C4、C5是不是用在屏幕驱动上了,然后你又初始化成了外部中断?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-14 11:23:37 | 显示全部楼层
帮顶!
回复

使用道具 举报

4

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-6-28
在线时间
60 小时
 楼主| 发表于 2018-8-14 11:31:33 | 显示全部楼层
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-14 11:54:03 | 显示全部楼层
怎么没有exti.h
回复

使用道具 举报

4

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-6-28
在线时间
60 小时
 楼主| 发表于 2018-8-14 12:12:38 | 显示全部楼层

中断都是放在“my_it.h”里的,所以没有exti.h
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-14 14:23:47 | 显示全部楼层
Bazinga2018 发表于 2018-8-14 12:12
中断都是放在“my_it.h”里的,所以没有exti.h

哦哦。那你外部中断单独试试看看吧,看有没有问题
回复

使用道具 举报

4

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-6-28
在线时间
60 小时
 楼主| 发表于 2018-8-14 14:25:55 | 显示全部楼层
qiuzhicheng 发表于 2018-8-14 14:23
哦哦。那你外部中断单独试试看看吧,看有没有问题

好的,我现在试试。谢谢。
回复

使用道具 举报

4

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-6-28
在线时间
60 小时
 楼主| 发表于 2018-8-14 15:20:59 | 显示全部楼层
szczyb1314 发表于 2018-8-14 14:35
看你用的原子的LCD驱动,那你的B0、B1、C4、C5是不是用在屏幕驱动上了,然后你又初始化成了外部中断?

谢谢您,是像您说的一样,按键与屏幕的数据线冲突了,已经解决了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 16:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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