STM32CubeMX 实战教程:SysTick 实验(LL 库)

1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取;
2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章;

博主分享不易,请给三连哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。

1 前言

1.1 STM32CubeMX

2.1_1.STM32CubeMX_20200803

点击图片进入 ST 官网 STM32CubeMX 介绍页面

1.2 教程介绍

    STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX
    本教程是 STM32CubeMX 实战教程中的第二篇,主要通过配置 SysTick 定时器实现 ms 级延时函数,将 STM32CubeMX SysTick 的配置方法讲述清楚。

1.3 准备工作

    系统版本:Windows 10 专业版 64 位
    软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程
    硬件平台:正点原子 STM32F1 精英板
    编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程
    调试工具:ST-LINK/V2

2 配置项目

2.1 项目导入

    将上一节的 GPIO_Test 的项目另存作为 SysTick_Test 的项目初始模板。
    工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
2.1_1

2.2 SysTick & NVIC 配置

  1. 点击 SYS,将 Timebase Source 选择为 SysTick;(项目默认为 SysTick)
    2.2_1
  2. 点击 NVIC,选择中断优先级分组为 4 bits for pre-emption Prionty,Systick 的优先级设置为 0,0;(项目默认为 4 bits for pre-emption Prionty;0,0)
    2.2_2
    关于优先级的先后顺序:0 > 1 > 2 > ··· > 15。
    上图默认开启的中断(默认勾选)可参看芯片参考手册 Interrupt and exception vectors,如查看 STM32F1xx 参考手册如下:
    2.2_2_1
  3. 勾选 Generate IRQ handler 生成中断服务函数,不勾选 Call HAL handler;(由于 SysTick Timer 默认不开启定时中断,勾选了也没有作用)
    2.2_3

2.3 Clock 配置

    SysTick Timer 的时钟默认是系统时钟(即 72MHz),这里我们使用 8 分频(即 72/8 = 9MHz)。
2.3_1

2.4 生成代码

    项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程STM32CubeMX 项目配置窗口介绍(一)STM32CubeMX 项目配置窗口介绍(二)
    点击 GENERATE CODE 生成代码。
2.4_1

3 代码测试

  1. 打开 MDK_ARM 工程;
    2.5_1
  2. main.c 文件 SystemClock_Config 函数中,有 SysTick Timer 的初始化;
    2.5_2
    进入其原函数查看源码,会发现 SysTick Timer 默认提供 1ms 中断或时基;
    2.5_3
    2.5_4
    值得注意的是:生成代码中默认是以 HCLK 时钟 为 SysTick 时钟源,以及默认不开启 SysTick VAL 向下计数器溢出中断(SysTick_Handler)。所以我们需要在初始化代码后重新配置一下 SysTick。
  3. 配置 SysTick Timer,在 SystemClock_Config(); 函数后的用户代码区域加入配置代码;
    2.5_5
        相关配置参数修改,可参考英文或中文《ARM Cotrex-M3权威指南》Chapter 8 - The NVIC and Interrupt Control - The SYSTICK Timer (Page 147)。
  4. while 循环中加入测试代码;
    2.5_6
    LL_mDelay 为 LL 库自带的 ms 级延时函数(需将 SysTick Timer 配置为提供 1ms 中断或时基)。如需更精确或更短的延时(us 级),可移植正点原子的延时函数(本教程的 SysTick 初始化可代替正点原子的初始化)。
    2.5_7
    main 函数代码如下:
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

  NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* System interrupt init*/

  /** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
  */
  LL_GPIO_AF_Remap_SWJ_NONJTRST();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk |  // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz)
                   SysTick_CTRL_TICKINT_Msk;  // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  LL_RCC_GetSystemClocksFreq(&get_rcc_clock);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		if(LL_GPIO_IsInputPinSet(KEY_UP_GPIO_Port, KEY_UP_Pin) == 1 )   // KEY_UP Press
		{
			LL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);                // Toggle BEEP Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);                // Toggle BEEP Pin Level  OFF 1800ms
			LL_mDelay(1800);
		}
		else
		{
			LL_GPIO_ResetOutputPin(BEEP_GPIO_Port, BEEP_Pin);           // BEEP OFF
		}
		
		if(LL_GPIO_IsInputPinSet(KEY0_GPIO_Port, KEY0_Pin) == 1 )       // KEY0 UnPress
		{
			LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin);               // DS0 OFF
		}
		else
		{
			LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin);                  // Toggle DS0 Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin);                  // Toggle DS0 Pin Level  OFF  200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin);                  // Toggle DS0 Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin);                  // Toggle DS0 Pin Level  OFF 1400ms
			LL_mDelay(1400);
		}
		
		if(LL_GPIO_IsInputPinSet(KEY1_GPIO_Port, KEY1_Pin) == 1 )       // KEY1 UnPress
		{
			LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin);               // DS1 OFF
		}
		else
		{
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  OFF  200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  OFF  200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  ON   200ms
			LL_mDelay(200);
			LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);                  // Toggle DS1 Pin Level  OFF 1000ms
			LL_mDelay(1000);
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  1. 编译工程;
    2.5_8
  2. 使用 ST-LINK/V2 下载程序,按下复位按键,若按照下面操作看到正常现象,则说明程序正常运行,SysTick 配置成功。
