HR8P506,SysTick,是谁的亲生子.

了解过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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值