R1 STM32的系统定时器SysTick笔记

news/2024/6/3 17:10:07 标签: Systick, stm32, 函数

stm32的系统定时器systick笔记">STM32的系统定时器SysTick笔记

时钟计算公式

t定时时间
ticks多少时钟周期中断一次
f时钟频率 72Mhz=72000000

t=Ticks * 1/f = (72000000/100000) * (1/72000000) = 10us

函数">初始化函数

void SysTick_Init(void)
{
    /* SystemFrequency / 1000    1ms中断一次
     * SystemFrequency / 100000  10us中断一次
     * SystemFrequency / 1000000 1us中断一次
     */
//  if (SysTick_Config(SystemFrequency / 100000))   // ST3.0库版本 SystemFrequency 72MHZ
    if (SysTick_Config(SystemCoreClock / 100000))   // ST3.5库版本
    { 
        /* Capture error */ 
        while (1);
    }
        // 关闭滴答定时器
    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

延时程序运行时,ticks的值放入LOAD,LOAD再放入VAL:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);  //时钟用的是24Mhz,如果ticks的值大于224次方,会报错,跳出函数         
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;   //将 ticks放入重装载寄存器
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  //设置SysTick_IRQn的优先级,1左移四位
  SysTick->VAL   = 0; //VAL计数器设置为0                                        
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | //时钟来源
                   SysTick_CTRL_TICKINT_Msk   | //开中断
                   SysTick_CTRL_ENABLE_Msk;     //使能寄存器             
  return (0);                                                  
}

函数">Delay_us函数

nTime为10000时,TimingDelay为10000,打开时钟后,一直停在while(TimingDelay != 0);

void Delay_us(__IO u32 nTime)
{ 
    TimingDelay = nTime;    

    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;//打开时钟

    while(TimingDelay != 0);
}

stm32f10x_it.c中,中断服务函数

void SysTick_Handler(void)
{
    TimingDelay_Decrement();    
}

TimingDelay不为0,一直减减:

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

函数">主函数

int main(void)
{   
    SysTick_Init();
    for(;;)
    { 
        Delay_us(100000);       // 100000 * 10us = 1000ms
    }       
}

注:

  • stm32f10x_it.c中使用外部关键字TimingDelay,要声明extern void TimingDelay_Decrement(void);
  • bsp_SysTick.c里也要声明 static __IO u32 TimingDelay;
  • volatile const 的用法

http://www.niftyadmin.cn/n/1644300.html

相关文章

R3 STM32高级定时器笔记-TIM

STM32高级定时器笔记-TIM 高级定时器功能 1-计数器16bit&#xff0c;上/下/两边 计数&#xff0c;TIM1和TIM8&#xff0c;还有一个重复计数器RCR&#xff0c;独有。 2-有4个GPIO&#xff0c;其中通道1~3还有互补输出GPIO 3-时钟来自PCLK2&#xff0c;为72M&#xff0c;可实…

R5 STM32 CAN总线协议-1物理层协议层

STM32 CAN总线-1 CAN是控制器局域网络(Controller Area Network)的简称。 具有的高可靠性和良好的错误检测能力。为半双工。 目录 STM32 CAN总线-1目录CAN 物理层1 闭环总线网络2 开环总线网络3 通讯节点4 差分信号5 CAN协议中的差分信号 CAN 协议层1 CAN的波特率及位同步1…

硬件第二节 MOS管电路工作原理及详解

文章目录一&#xff0c;MOS管画法辨认1.1 辨认MOS管二&#xff0c;MOS管使用2.1 作为开关管2.1.1 导通条件2.1.2实例三&#xff0c;如何选择MOS管3.1 MOS管需要注意的几个参数3.1.1 选择PMOS还是NMOS3.1.2 电压&#xff1a;漏源极电压Vds&#xff0c;栅源极电压Vgs&#xff0c;…

R7 STM32 时钟总结

时钟总结 在STM32中&#xff0c;有五个时钟源&#xff0c;为HSI、HSE、LSI、LSE、PLL。来源 ①、HSI是高速内部时钟&#xff0c;RC振荡器&#xff0c;频率为8MHz。 ②、HSE是高速外部时钟&#xff0c;可接石英/陶瓷谐振器&#xff0c;或者接外部时钟源&#xff0c;频率范围为…

R8 STM32 SPI—读写串行 FLASH

SPI—读写串行 FLASH SPI 协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间&#xff0c;要求通讯速率较高的场合。 目录&#xff1a; SPI读写串行 FLASHSPI物理层协议层STM32的 SPI外设简介 SPI物理层…

R9 STM32之ADC—电压采集

STM32之ADC—电压采集 简介 STM32f103 系列有 3 个 ADC&#xff0c;精度为 12 位&#xff0c;每个 ADC 最多有 16 个外部通道。其中 ADC1 和 ADC2 都有 16个外部通道&#xff0c;ADC3根据 CPU 引脚的不同通道数也不同&#xff0c;一般都有 8 个外部通道。 目录 STM32之ADC…

硬件第一节 三级管电路工作原理及详解

文章目录一&#xff0c;三极管辨认1.1 辨认bce边1.2 三极管工作状态1.2.1放大状态1.2.2 截止状态1.2.3 饱和状态二&#xff0c;三极管使用2.1 三极管作为开关管三&#xff0c;三极管选型3.1 参数3.2 常用三极管参数整理一&#xff0c;三极管辨认 1.1 辨认bce边 e级&#xff1…

利用小区号和基站号可以做简单的GSM定位

利用小区号和基站号可以做简单的GSM定位 利用小区号和基站号可以做简单的GSM定位&#xff0c;下面给出一个取得小区号和基站号的方法。 首先依然是打开AT指令端口。 要取得小区号和基站号&#xff0c;需要首先让手机输出这两个号码&#xff0c;方法是利用设置命令”ATCREG2”…