Steps操作正常现象备注
1按下 KEY_UP 按键,不放蜂鸣器 2s 响 1 次-
2按下 KEY0 按键,不放DS0 LED 2s 亮 2 次-
3按下 KEY1 按键,不放DS1 LED 2s 亮 3 次-

    可使用示波器测试相关引脚输出波形,检测定时器配置是否正常。

4 结束

    本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。
    此教程由本人独立整理,如有不当之处,欢迎指正。

附录 相关教程

    STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总
    该文章还提供:

  • STM32Cube 生态系统相关文章
  • STM32Cube 生态系统相关软件更新介绍
  • STM32Cube 生态系统相关教程汇总
  • STM32Cube 生态系统相关网站汇总
  • 该文章会不定期修改更新,更多信息请进入文章查看
  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32CubeMX是一款用于STM32微控制器的图形化配置工具,可以帮助开发人员快速生成初始化代码。而SysTickSTM32微控制器中的一个系统定时器,可以用于生成定时中断。在STM32CubeMX中,可以通过简单的配置来启用和配置SysTick定时器。 ### 回答2: STM32CubeMX是一种可视化的集成开发环境,可用于快速配置和生成基于STM32微控制器的嵌入式应用程序。STM32CubeMX集成了许多外设、中间件和示例代码,帮助您快速启动STM32微控制器并加快您的开发速度。 SysTick是一种系统定时器,是ARM Cortex-M系列微控制器中一个内置的计数器。它可用于生成定时器中断,通常用于多任务处理中的时间同步等任务。 在STM32CubeMX中,您可以使用SysTick来生成定时器中断。步骤如下: 1. 打开STM32CubeMX,并创建新项目。 2. 选择所需的STM32微控制器,并添加所需的外设。 3. 在左侧菜单中,选择"System Core",然后选择"NVIC"。 4. 向下滚动至"System Tick Timer",并启用SysTick。 5. 设置SysTick的时钟源、时钟分频和计数器重载值。 6. 生成代码,并将生成的SysTick中断函数与您的应用程序集成。 SysTick具有许多应用场景,例如: 1. 系统心跳检测,可以定期触发中断以确保系统正常运行。 2. 时间同步,可以将SysTick的间隔设置为1ms,从而使各个任务以1ms的间隔执行。 3. 调用函数延迟,可以在中断中计时,并在计时结束后调用函数。 总之,SysTickSTM32微控制器中一个强大的工具,可帮助您在嵌入式应用程序中实现时间同步、系统心跳检测等任务。若您想了解更多有关STM32CubeMXSysTick的详细信息,建议您查阅ST官方文档或参考相关开发手册。 ### 回答3: stm32cubemx systick是指stm32系列的时钟系统。在开发嵌入式系统的过程中,需要一个系统定时器来进行时间维护,即定时器中断。而stm32cubemx systick定时器是一种计时精度高、使用简便的系统定时器,采用内部时钟源,可用于生成时间基准中断、延时、循环定时等。 stm32cubemx systick具有以下特点: 1.可编程精度 可根据需要编程不同的中断周期,提供灵活的定时服务,最小可编程1us。 2. 时间易操作 只需对寄存器进行简单编程即可实现时间基准间隔的自动定时中断。 3.易移植性 stm32cubemx systickSTM32CubeMX引脚、时钟配置主界面,用户可以非常方便地为目标芯片初步配置该定时器,并在向下适配到具体应用时迅速完成端口的配置操作,简化了用户的开发流程。 4. 固件、bsp软件支持 各种主流的芯片的固件和BSP软件,都支持systick定时器的使用,用户可以快速访问芯片空间的硬件资源,方便地进行开发。 总之,stm32cubemx systick是一种有效的、简便易用的嵌入式系统时钟定时器,开发者可以充分利用定时器进行控制程序的计时、严谨性、可靠性要求高的嵌入式应用等程序,提高软件开发的工作效率,快速实现各类嵌入式系统的控制任务。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值