初级会员

- 积分
- 89
- 金钱
- 89
- 注册时间
- 2018-7-11
- 在线时间
- 15 小时
|
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)
{
}
}
}
|
|