- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Cortex M3学习笔记(一)--Systick应用
Cortex M3学习笔记(一)--Systick应用
这篇学习笔记,完全是基于《STM32不完全手册》而言的,我没有买Alientek的开发板,买的是ARMFly的,其实都差不多,只不过安福莱的板载资源非常丰富罢了,应用起来其实都差不都。
《STM32不完全手册》的51到56页就是要这次笔记学习的内容,请自己参考,我不再粘帖,主要讨论的内容其实就几行:
void delay_init(u8 SYSCLK)
{
SysTick-CTRL=0xfffffffb;
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
Systick主要的作用就是拿来计时,其原理和应用简述一下就是这样的:通过配置寄存器 SysTick-CTRL来设定Systick的计时频率并Enable使Systick开始计数,这里的SysTick-CTRL=0xfffffffb应该很好理解,把第2位设定为0,查找应用手册可以知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。
假定我们板子默认的晶振频率是8Mhz,默认CPU工作频率(SYSCLK)是9倍频,即72M,那Systick的频率就是72/8=9Mhz。
知道了Systick的频率,下一步就是确定倒时计数器的数值,即SysTick- LOAD这个寄存器的配置。上面已经知道了,Systick的工作频率F=9Mhz=SYSCLK/8,即每秒钟计数器自减900万次,也就是说,SYSCLK/8次的自减耗时1秒,那么(8/SYSCLK)/1000,000次自减就耗时1微秒了,这也就是fac_us的值了。那么上面函数中的fac_us为什么是SYSCLK/8呢?这里先搞清楚一点,函数中SYSCLK的单位是Mhz,所以SYSCLK的值是72(这个以Mhz为单位应该是STM32基础库里面做过宏定义的),否则也不可能用一个8位整形去表示一个7200万的数值;而我们这里计算的SYSCLK是以Hz为单位的,即72Mhz/1000,000=72,所以这个SYSCLK/8是对的。
你可能还没搞清楚fac_us到底是干嘛的。很简单,fac_us就是要写入SysTick- LOAD寄存器的值,Systick的工作原理是这个寄存器的值在Systick被Enable之后就开始以设定的工作频率自减,减到0的时候就发出中断,实现定时。所以,写入fac_us到SysTick- LOAD寄存器,就是要Systick在自减了fac_us次以后发出中断,自减fac_us所耗的时间已经说了,1微秒。
下面的fac_ms应该很好理解了,就是1毫秒的计数次数,刚好是1微妙的1000倍,注意9×1000超出了8位整形的表示范围,所以要用(u16)先把fac_us转成16位变量,以保证计算的正确。
具体的应用函数是用来做延时,如下:
void delay_us(u32 nus)
{
u32 temp;
SysTick-LOAD=nus*fac_us; //时间加载
SysTick-VAL=0x00; //清空计数器
SysTick-CTRL=0x01 ; //Enable Systick,开始倒数
do
{
temp=SysTick-CTRL;
}
while(temp0x01!(temp(116)));//等待时间到达
SysTick-CTRL=0x00; //Disable Systick
SysTick-VAL =0X00; //清空计数器
}
具体的寄存器配置只要看手册就知道了,这里只需要理解一句:
do
{
temp=SysTick-CTRL;
}
while(temp0x01!(temp(116)));//等待时间到达
核心就是while(temp0x01!(temp(116)));//等待时间到达
temp已经是Systick控制寄存器的值了,temp0x01就是把该寄存器的值读出并且把除第一位之外位都清零(当然要通过
您可能关注的文档
最近下载
- Dynacoll product brochure.pdf VIP
- 香格里拉至丽江高速公路隧道专项施工方案.doc VIP
- 国家高速公路网G4216成都至丽江高速公路爆破专项施工方案.doc VIP
- 国家高速公路网G4216成都至丽江高速公路高填方路堤专项施工方案.doc VIP
- 经鼻高流量湿化氧疗与无创正压通气应用于慢性阻塞性肺疾病急性加重期合并Ⅱ型呼吸衰竭患者的效果差异分析.pdf VIP
- 人机界面标志标识的基本和安全规则 设备端子、导体终端和导体的标识.pdf VIP
- (最新)预防艾梅乙母婴传播理论考试试题(含答案).docx VIP
- 苯加氢制环己烷.PDF VIP
- 云南省香格里拉至丽江高速公路高边坡防护施工专项方案.doc VIP
- 短视频:策划、制作与运营PPT课件(全套完整版).pptx
文档评论(0)