中级会员
 
- 积分
- 305
- 金钱
- 305
- 注册时间
- 2018-6-28
- 在线时间
- 60 小时
|
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是不是用在屏幕驱动上了,然后你又初始化成了外部中断?
|