版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
6 篇文章4 订阅
订阅专栏
了解过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,当然这里就不赘述了,有兴趣的可以自己去看看,
voidSysTick_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,这篇就到这里,有疑问,留言.