OpenEdv-开源电子网

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

为什么加上了NVIC函数之后LCD模块就不运作了

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2015-8-29
在线时间
5 小时
发表于 2016-1-28 00:39:16 | 显示全部楼层 |阅读模式
25金钱
我原本是想要通过一个定时器TIM3的PA6脚(推挽输出)输出一个50HZ的PWM波,然后通过捕获的方式输进PA7脚(浮空输入),然后再捕获上下沿的值通过相减得到PWM高电平的时间,但是失败鸟。于是试着退一步看我的中断函数到底能不能发生,下面这个函数我是想要得到某几个参数的值,在不加入NVIC初始化的那一段时,这些得到的参数在LCD上显示全为0,当加了NVIC的一段初始化时,LCD就不工作了,我在想是不是定时器的优先级比LCD的高导致的呀?求大神解答////////////////////这是主函数///////////////////////////////////////////
extern u16 temp_cnt1,temp_cnt1_2,
                         temp_cnt2,temp_cnt2_2,
                   temp_cnt3,temp_cnt3_2,
                   temp_cnt4,temp_cnt4_2;

extern T_RC_Data Rc_Data;

int main(void)
{       
     u16 temp;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
         Tim_Pwm_In_Init();
         LED_Init();
        delay_init();                      
        uart_init(500000);                
        LCD_Init();                                          
        POINT_COLOR=RED;                       
        LCD_ShowString(30,50,200,16,16,"Mini STM32");       
        LCD_ShowString(30,70,200,16,16,"MPU6050 TEST");       

  while(1)
        {
                   
               
                  POINT_COLOR=BLUE;
               
               
                   TIM_SetCompare1(TIM3,5);
               
                   temp =temp_cnt1_2;
                        LCD_ShowNum(30+48+40,260,temp*1000,8,16);       
                delay_ms(1000);
               
                        TIM_SetCompare1(TIM3,80);
                   temp =temp_cnt1        ;
                        LCD_ShowNum(30+48+40,240,temp*1000,8,16);       
                                delay_ms(100);

                        TIM_SetCompare1(TIM3,120);
                   temp =Rc_Data.THROTTLE        ;
                        LCD_ShowNum(30+48+40,220,temp*10000,8,16);       
                                delay_ms(100);

                        TIM_SetCompare1(TIM3,150);
                   temp =temp_cnt1;
                        LCD_ShowNum(30+48+40,200,temp*100,8,16);       
               
                                delay_ms(100);

        }
}
//////////////////////这是定时器函数//////////////////////////////////

#include "tim4.h"
#include "stm32f10x.h"
#include "1.h"
#include "delay.h"
u16 temp_cnt1,temp_cnt1_2,
                         temp_cnt2,temp_cnt2_2,
                   temp_cnt3,temp_cnt3_2,
                   temp_cnt4,temp_cnt4_2;


u16                         Rc_Pwm_In[4];
T_RC_Data         Rc_Data;//1000~2000

static void Rc_DataAnl(void)
{
        Rc_Data.THROTTLE        =        Rc_Pwm_In[1];
        Rc_Data.YAW                                =        Rc_Pwm_In[0];
        Rc_Data.ROLL                        =        Rc_Pwm_In[3];
        Rc_Data.PITCH                        =        Rc_Pwm_In[2];
       
}
void Rc_GetValue(T_RC_Data *temp)
{
        temp->THROTTLE        = Rc_Data.THROTTLE;   //youmen
        temp->YAW                = Rc_Data.YAW;        //y
        temp->ROLL                = Rc_Data.ROLL;   //x
        temp->PITCH                = Rc_Data.PITCH;        //y
}
void Tim_Pwm_In_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


        TIM_ICInitTypeDef  TIM_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       GPIO_InitTypeDef GPIO_InitStructure2;
        NVIC_InitTypeDef NVIC_InitStruct;
       TIM_OCInitTypeDef TIM_OCInitStructure;
       
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure2);
//////////////////////////////////////////////////////////////////
       
       
        NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
        NVIC_Init(&NVIC_InitStruct);
       
       
       
        TIM_DeInit(TIM3);

               
        TIM_TimeBaseStructure.TIM_Period = 199;
        TIM_TimeBaseStructure.TIM_Prescaler =7199;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
       
       
       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
   TIM_SetCompare1(TIM3,5);
       
       
       
        /////////////////////////////////////////////////////
       
       
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;       
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     
        TIM_ICInitStructure.TIM_ICFilter = 0x0;      
        TIM_ICInit(TIM3, &TIM_ICInitStructure);
       
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;       
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     
        TIM_ICInitStructure.TIM_ICFilter = 0x0;      
        TIM_ICInit(TIM3, &TIM_ICInitStructure);
       
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;       
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     
        TIM_ICInitStructure.TIM_ICFilter = 0x0;      
        TIM_ICInit(TIM3, &TIM_ICInitStructure);

        /* TIM enable counter */
        TIM_CtrlPWMOutputs(TIM3,ENABLE);       
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  
        TIM_ARRPreloadConfig(TIM3, ENABLE);
        /* Enable the CC1 Interrupt Request */
        TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_Update, ENABLE);
       

        TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3, TIM_IT_CC1|TIM_IT_Update) != RESET)
        {       
               
                TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update);
                 temp_cnt1_2=2;   
     temp_cnt1=TIM_GetCapture1(TIM3);       
      Rc_Data.THROTTLE=5;       
      LED0=0;       
delay_ms(5000);               
       
        }

       
}



最佳答案

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

定时器初始化放在液晶初始化之后,中断可能打断液晶配置了.....
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-28 00:39:17 | 显示全部楼层
定时器初始化放在液晶初始化之后,中断可能打断液晶配置了.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2015-8-29
在线时间
5 小时
 楼主| 发表于 2016-1-28 12:19:17 | 显示全部楼层
龙之谷 发表于 2016-1-28 08:51
定时器初始化放在液晶初始化之后,中断可能打断液晶配置了.....

屏幕确实是亮了!!!!但主函数上的数据一个都没有显示出来,这又是为什么呢?难道我中断配置有问题?求大神解惑
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2015-8-29
在线时间
5 小时
 楼主| 发表于 2016-1-28 16:49:50 | 显示全部楼层
另外,中断服务函数的时间不能太长,问题已解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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