使用eclipse向导建立的工程,已经没有*.s启动文件了,它的启动文件是:system\src\newlib\_startup.c
中断向量表则在system\src\cmsis\vectors_stm32f10x.c文件中。因此不同于使用*.s启动文件的方式。
举个例子,如要使用TIM3的update中断,要修改的代码:
1、注释掉vectors_stm32f10x.c中,TIM3_IRQHandler的函数定义
void __attribute__ ((weak, alias ("Default_Handler")))
TIM3_IRQHandler(void);
2、在vectors_stm32f10x.c文件中,它包含了cortexm/ExceptionHandlers.h头文件,因此在include/cortexm/ExceptionHandlers.h头文件中重新定义TIM3_IRQHander函数:
extern void TIM3_IRQHandler(void); //这里的定义,主要还是为了声明,是外部函数
3、在要写中断程序的文件中,实现void TIM3_IRQHandler(void)实体,需要再说明一下,这个文件需要包含ExceptionHandlers.h,这样就能与vectors_stm32f10x.c中的向量表链接起来了。如在main.cpp中实现,则在main.cpp中需要做的事情:
1、#include "ExceptionHandlers.h"
2、初始化TIM3及中断
PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 800;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3 , TIM_IT_Update , ENABLE);
NVIC_Configuration();
3、实现void TIM3_IRQHandler(void)代码功能
void TIM3_IRQHandler(void)
{
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //在中断中,必需清除中断标志,否则会重复中断,将CPU资源占用光,使其它程序无法运行
if(iostate == 0)
{
iostate =1;
GPIOB->BSRR = GPIO_BSRR_BS2 | GPIO_BSRR_BS0;
}
else
{
iostate =0;
GPIOB->BSRR = GPIO_BSRR_BR2 | GPIO_BSRR_BR0;
}
}
如果不使用工程建立的向导建工程,那么向量表在*.s文件中,如果在KEIL环境下,直接定义中断向量表相同名字的函数即可链接起来,但是在eclipse环境下,本应该也是这样,但现在还没成功,也许方法不对。
还在测试找问题中,待成功后,接着完成这个日志。