历史上的今天
返回首页

历史上的今天

今天是:2025年05月25日(星期日)

正在发生

2019年05月25日 | STM32F429之SysTick系统定时器

2019-05-25 来源:eefocus

因为 SysTick 属于内核外设,跟普通外设的中断优先级有些区别,并没有抢占优先级和子优先级的说法。滴答定时器优先级也是可以设置的同样受NVIC控制。


SysTick_Config()库函数主要配置了 SysTick 中的三个寄存器: LOAD、 VAL 和 CTRL。其中还调用了固件库函数 NVIC_SetPriority()来配置系统定时器的中断优先级,该库函数也在 core_m4.h 中定义


试试到底需要配置不


试试到底需要配置不//记得需要设置中断优先级


static void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* 配置 NVIC 为优先级组 1 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/* 配置中断源:按键 1 */

NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;

/* 配置抢占优先级: 1 */

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

/* 配置子优先级: 1 */

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

/* 使能中断通道 */

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

 

 

// 设置系统定时器中断优先级

 //NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);

SysTick 初始化函数

 


/**

* @brief 启动系统滴答定时器 SysTick

* @param 无

* @retval 无

*/

void SysTick_Init(void)

{

    /* SystemFrequency / 1000 1ms 中断一次

    * SystemFrequency / 100000 10us 中断一次

    * SystemFrequency / 1000000 1us 中断一次

    */

    if (SysTick_Config(SystemCoreClock / 100000)) {

    /* Capture error */

    while (1);

    }

}

/**

* @brief 获取节拍程序

* @param 无

* @retval 无

* @attention 在 SysTick 中断函数 SysTick_Handler()调用

*/

void TimingDelay_Decrement(void)

{

if (TimingDelay != 0x00) {

TimingDelay--;

}

}

TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时的时间等于 100000*10us=1s

 


/**

* @brief us 延时程序,10us 为一个单位

* @param

* @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us

* @retval 无

*/

void Delay_us(__IO u32 nTime)

{

    TimingDelay = nTime;

    while (TimingDelay != 0);

}

函数 Delay_us()中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时间到。变量 TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间TimingDelay 递减一次

 


SysTick 中断时间的计算


SysTick 定时器的计数器是向下递减计数的,计数一次的时间 TDEC=1/CLKAHB,当重装载寄存器中的值 VALUELOAD 减到 0 的时候, 产生中断,可知中断一次的时间TINT=VALUELOAD * TDEC 中断= VALUELOAD/CLKAHB,其中 CLKAHB =180MHZ。如果设置为180,那中断一次的时间 TINT=180/180M=1us。不过 1us 的中断没啥意义,整个程序的重心都花在进出中断上了,根本没有时间处理其他的任务


SysTick_Config()配置为 SystemCoreClock / 100000=180M/100000=1800,从分析知道这个形参的值最终是写到重装载寄存器 LOAD 中的,从而可知现在把 SysTick 定时器中断一次的时间 TINT=1800/180M=10us


SysTick 中断服务函数

void SysTick_Handler(void)

{

TimingDelay_Decrement();

}



推荐阅读

史海拾趣

Fortiming Corporation公司的发展小趣事

背景:随着电子技术的快速发展,客户对频率控制产品的要求越来越高。

发展:Fortiming不断投入研发资源,进行技术创新和产品升级。公司成功开发出了一系列高精度、高稳定性的晶振产品,满足了市场对高品质频率控制产品的需求。同时,Fortiming还积极探索新的应用领域,如通信、汽车电子、物联网等,不断拓展市场边界。

Genisco Electronics公司的发展小趣事
根据负载的重要性和供电要求,合理设计互投电路,包括选择合适的切换方式(如先断后合、先合后断等)、设置合适的切换时间和延时等。
Broadcom(博通)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

中环(Central)公司的发展小趣事

随着公司业务的不断拓展,中环在保持主业优势的同时,也积极开展多元化发展。2014年,公司开始开展光伏电站开发业务,进一步延伸了产业链。同时,公司还成立了东方环晟,开拓了组件业务。这些举措不仅为公司带来了新的增长点,也增强了其综合竞争力。

FTDI公司的发展小趣事

近年来,中环公司经历了混合所有制改革。2020年7月,TCL科技集团成为公司控股股东。这一改革不仅为公司带来了新的发展机遇和资源支持,也为其未来的发展注入了新的活力。在TCL科技的助力下,中环公司进一步聚焦主业,加速技术创新和产业升级,致力于成为光伏领域的领军企业。

以上五个故事涵盖了中环公司在电子行业里发展起来的不同阶段和方面。通过不断创新和拓展业务,中环公司在保持主业优势的同时,也实现了多元化发展,为其未来的发展奠定了坚实的基础。

EOZ Secme公司的发展小趣事

EOZ Secme深知人才是企业发展的核心动力。因此,公司高度重视人才的培养和引进。通过设立研发中心、提供优厚的福利待遇等方式,EOZ Secme吸引了大量优秀人才加入。同时,公司还建立了完善的培训体系,不断提升员工的技能和素质。这些措施为EOZ Secme的持续发展提供了有力的人才保障。

问答坊 | AI 解惑

SIM卡座PCB封装(抽屉式和推拉式)

SIM卡座PCB封装(抽屉式和推拉式)…

查看全部问答>

关于LED电源驱动芯片

大家懂电源的朋友可以关心一下的,现最好的驱动电源使用哪种芯片,推荐一下!…

查看全部问答>

GPRS MODEM 电路原理图.

GPRS MODEM 电路原理图.…

查看全部问答>

有害气体环境中的使用

本人 DIY各类数字湿度传感器在有害气体环境中的使用,其使用和寿命如何,对sh21的性能还无数据…

查看全部问答>

NorFlash应用问题(39VF1601型号)

1)NorFlash可供使用的地址空间应该从0x0000开始吧。那么为什么在手册中在说明ID读取时,如下:manufacturer\'s ID   0000H(address)   00BFH(data) ; Device ID   0001H(address)  2782H(data) 。感到不 ...…

查看全部问答>

我的6410裸奔和使用wince6.0哪个难度大?

我的系统主要是对来自camera接口的数据进行图像处理,并通过USB OTG口(作为device使用)上传给PC机。不需要运行其它进程。 硬件选用s3c6410。经过在s3c2442的PDA上跑图像处理测试代码,时间比较紧张,主要瓶颈在存储器访问上。因此我们打算给6410 ...…

查看全部问答>

单片机驱动H桥电路。。。。知者请 进!

我想 直接用单片机控制H桥电路,不 知道可不可以?…

查看全部问答>

各位达人,请教一个lwip的消息的类型的问题?

enum tcpip_msg_type { #if LWIP_NETCONN   TCPIP_MSG_API, #endif /* LWIP_NETCONN */   TCPIP_MSG_INPKT, #if LWIP_NETIF_API   TCPIP_MSG_NETIFAPI, #endif /* LWIP_NETIF_API */   TCPIP_MSG_ ...…

查看全部问答>

IAR4.2能修改缩进吗?

最近用IAR4.2开发ST,发现它默认的缩进只有两个空格,像 if(a) { ? ?b; } 不知道能不能修改成默认有更多空格,比如四个,像 if(a) { ? ? ? ? b; } 求教!…

查看全部问答>