HR8P506,SysTick,是谁的亲生子.

来源:互联网 发布:mac好用的照片浏览器 编辑:程序博客网 时间:2024/05/01 17:36

了解过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

0 0
原创粉丝点击