在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]