STM32H743-ARM例程3-SYSTICK定时闪烁LED

目录

实验平台

硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器

软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35

时钟系统简介

(1)STM32时钟源分以下五类:

  内部高速时钟(HSI):RC振荡器,精度不高。

  外部高速时钟(HSE):可接石英/陶瓷谐振器或者接外部时钟源。

  内部低速时钟(LSI):RC振荡器,提供低功耗时钟。应用如WDG。

  外部低速时钟(LSE):接外部低频率石英晶体。应用如RTC。

  锁相环倍环输出(PLL):其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频倍数

  可调,但是其最大输出频率受限数值因芯片型号而异。

(2)系统时钟SYSCLK可来源于:HSI振荡器时钟、HSE振荡器时钟、PLL时钟。

SYSTICK简介

  在STM32中,SysTick是内核CM7中的一个24位的递减计数器,也称系统嘀答定时器。SysTick的最大使命,就是定期地产生异常请求,作为系统的时基。操作系统需要这种"滴答"来推动任务和时间的管理。

vSysTick在设定初值并开启后,每经一个系统时钟周期,计数值减1,计数到0时,将从重载寄存器中自动重新装载定时初值并继续计数,同时内部的COUNTFLAG标志位置1,触发中断(中断允许情况下),中断响应属于NVIC异常,异常号为15,Systick中断优先级可设置。

SYTICK寄存器控制

  SysTick定时器有4个寄存器,分别为:

    SYST_CSR SysTick控制及状态寄存器

     SYST_RVR SysTick重装载值寄存器

    SYST_CVR SysTick当前数值寄存器

    SYST_CALIB SysTick校准数值寄存器

  在使用SysTick产生定时的时候,只需要配置CTRL、LOAD、VAL三个寄存器,CALIB校准寄存器不需要配置(出厂时已校准好),寄存器介绍如下:

(1)SYST_CSR控制及状态寄存器

位段 名称 复位值 描述
16 COUNTFLAG 0 如果计时器从上次读取后计数到0,则该位返回1
2 CLKSOURCE 0 时钟源选择位:0 = AHB/8,1 = 处理器时钟AHB
1 TICKINT 0 启用SysTick异常请求:0 = 计时器数到0时没有异常请求。1 = 计时器数到0时产生SysTick异常请求。通过读取COUNTFLAG位可以确定计数器是否递减到0
0 ENABLE 0 SysTick定时器的使能位

(2)SYST_RVR重装载值寄存器

位段 名称 复位值 描述
23:0 RELOAD 0 当倒数计数到0时,加载到SYST_CVR寄存器的值

  RELOAD值可以是0x00000001 - 0x00FFFFFF范围内的任何值。起始值可以为0,但是没有效果,因为SysTick异常请求和COUNTFLAG在从1到0计数时才被激活。重新装载值是根据其使用情况计算的。例如,要生成周期为N个处理器时钟周期的多次触发定时器,可以配置RELOAD值为N-1。如果每100个时钟脉冲需要SysTick中断,则将RELOAD设置为99。

(3)SYST_CVR当前数值寄存器

位段 名称 复位值 描述
23:0 CURRENT 0 读取返回SysTick计数器的当前值。向寄存器写入任何值时都会将该字段清除为0,并将SYST_CSR的COUNTFLAG位清除为0。

(4)SYST_CALIB参考时钟校准值寄存器

位段 名称 复位值 描述
31 NOREF - 1=没有外部参考时钟 (STCLK 不 可 用 ),0=外部参考时钟可用
30 SKEW - 1=校准值不是准确的10ms,0=校准值是准确的10ms
23:0 TENMS 0 10ms的时间内倒计数的格数。 通过Cortex-M7输入信号提供该数值,若该值读回零 ,则表示无法使用校准功能

  校准值寄存器用于提供系统时钟的校准值,帮助软件程序计算精确的时间间隔。该寄存器主要包含出厂校准值,用于指示 SysTick 计时器每 10ms 需要多少个时钟周期。

实验程序

1. 主函数

c 复制代码
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    while (1)
    {

    }
}

2. SYSTICK初始化

c 复制代码
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
    if((uint32_t)uwTickFreq == 0UL)
    {
        return HAL_ERROR;
    }
    if (HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) > 0U)
    {
        return HAL_ERROR;
    }
    //配置滴答定时器中断优先级
    if (TickPriority < (1UL << __NVIC_PRIO_BITS))
    {
        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
        uwTickPrio = TickPriority;
    }
    else
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}

3. SYSTICK中断服务函数

以下是系统滴答定时器中断服务函数,主要实现定时1s,改变一次LED显色状态。

c 复制代码
void SysTick_Handler(void)
{
    static uint32_t counter = 0;
    HAL_IncTick();
    // 每1000毫秒(1秒)改变LED状态
    if (counter++ % 1000 == 0)  //经历1000个中断周期,1ms中断一次
    {
        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_3); // 改变LED引脚的状态
    }
}

实验现象

每隔一秒,LED灯亮灭状态交替一次。

相关推荐
赵谨言3 小时前
多语种在线语言学习平台LinguaVerse的设计与实现毕业论文
学习
東隅已逝,桑榆非晚3 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
何粥学4 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
li星野4 小时前
Regular and Irregular Nouns — One-Page A4 Notes
学习
Sakura_j_h_4 小时前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
AllData公司负责人5 小时前
AllData 可定义数据中台完成信创适配|银河麒麟 + 海光X86 CPU / 华为鲲鹏ARM CPU+ OceanBase / 人大金仓国产化环境部署落地
大数据·arm开发·数据库·人工智能·oceanbase·kingbase
Z21-X5 小时前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云
HANDY092006 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式8 小时前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎17 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机