STM32F103学习笔记——SysTick

在STM32F103中,Systick定时时间的设定可以按照如下方式进行:

1、重装载值=systick 时钟频率(Hz) x 想要的定时时间(S)
如:时钟频率为:AHB的8分频;AHB=72MHz那么systick的时钟频率为72/8MHz=9MHz;
要定时1秒,则重装载值=9000000X1=9000000;
要定时10毫秒,重状态值=9000000X0.01=90000。

2、Systick的中断处理函数
根据需要直接编写中断处理函数即可:
Void SysTick_Handler (void) { ;}

3、注意
如果在工程中,加入了stm32f10x_it.c,而又在主函数中编写中断函数,则会报错。

根据网络资源,可以得到如下的函数例子:

#include "stm32f10x.h"
void GPIO_Configuration(void);  //设置GPIOA.8端口
u32 t;                          //定义一个全局变量
int main(void)
{
    int numLoad, numCLK, numFout = 2;

    //numCLK  = 72000000;               //不分频;
    numCLK  = 9000000;                  // 分频——8分频
    numLoad = numCLK / 2 / numFout;     //numFout是输出波形频率

    SysTick_Config(numLoad);
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //时钟分频——8
    //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);      //使用核心时钟

    GPIO_Configuration();
    while(1);      
}

//GPIOA.8设置函数
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;//定义一个端口初始化结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//打开GPIOE口时钟
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//设置输出频率50M
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;//指定第8脚
    GPIO_Init(GPIOE,&GPIO_InitStruct);//初始化 PE.05 和 PE.06     
    GPIO_SetBits( GPIOE,  GPIO_Pin_5);//置高PE.05,关闭LED
}

//systick中断函数
void SysTick_Handler(void)
{
    t++;
    if(t>=1)
    {
        if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5)==1)
        {
            GPIO_ResetBits( GPIOE, GPIO_Pin_5);
            GPIO_SetBits( GPIOE, GPIO_Pin_6);
        }
    }
    if(t>=2)
    {
        if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5)==0)
        {   
            GPIO_SetBits( GPIOE, GPIO_Pin_5);
            GPIO_ResetBits( GPIOE, GPIO_Pin_6);
        }
        t=0;
    }
}

以下总结话语,来自网络文章的综合:

1、要使用systick定时器,只需调用 SysTick_Config(uint32_t ticks) 函数即可,
自动完成了,重装载值的装载,时钟源选择,计数寄存器复位,中断优先级的设置(最低),开中断,开始计数的工作。
2、要修改时钟源调用 SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)。
3、要修改中断优先级调用 void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

还有几个问题,需要说明:
1、因systick是一个24位的定时器,故重装值最大值为2的24次方=16 777 215,不要超出这个值。
2、systick是cortex_m3的标配,不是外设。故不需要在RCC寄存器组打开他的时钟。
3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。
4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法

此笔记。[2016-07-01]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值