OpenEdv-开源电子网

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

定时器中断问题求解

[复制链接]

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
发表于 2018-8-7 12:06:38 | 显示全部楼层 |阅读模式
10金钱
我写了一个STM32小车程序,里面用到了定时器中断。我的想法是在主函数里让小车跑起来,中断函数里做一些其他的事情,比如ADC采样啊,画画图什么的,但是程序写进去以后车不会跑,想请教一下是怎么回事?源代码打包了

mian.c

extern u16 ADC3_Con[2];        //ADC3_DMA 接收数组先电压后电流
extern u16 ADC_Con[2];        //原始采样数组 模拟电压值 = ADC_Con[0~1]/4096*Vref
extern float Vref;
extern u16 Color;
extern u16 BackgroundColor;



int main(void)
{
         //int i = 0;
         delay_init();
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         uart_init(115200);
         ADC3_Init();
         LCD_Init();
         Motor_GPIO_Init();
         SPI1_Init();
         TIM3_PWM1_Init(7200,0);
         TIM3_PWM2_Init(7200,0);
         NRF24L01_SPI1_Init();
         TIM4_Int_Init(4999, 7199); //10khz,计数到49,500ms
         while(NRF24L01_SPI1_Check())                //check the model
         {
                        LCD_ShowString(300,200,20,20,40,"NRF23L01 Model Init...");
                 delay_ms(50);
         }
         
         //模式选择
         NRF24L01_SPI1_TX_Mode();
         
         POINT_COLOR = RED;
         while(1)
         {
                 Car_Run(1000);
                 delay_ms(1000);
                 //LCD_ShowNum(600,250,ADC3_Con[0]/4096.0f*3.3*100000*3,10,24);
           //LCD_ShowNum(600,300,ADC3_Con[1]/4096.0f*3.3*100000*4/3,10,24);
                 //32位编码
                 //sprintf(Tx_temp,"%3.6f%3.6f%3.6f",ADC3_Con[0]/4096.0f*3.3*3,ADC3_Con[1]/4096.0f*3.3*4/3,ADC3_Con[0]/4096.0f*3.3*3*ADC3_Con[1]/4096.0f*3.3*4/3);
                 //sprintf(Tx_temp,"%3.9f",ADC3_Con[0]/4096.0f*2.8);
                 //if(NRF24L01_SPI1_TxPacket(Tx_temp) == TX_OK)
                 //{
                 //}
         }
               
         
}



中断服务函数如下:

#include <stdlib.h>
#include "exti.h"
#include "delay.h"
#include "usart.h"
#include "motor.h"
#include "24l01.h"
#include "lcd.h"
#include "adc_test.h"
#include "spi.h"

//中断服务函数编写
extern const unsigned char gImage_WHUT[];
extern u16 ADC3_Con[2];
u8 Tx_temp[32];                //32位,采用ASCII码传输数据 [0x30 - 0x39] -> [0 - 9]

void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
       
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


        TIM_Cmd(TIM4, ENABLE);  //使能TIMx                                         
}
//定时器3中断服务程序
void TIM4_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志
                //载入事件
                LCD_Clear(WHITE);
                LCD_DivideArea();                                                        //        划分区域
                Picture_Draw(650,0,gImage_WHUT);
                LCD_DrawCoordinateAxis();                        //        画出坐标轴
               
                 LCD_ShowNum(600,250,ADC3_Con[0]/4096.0f*3.3*100000*3,10,24);
           LCD_ShowNum(600,300,ADC3_Con[1]/4096.0f*3.3*100000*4/3,10,24);
                 //32位编码
                 sprintf(Tx_temp,"%3.6f%3.6f%3.6f",ADC3_Con[0]/4096.0f*3.3*3,ADC3_Con[1]/4096.0f*3.3*4/3,ADC3_Con[0]/4096.0f*3.3*3*ADC3_Con[1]/4096.0f*3.3*4/3);
                 //sprintf(Tx_temp,"%3.9f",ADC3_Con[0]/4096.0f*2.8);
                 if(NRF24L01_SPI1_TxPacket(Tx_temp) == TX_OK)
                 {
                 }
                }
}



小车端发送demo.rar

4.39 MB, 下载次数: 21

最佳答案

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

另外检查中断函数执行时间 看是否发生了中断嵌套
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-11-26
在线时间
113 小时
发表于 2018-8-7 12:06:39 | 显示全部楼层
另外检查中断函数执行时间  看是否发生了中断嵌套
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-7 12:09:13 | 显示全部楼层
程序执行的结果是进去中断画一次图就停住了
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-7 12:09:42 | 显示全部楼层
自己顶一下贴,求大佬们不吝指教
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-7 12:11:36 | 显示全部楼层
就这样子凉了吗
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-7 12:40:35 | 显示全部楼层
不会的,帮顶
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-7 15:41:26 | 显示全部楼层
没人回我
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-11-26
在线时间
113 小时
发表于 2018-8-7 16:40:41 | 显示全部楼层
本帖最后由 Dayfly 于 2018-8-9 10:19 编辑

中断里各个函数的执行状态  看是不是掉在哪儿了
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-8 15:50:06 | 显示全部楼层
Dayfly 发表于 2018-8-7 16:53
另外检查中断函数执行时间  看是否发生了中断嵌套

谢谢您,我去看看
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-8-8 17:07:48 | 显示全部楼层
中断里面执行的代码太多了,有可能上一次中断的代码还没有执行完,新的中断又进来了。可以在中断里面设置标志位。然后主程序中判断标志位,再去执行其他动作。中断越短越好。
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-7-11
在线时间
15 小时
 楼主| 发表于 2018-8-9 20:51:56 | 显示全部楼层
HXYDJ 发表于 2018-8-8 17:07
中断里面执行的代码太多了,有可能上一次中断的代码还没有执行完,新的中断又进来了。可以在中断里面设置标 ...

感谢!已经解决了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 18:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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