K60启动及文件分析

K60启动及文件分析

启动分析

上电,PC指针指向汇编函数Reset_Handler

Reset_Handler是中断向量表里宏定义的第二个函数地址,第一个为起始SP栈指针,第二个为复位中断服务函数。

vectors.h里定义中断映射关系,其中前两个元素分别映射到_BOOT_STACK_ADDRESS和Reset_Handler两个宏定义地址。

1
2
3
//vectors.h里
#define VECTOR_000 (vector_entry)__BOOT_STACK_ADDRESS // ARM core Initial Supervisor SP
#define VECTOR_001 Reset_Handler // 0x0000_0004 1 - ARM core Initial Program Counter

vectors.c里定义中断向量表(中断向量表里宏定义了中断函数地址)

1
2
3
4
5
6
7
8
//vectors.c里
const vector_entry __vector_table[] = //@ ".intvec" =
{
...
VECTOR_000, /* 此值复位启动时复制到 SP ,即指定栈地址 */
VECTOR_001, /* 此值复位启动时复制到 PC ,即启动马上执行的函数 */
...
}

在MK60_it.h里: 中断服务重定向
重新定义中断向量表
先取消默认的中断向量元素宏定义 #undef VECTOR_xxx
在重新定义到自己编写的中断函数 #define VECTOR_xxx xxx_IRQHandler
在MK60_it.c里: 定义中断服务函数(发生中断后进行的后台处理函数),需要引入MK60_it.h头文件
中断的分类:PIT定时中断、引脚条件触发中断、DMA采集中断

PIT定时中断处理函数

定义方式 void PITx_IRQHandler(void){//输入//输出//监控//清中断}
清除中断方式:PIT_Flag_Clear(PITx);

1
2
3
4
5
6
7
8
9
10
11
12
13
void PIT0_IRQHandler(void)
{
/*****输入*****/
Gyroscope_Cal();
/*****输出*****/
Turn_Control();
/**上位机监控**/
// OutPut_Data();
PIT_Flag_Clear(PIT0); //清中断标志位
}

端口触发中断处理函数

PIT0_IRQHandler(void){//输入//输出//监控//清中断}
清除中断方式:
需要引脚号:PTX_n 需要PORTX_ISFR:端口中断标志位
注意:PORTx_ISFR是引脚中断标志寄存器,32为 0-31
清空引脚n的中断标志为方法是ISF=1<<n
与运算:比如第n位已经写入中断标识,n=4,
清除标志位:与0全部清0,与1 保存原数
1.从第0位到第31位如下:00000000 00000000 00000000 00010000 ~0(=000000000000000 0000000000000000) 全部位清零
2.0000000000000000 0000000000000001 << n????

void PORTD_IRQHandler()
{
uint8 n = 0; //引脚号
uint32 flag = PORTD_ISFR;
PORTD_ISFR = ~0; //清中断标志位

n = 11;                                             //场中断
if(flag & (1 << n))                                 //PTD10触发中断
{
    camera_vsync();
}
#if 0             //鹰眼直接全速采集,不需要行中断
n = 28;
if(flag & (1 << n))                                 //PTA28触发中断
{
    camera_href();
}
#endif
}
1
2
3
4
5
6
7
//DMA中断,DMA采集完成自动清除中断
​```c
void DMA0_IRQHandler()
{
camera_dma();
}