了解过Cortex-M内核单片机的人都知道,这类单片机都会有一个系统定时器,
SysTick这个定时器是什么东西,我就大致说一下,具体的大家还是在网上找找资料,一搜一大堆.,
SysTick这个定时器其实是厂家向ARM买内核的时候送的定时器,一个集成在内核上的东西,有别于不同厂家的外设,这个是内核赠送品,尽管用,不用心疼,
现在我们就用这个定时器,做一个100ms的定时任务.
由于涉及Systick跟中断处理,建议先熟读芯片手册”中断”,”SysTick”两个章节.
多说无益,直接写代码
void SystemInit(void)
{
GPIO_InitSettingType GPIO_InitTmp; //定义结构体变量
SYSTICK_InitStruType SYSTICK_InitTmp;
//打开所有外设时钟
DeviceClockAllEnable();
//原始时钟源选择为外部晶振
SCU_SysClkSelect(SCU_CLK_XTAL);
//打开PLL锁相环,输入为内部HRC 16M,输出为48M,系统时钟使用PLL
PLLClock_Config(Enable,SCU_PLL_OUT8M,SCU_PLL_48M,Enable);
//系统时钟后分频为1:1
SCU_RegUnLock();
SCU_SysClk_Div1();
SCU_RegLock();
GPIO_InitTmp.Func = GPIO_Reuse_Func0; //管脚功能定义为功能0
GPIO_InitTmp.Dir = GPIO_Direction_Output; //设置为输出
GPIO_InitTmp.DS = GPIO_DS_Output_Normal; //普通电流
GPIO_InitTmp.ODE = GPIO_ODE_Output_Disable; //开漏禁止
GPIO_InitTmp.PDE = GPIO_PDE_Input_Disable; //弱下拉禁止
GPIO_InitTmp.PUE = GPIO_PUE_Input_Disable; //弱上拉禁止
GPIO_InitTmp.Signal = GPIO_Pin_Signal_Digital; //管脚类型为数字模式
GPIO_Init(GPIO_Pin_B0,&GPIO_InitTmp); //初始化管脚
GPIO_Init(GPIO_Pin_B1,&GPIO_InitTmp);
SYSTICK_InitTmp.SysTick_ClkSource = SysTick_ClkS_Cpu; //时钟源为系统时钟
SYSTICK_InitTmp.SysTick_ITEnable = Enable; //中断使能
SYSTICK_InitTmp.SysTick_Value = 4800000; // 0.1S
SysTick_Init(&SYSTICK_InitTmp); // 开启系统定时器
SysTick_Enable();
}
//中断函数
void SysTick_IRQHandler(void)
{
GPIO_ToggleBit(GPIO_Pin_B1);
GPIO_ToggleBit(GPIO_Pin_B0);
}
这是system_HR8P506.c的内容,
int main(void)
{
while(1)
{
}
}
这是Main函数.
编译,下载,灯以5Hz闪烁,试验成功.
好了好了,现在开始分析原理,,,
首先我们初始化Systick
SYSTICK_InitTmp.SysTick_ClkSource = SysTick_ClkS_Cpu; //时钟源为系统时钟
SYSTICK_InitTmp.SysTick_ITEnable = Enable; //中断使能
SYSTICK_InitTmp.SysTick_Value = 4800000; // 0.1S
SysTick_Init(&SYSTICK_InitTmp); // 开启系统定时器
SysTick_Enable();
SysTick_Init函数在文件”lib_scs.c”里面.
这是东软载波封装的函数.
然后SysTick_Enable这是一个宏定义,在文件”lib_scs.h”里面.
其实Arm公司也封装了一个使能SysTick的函数,在Core_Cm0.h里面,叫SysTick_Config,当然这里就不赘述了,有兴趣的可以自己去看看,
void SysTick_IRQHandler(void)
{
GPIO_ToggleBit(GPIO_Pin_B1);
GPIO_ToggleBit(GPIO_Pin_B0);
}
然后我们写了一个SysTick中断服务函数,有的同学已经开始奇怪了,,,上面的代码明明没有使能SysTick的中断,为什么还可以跑Systick中断?
我们看芯片手册描述
“其中 Hard Fault 异常、SVC 异常、PendSV 异常、SysTick 异常为 Cortex-M0 内核异常源,
只受 Cortex-M0 内核控制,而 NMI 中断与 32 个 IRQ 可由芯片配置控制。”
这里的意思就是说,SysTick是内核的中断,不受外设决定,
简单点说,我背后有人,你们这些外设渣渣想左右我 ?滚,
不用配置IRQ,这些异常会自动挂起,
那要用什么办法才能把它关了?请自行看”SYST_CSR”寄存器.
配置大概就是这个样子.
然后,中断函数名是怎么来的?
打开”startup_HR8P506.s”文件,会发现很多”IRQHandler”结尾的字符段,没错了,这些就是中断函数的名字,以后要什么中断函数名就来这里复制好了.
OK,这篇就到这里,有疑问,留言.
代码:http://pan.baidu.com/s/1pKGJC9P