系统滴答定时器SysTick 中断程序 中断用法

2019-08-20 15:51发布

原子哥的系统滴答定时器SysTick 是用来做延时用的。可是有很多时候我们的定时器用完了,就有需要用要SysTick 来做定时器做中断。下面给大伙程序,这里初始化完,每过设定时间4ms(/时间加载)中设定)  就会进入一次中断,结合原子哥的延时程序一看就明

SysTick_init(u8 SYSCLK)
{  u16 fac_us,fac_ms;
    SysTick->CTRL&=0xfffffffb;    //bit2清空,选择外部时钟  HCLK/8
   fac_us=SYSCLK/8;     
   fac_ms=(u16)fac_us*1000;    SysTick->LOAD=(u32)4*fac_ms;    //时间加载(SysTick->LOAD为24bit)
   SysTick->VAL =0x00;                    //清空计数器
   SysTick->CTRL |=(1<<0 |1<<1);    //开始倒数    
    /* Function successful */
} void SysTick_Handler()  //4ms中断
{     /* 在这里写上你要的中断程序,比如LED反复点亮之类的*/
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
Admin
1楼-- · 2019-08-22 05:05
[mw_shl_code=c,true]static __IO uint32_t TimingDelay; void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { … if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms { while (1); } while(1) { … Delay(200);//2ms … } } [/mw_shl_code]
正点原子
2楼-- · 2019-08-22 09:39
回复【13楼】逍遥winter:
---------------------------------
读CTRL,可以清除中断标志
zoyee.l
3楼-- · 2019-08-22 12:59
回复【14楼】Admin:
---------------------------------
你好,我用的是3.5的库,为什么完全参照你这个程序去点亮一个灯闪灭不行?
[mw_shl_code=c,true] #include "stm32f10x.h" unsigned int TimingDelay; void Delay(unsigned int x) { TimingDelay=x; while(TimingDelay!=0); } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { SystemInit();//配置系统时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能APB2外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);//IO口使能设置 GPIO_InitTypeDef GPIO_InitStructure; //定义I/O口结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_ResetBits(GPIOC, GPIO_Pin_6); if (SysTick_Config(72000000 / 100)) //每10ms中断一次 { /* Capture error */ while (1); } while(1) { GPIO_SetBits(GPIOC, GPIO_Pin_6); Delay(100); //100*10ms=1s GPIO_ResetBits(GPIOC, GPIO_Pin_6); Delay(100); //100*10ms=1s } } [/mw_shl_code]
冷暖自知
4楼-- · 2019-08-22 17:31
楼主在吗,为什么用寄存器的程序时,会有一个错误,初始化的错误
逆鳞
5楼-- · 2019-08-22 22:33
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-08-23 03:35
回复【18楼】逆鳞:
---------------------------------
默认是最低的,最高的貌似库函数有一个systick中断优先级配置的函数,你百度一下吧.

一周热门 更多>