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
- HR8P506,SysTick,是谁的亲生子.
- (Live) Messenger 是 M$ 亲生的吗?
- HR8P506,哪里冒出来的SystemInit函数,用库函数点灯again.
- HR8P506,FLASH的IAP操作与RAM不得不说的秘密
- STM32F103的SysTick使用方法
- STM32的SysTick
- systick 的配置总结
- Systick的应用
- stm32的Systick定时器
- STM32的SYSTICK
- STM32的SYSTICK详解
- STM32的Systick定时器
- STM32的SYSTICK详解
- STM32的SYSTICK详解
- STM32的SYSTICK详解
- STM32的SYSTICK详解
- 自己的亲生经历谈:人生如戏这句话
- 用酷刑杀死亲生儿子的残忍帝王
- java学习之产生随机数的三种方式
- 从listview动态添加行中获取edittext的值
- 面向对象中的序列化和反序列化
- Conv Nets: A Modular Perspective
- web.xml classes:配置 /url-pattern 配置
- HR8P506,SysTick,是谁的亲生子.
- RecycleView遇到的奇葩bug
- WCF使用入门(一)【基于双工通信的WCF应用】
- node.js定时任务:node-schedule的使用【转】
- 关于计时器定时器的设计 时间轮的高效实现 linux hashed Hierarchical timing wheel
- 一步一步教你接入tinker 热修复
- 基于jquery.artZoom实现图片旋转
- Tkx笔记
- label的长按复制的功能