新塘M051 关于 System Tick设置,3种方法操作
关于 System Tick设置,给出3种方法,学习并确认OK:
使用 M051BSPv3.01.001版本
一、使用函数CLK_EnableSysTick()
1 //Enable System Tick counter, Select HXT/2 as the clock source of SysTick,reload value. It could be 0~0xFFFFFF.
2 //HXT=12mHZ=(1/12)us
3 //12000*(1/12)=1000us=1ms 即1ms中断一次
4 CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HXT, 12000);
函数CLK_EnableSysTick()在CLK.C
注意:此函数有保护寄存器操作,所在需在解保时执行。
1 /**
2 * @brief Enable System Tick counter
3 * @param[in] u32ClkSrc is System Tick clock source. Including:
4 * - \ref CLK_CLKSEL0_STCLK_S_HXT
5 * - \ref CLK_CLKSEL0_STCLK_S_HXT_DIV2
6 * - \ref CLK_CLKSEL0_STCLK_S_HCLK_DIV2
7 * - \ref CLK_CLKSEL0_STCLK_S_HIRC_DIV2
8 * - \ref CLK_CLKSEL0_STCLK_S_HCLK
9 * @param[in] u32Count is System Tick reload value. It could be 0~0xFFFFFF.
10 * @return None
11 * @details This function set System Tick clock source, reload value, enable System Tick counter and interrupt.
12 * The register write-protection function should be disabled before using this function.
13 */
14 void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count)
15 {
16 /* Set System Tick counter disabled */
17 SysTick->CTRL = 0;
18
19 /* Set System Tick clock source */
20 if( u32ClkSrc == CLK_CLKSEL0_STCLK_S_HCLK )
21 SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
22 else
23 CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLK_S_Msk) | u32ClkSrc;
24
25 /* Set System Tick reload value */
26 SysTick->LOAD = u32Count;
27
28 /* Clear System Tick current value and counter flag */
29 SysTick->VAL = 0;
30
31 /* Set System Tick interrupt enabled and counter enabled */
32 SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
33 }
二、使用函数SysTick_Config()
1 if (SysTick_Config(SysTick_int_us*50))//此函数SysTick时钟源默认为系统时钟源。
2 {
3 //Capture error
4 do
5 printf("SysTick_Init_失败 \n\n\n");
6 while (1);
7 }
8 else
9 printf("SysTick_Init_成功 \n");
此函数在core_cm0.h
1 /** \brief System Tick Configuration
2
3 The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
4 Counter is in free running mode to generate periodic interrupts.
5
6 \param [in] ticks Number of ticks between two interrupts.
7
8 \return 0 Function succeeded.
9 \return 1 Function failed.
10
11 \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
12 function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
13 must contain a vendor-specific implementation of this function.
14
15 */
16 __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
17 {
18 if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
19
20 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
21 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
22 SysTick->VAL = 0; /* Load the SysTick Counter Value */
23 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
24 SysTick_CTRL_TICKINT_Msk |
25 SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
26 return (0); /* Function successful */
27 }
三、直接寄存器操作
1 //主时钟为:50Mhz
2 //HXT=50mHZ=1/50us 50000*1/50=1000us=1ms//OK
3 //重装载值=ticks 时钟频率(Hz)X想要的定时时间(S)=50x1000=50000
4 //SysTick控制与状态(SYST_CSR)
5 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | // 1= 内核时钟用于SysTick.
6 SysTick_CTRL_TICKINT_Msk | // 1:向下计数到0将引起SysTick中断。清SysTick当前值寄存器SYST_CVR的值将清除SysTick中断.
7 SysTick_CTRL_ENABLE_Msk; // ENABLE:1:计数器运行于多脉冲方式. 0:禁用计数器
8 // COUNTFLAG:计数由1到0时,COUNTFLAG 置位.在读该位或向系统定时器当前值寄存器(SYST_CVR)写时,COUNTFLAG 被清零。
9 //SysTick重装载值寄存器(SYST_RVR)
10 SysTick->LOAD = ((SysTick_int_us*50) & SysTick_LOAD_RELOAD_Msk) - 1; //RELOAD:当计数器达到0时,值加载到当前值寄存器.
11
12 //SysTick当前值寄存器(SYST_CVR)
13 SysTick->VAL = 0; //CURRENT:该寄存器为写清零软件写入任何值将清寄存器为0。
14
15 // set Priority for Systick Interrupt
16 //NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
17 NVIC_EnableIRQ(SysTick_IRQn);
最后中断入口程序:
1 /*******************************************************************
2 功能 :SysTick中断入口
3 说明 :嘀嗒心跳
4 入口参数 :无
5 返回值 :无
6 应用子程序 :
7 全局变量 :
8 *******************************************************************/
9 void SysTick_Handler(void) //非SysTick_IRQHandler(void)
10 {
11 SysTick_CountValue_Add(); //计数加1
12 /*SysTick当前值寄存器(SYST_CVR)*/
13 SysTick->VAL = 0; //CURRENT:该寄存器为写清零,软件写入任何值将清寄存器为0,写值清中断
14 GPIO_TOGGLE(P00); //Test 1ms P00切换一次电平
15 }
新塘M051 关于 System Tick设置,3种方法操作的更多相关文章
- C#学习笔记(12)——三种方法操作XML
说明(2017-7-11 16:56:13): 原文地址: C#中常用的几种读取XML文件的方法 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web. ...
- 两种方法操作其它mac应用的窗口
(图文基本无关) 如果单纯说简单方便,其使用AppleScript更好,特别是现在有了JS的加入,比如: (* This Apple script will resize any program wi ...
- mybatis中mapper接口的参数设置几种方法
方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...
- IIS7.5使用web.config设置伪静态的二种方法
转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...
- IIS7.5使用web.config设置伪静态的二种方法(转)
近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于 ...
- Map 迭代 两种方法
Map 迭代 两种方法 Map<String, String> map=new HashMap<String,String>(); map.put("1", ...
- 数组k平移三种方法(java)
上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是o(1): public class ArrayKMove { /** * 问题:数组的向左k平移,k小于数组长度 * @param ar ...
- 遍历Collection集合中的6种方法:
下面的代码演示了遍历Collection集合的6种方法,注意Collection集合的遍历远不止于增强for循环,和迭代器两种. 代码如下: package com.qls.traverse; imp ...
- SQLSERVER数据库中批量导入数据的几种方法
第一:使用Select Into 语句 如果企业数据库都是采用SQL Server数据库的话,则可以利用select into语句实现数据的导入. select into语句的作用是把数据从另外一个数 ...
- 在MySQL中设置事务隔离级别有2种方法:
在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...
随机推荐
- 【C#基础】Dynamic类型和正确用法
前言 Dynamic类型是C#4.0中引入的新类型,它允许其操作掠过编译器类型检查,而在运行时处理. 编程语言有时可以划分为静态类型化语言和动态类型化语言.C#和Java经常被认为是静态化类型的语言, ...
- 【Amadeus原创】查看正在运行的docker run参数
如何查看一个运行docker 容器的docker run启动参数,假设没有使用docker-compose这样的编排工具. 现在我如何进行重启,如何找回此前的启动命令? [root@mysql3 ~] ...
- 关于 Span 的一切:探索新的 .NET 明星: 1 Span<T> 是什么?
关于 Span 的一切:探索新的 .NET 明星 https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/january/csharp- ...
- Qt编写安防视频监控系统22-摄像机搜索
一.前言 摄像机搜索模块是后面新增加的,这个模块很有必要,一开始做视频监控系统的时候,那时候还没有研究出来一套纯Qt底层通信的onvif类,也就前几个月搞出来了,支持搜索设备信息和云台控制,所以马上加 ...
- OpenCV4.1.0与CUDAcuda_10.1.105联合进行图像特征点提取和特征匹配时,运行程序时错误提示:无法定位程序输入点?createBFMatchercv@DescriptorMatcher@cuda@cv......于动态链接库......
问题描述: OpenCV4.1.0与CUDAcuda_10.1.105联合进行图像特征点提取和特征匹配时,运行程序时错误提示:无法定位程序输入点?createBFMatchercv@Descripto ...
- [转]win10 vue-cli 下载成功,显示 vue不是内部或外部命令,也不是可运行的程序
vue不是内部或外部命令,也不是可运行的程序 1.安装vue-cli npm install -g @vue/cli 2.查看是否安装成功 vue -V 经过上述步骤,一般在CMD窗口输入" ...
- 移动端弱网优化专题(十四):携程APP移动网络优化实践(弱网识别篇)
本文由携程技术团队Aaron分享,原题"干货 | 携程弱网识别技术探索",下文进行了排版和内容优化. 1.引言 网络优化一直是移动互联网时代的热议话题,弱网识别作为移动端弱网优化的 ...
- IM开发者的零基础通信技术入门(十五):理解定位技术,一篇就够
[来源申明]本文引用了微信公众号"鲜枣课堂"的<老司机揭秘手机定位技术,这下彻底明白啦!>文章内容.为了更好的内容呈现,下文在引用和收录时内容有改动,转载时请注明原文来 ...
- 1. C++快速入门--变量和基本类型, 类别
文章使用obsidian编写, 双链部分可能失效 1 基本内置类型 1.1 算术类型 算术类型介绍 bool 类型 字符类型 整数类型 实数浮点.虚数浮点和 复数浮点 参看如下表 带符号和无符号类型的 ...
- 一个R包—reticulate—在R中调用Python
R语言和python语言是生信行业经常使用的两个计算机语言,R语言具有统计和画图方面的优势,但是R语言在文件读写上的速度实在不敢恭维:Python具有较快的文件读写功能,但是其统计和画图却不如R语言用 ...