搜索
bottom↓
回复: 17

用stm32固件库3.4编写Systick

[复制链接]

出0入0汤圆

发表于 2011-4-29 18:53:14 | 显示全部楼层 |阅读模式
大伙们,我最近在学习stm32,想用固件库3.4编写一个systick,查了好多资料还是没有搞清楚,特意向大家请教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-4-29 20:28:11 | 显示全部楼层
在3.4库里面,只需要调用SysTick_Config函数就可以初始化systick了,下面的例子是产生10ms中断,中断函数在stm32f10x_it.c里的SysTick_Handler。想产生1ms就把100改成1000

int main(void)
{
          /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */
          if(SysTick_Config(SystemCoreClock / 100))   
          {
                while(1);
          }
      while(1);
}

出0入0汤圆

 楼主| 发表于 2011-5-1 11:11:44 | 显示全部楼层
顶你,谢谢,不知道中断里面应该些什么?

出0入0汤圆

发表于 2011-5-6 15:24:19 | 显示全部楼层
你只要看一下《Cortex-M3权威指南》中寄存器的格式就可以直接操作了(如下为查询标志位的方法来延时)
配置Systick的寄存器
void SystickInit(void)
{
    SysTick->CTRL&=0xfffffff8;        //设置时钟源  停止计数
    SysTick->LOAD=9000000-1;         //设置计数值>装载寄存器
    SysTick->VAL=0x00;                  //清空当前计数值
    SysTick->CTRL|=0xfffffff9;         //启动定时器,未使用中断,使用中断用0xfffb
}
在main函数中使用了
if(SysTick->CTRL&0X10000)
    i++;
if(i==3)                             //可以延时三秒
{
     i=0;
     GPIOE->ODR=~GPIOE->ODR;       
}

重点还在于你去看寄存器

出0入0汤圆

发表于 2011-5-7 00:39:56 | 显示全部楼层
上面两位说的对,3.4.0库里面SysTick关键函数就是SysTick_Config(),SystemCoreClock = 72 000 000 Hz,实际上SysTick_Config()的参数就是计数重装初值,(SystemCoreClock / 1000)这个参数是计时1ms所需要的计数初值,也就是72000。计满72000也就是1ms就进入中断,等待这样的1000次中断之后,灯开始亮和灭。(点灯为例,便于说明问题,精确的1s延时交替亮灭。最重要是动手写,说出来用处不大,下面的代码可以作为工程代码烧到板子上调试。)
/*
**File:main.h
*/
#ifdef __main_h
#define __main_h

#include "stm32f10x.h"

void TimingDelayDecrement(void);

#endif

/*
**File:main.c
*/
#include "main.h"

#define __IO uint32_t nTime;

void Delay( __IO uint_t nTime );
void RCC_Configuration(void);
void GPIO_Configuration(void);

int main(void)
{
        SystemInit();
        RCC_Configuration();
        GPIO_Configuration();
        SysTick_Config( SystemCoreClock / 1000 );

        if( SysTick_Config( SystemCoreClock / 1000 ))
        {
                while(1);
        }

        while (1)
        {
                  GPIO_ResetBits( GPIOB, GPIO_Pin_12 );
                Delay( 1000 );
                GPIO_SetBits( GPIOB, GPIO_Pin_12 );
                Delay( 1000 );
          }
}

void Delay( __IO uint32_t nTime )
{
        TimingDelay = nTime;
        while( TimingDelay !=0 );
}

void TimingDelay_Decrement(void)
{
        if( TimingDelay != 0x00 )
        {
                TimingDelay--;
        }
}

void RCC_Configuration(void)
{
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
}

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init( GPIOB, &GPIO_InitStructure );
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{

  while (1)
  {
  }
}
#endif

/*
**File:stm32f10x_it.c
*/
#include "main.h"
#include "stm32f10x_it.h"

void SysTick_Handler(void)
{
        TimingDelay_Decrement();
}

出0入0汤圆

发表于 2011-6-6 10:25:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-8 12:34:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-8 13:39:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 19:24:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-28 17:44:54 | 显示全部楼层
我这样设置:SysTick_Config(SystemCoreClock / 100),为1ms中断;改为SysTick_Config(72000000 / 100)后,为10ms中断。
但是测得MCO为72MHz,用的库是V3.3.0。不知道问题出在哪里。

出0入0汤圆

发表于 2011-7-11 19:46:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-12 20:25:45 | 显示全部楼层
void SYSTICK_Configuration(void)
   {
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//系统64MHz/8=8M
        SysTick_SetReload(8000);         //  8000/8M--1ms
        SysTick_ITConfig(ENABLE);
        SysTick_CounterCmd(SysTick_Counter_Enable);       
   }

在stm32f10x_it.c中找到下面函数,设个变量“systickflage ”,硬件计时1ms后,中断进入下面函数,执行systickflage =1,我们在主函数中判断
if(systickflage ==1)
{
systickflage =0;
........
}
接下来就可以累加到我们需要的定时了!

/*******************************************************************************
* Function Name  : SysTickHandler
* Description    : This function handles SysTick Handler.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SysTickHandler(void)
{
systickflage = 1;
}

出0入0汤圆

发表于 2012-7-6 10:23:24 | 显示全部楼层
受教了。多谢

出0入0汤圆

发表于 2012-7-6 18:13:20 | 显示全部楼层
不需要固件库,只用CMSIS就可以了吧?

出0入0汤圆

发表于 2012-7-6 18:15:08 | 显示全部楼层
yangwc 发表于 2011-6-28 17:44
我这样设置:SysTick_Config(SystemCoreClock / 100),为1ms中断;改为SysTick_Config(72000000 / 100)后 ...

那就是你那个SystemCoreClock不对...

出0入0汤圆

发表于 2019-5-19 11:31:59 | 显示全部楼层
本帖最后由 cnxh 于 2019-5-19 11:33 编辑

我刚刚调试完的已可用,初始化后引用 SysTick_Configuration();就可以了,stm32f10x_it.c中已定义SysTick_Handler();重写需要注释掉
//配置systick寄存器:
void SysTick_Configuration(void)
{
    SysTick_Config(SystemCoreClock/1000);       //SystemCoreClock是系统频率,重装载寄存器,中断一次1mS
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;     //Systick中断使能位
}

//中断处理:
void SysTick_Handler(void) //中断函数
{
    SysTick_Int = 1;        //系统时钟中断到标志
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 20:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表