void Set_Nvic_Irq(u8 Channel,u8 PreemptionPriority,u8 SubPriority)
{
NVIC_InitTypeDef NVIC_Structure;
NVIC_Structure.NVIC_IRQChannel=Channel;
NVIC_Structure.NVIC_IRQChannelPreemptionPriority=PreemptionPriority;
NVIC_Structure.NVIC_IRQChannelSubPriority=SubPriority;
NVIC_Structure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_Structure);
}
使用
Nvic_Init(NVIC_PriorityGroup_4);//中断分组第四组 高优先打断低优先
Set_Nvic_Irq(USART2_IRQn,0,0);
Set_Nvic_Irq(USART3_IRQn,0,0);
Set_Nvic_Irq(DMA2_Stream3_IRQn,1,0);
Set_Nvic_Irq(SDIO_IRQn,2,0);
Set_Nvic_Irq(DMA1_Stream4_IRQn,2,0);
Set_Nvic_Irq(TIM7_IRQn,3,0);
Set_Nvic_Irq(TIM6_DAC_IRQn,4,0);
dely.c
#include "delay.h"
void Delay_Init(void)
{
NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);
SysTick->VAL=0;
SysTick->CTRL=0;
}
void delay(u32 time)
{
u32 temp;
SysTick->LOAD=(time&SysTick_LOAD_RELOAD_Msk)-1;
SysTick->VAL=0;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//开启滴答定时器
do
{
temp=SysTick->CTRL;
}
while(!(temp&SysTick_CTRL_COUNTFLAG_Msk));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭滴答定时器
}
void delay_sec(u32 second)//秒延时
{
u32 delay_count;
u32 temp;
delay_count=2*second;
SysTick->LOAD=(11250000&SysTick_LOAD_RELOAD_Msk)-1;//500ms定时
SysTick->VAL=0;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//开启滴答定时器
do
{
do
{
temp=SysTick->CTRL;
}
while(!(temp&SysTick_CTRL_COUNTFLAG_Msk));//等待时间到达
}
while(delay_count--);
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭滴答定时器
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "my_scc.h"
void Delay_Init(void);//调用延时函数前必须初始化
void delay(u32 time);//查询方式 最大范围 745654 us
void delay_sec(u32 second);//秒延时
#define delay_ms(time) delay(time*21000)
#define delay_us(time) delay((u32)(time*21))
#endif
myscc.h
#ifndef __MY_SCC_H
#define __MY_SCC_H
#include "stm32f4xx.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
#include "motor.h"
#include "led.h"
#include "delay.h"
#include "oled.h"
#include "touch.h"
#include "led.h"
#include "math.h"
#include "algorithm.h"
#include "ff.h"
#include "sdio_sd.h"
#include "pcm5102.h"
#include "servo.h"
#include "key.h"
#include "adc.h"
#include "track_deal.h"
#include "openmv_uart.h"
#include "SEEKFREE_MPU6050.h"
#include "mechanical_arm.h"
#include "digital_io.h"
#include "stdlib.h"
#include "stdarg.h"
#include "usart.h"
#include "APP_Serial_MP3.h"
#define Nvic_Init(group) NVIC_PriorityGroupConfig(group)//nvic初始化
void Set_Nvic_Irq(u8 Channel,u8 PreemptionPriority,u8 SubPriority);//设定中断优先级
//角度
extern float x_angular_speed,y_angular_speed,z_angular_speed;
extern float yaw,roll,pitch;
extern FIL file; /* file objects */
extern FATFS SD_FatFs; // 文件系统对象
extern FRESULT MyFile_Res; // 操作结果
extern u32 bread;
void Tim_Init_1ms(void);//1ms定时
u8 Read_AD_Max_Min(void);
u8 Read_Pixels(void);
void Play_Music(void);
void Servo_Set_Page(void);
void Track_Set_Page(void);
void Openmv_Set_Page(void);
void Mechanical_Arm_Set_Page(void);
void Option_Choose_Page(void);
#endif
可以看到delay函数这个中断是3号,比定时器6的4号中断要高优先级