ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cubemx实现定时器中断

2021-06-08 16:57:00  阅读:256  来源: 互联网

标签:__ 定时器 HAL Pin 中断 APB2ENR cubemx GPIO RCC


软件:

STM32CubeMX V4.25.0  

System Workbench V2.4

固件库版本:

STM32Cube FW_F1 V1.6.1

硬件:

OneNet 麒麟座V2.3

在STM32CubeMX中新建项目,选择正确的MCU型号

 

首先设置RCC和SYS,如下图

 

启用TIM1,选择内部时钟源(Internal Clock)。

 

然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图

GPIO设置 PC7和 PC10为GPIO_OUTPUT, (这是麒麟座V2.3的四个LED管脚其中的两个)

设置其中一个默认为高电平,另一个默认为低电平,User Label分别是LED1和LED4。

设置TIM1,启用中断

由于TIM1是挂在APB2总线上(如何判断当前计时器在哪个总线,文章最后会描述方法),查看时钟树我们知道APB2当前频率为72MHz,我们希望每秒钟发生2次中断,就把预分频系数设置为36000-1,自动重载值为1000-1,得到的计时器更新中断频率即为72,000,000/36000/1000=2Hz。

Project - setting ,ToolChain/IDE选择 SW4STM32

勾选这里

保存以后,点击任务栏的生成代码图标

生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目,然后展开项目树,双击编辑main.c,在while(1)之前启用TIM1并使能其中断


 
  1. /* USER CODE BEGIN 2 */
  2. HAL_TIM_Base_Start_IT(&htim1);
  3. /* USER CODE END 2 */

然后添加如下代码(注意此回调函数默认是__weak定义的,所以我们在这里需要重新定义一下,而且此回调函数是所有定时器共用的,所以我们需要先通过if (htim->Instance == htim1.Instance)判断它是哪个定时器中断在调用)

 

/* USER CODE BEGIN 4 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

    if (htim->Instance == htim1.Instance)

    {

        /* Toggle LED */

    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);

    HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin);

    }

}

/* USER CODE END 4 */

 

 

然后右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。

然后任务栏上点击Run图,当然会报错的,原因请查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右键点击  项目名Run.cfg ,给它改个名字,

 

然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:

然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:

然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:

source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]

reset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none 

然后再Run一下,就可以了。

程序的作用是让LED1和LED4交替闪烁,每0.5秒进行一次交替(2Hz)。

如前文所述,我们如何知道TIM1是连接到APB2上的呢?我们可以查代码,打开main.c

看到

static void MX_GPIO_Init(void);
 

右键点击 MX_GPIO_Init(void),选择菜单的“Open Declaration”,然后跳转到它的定义


 
  1. static void MX_GPIO_Init(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. /* GPIO Ports Clock Enable */
  5. __HAL_RCC_GPIOD_CLK_ENABLE();
  6. __HAL_RCC_GPIOC_CLK_ENABLE();
  7. __HAL_RCC_GPIOA_CLK_ENABLE();
  8. /*Configure GPIO pin Output Level */
  9. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
  10. /*Configure GPIO pin Output Level */
  11. HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
  12. /*Configure GPIO pins : LED1_Pin LED4_Pin */
  13. GPIO_InitStruct.Pin = LED1_Pin|LED4_Pin;
  14. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  15. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  16. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  17. }

在HAL_RCC_GPIOD_CLK_ENABLE( )上面点击右键,选择菜单的“Open Declaration”。会跳转到 stm32f1xx_hal_rcc.h文件,里面代码如下:


 
  1. #define __HAL_RCC_GPIOD_CLK_ENABLE() do { \
  2. __IO uint32_t tmpreg; \
  3. SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\
  4. /* Delay after an RCC peripheral clock enabling */\
  5. tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\
  6. UNUSED(tmpreg); \
  7. } while( 0U)
  8. #define __HAL_RCC_ADC1_CLK_ENABLE() do { \
  9. __IO uint32_t tmpreg; \
  10. SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\
  11. /* Delay after an RCC peripheral clock enabling */\
  12. tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\
  13. UNUSED(tmpreg); \
  14. } while( 0U)
  15. #define __HAL_RCC_TIM1_CLK_ENABLE() do { \
  16. __IO uint32_t tmpreg; \
  17. SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
  18. /* Delay after an RCC peripheral clock enabling */\
  19. tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
  20. UNUSED(tmpreg); \
  21. } while( 0U)

可以看到TIM_CLK相关寄存器是APB2ENR,说明它是挂在APB2总线上的。

 

或者我们也可以查看数据手册

可以看到TIM1和TIM8是挂在APB2上的。

标签:__,定时器,HAL,Pin,中断,APB2ENR,cubemx,GPIO,RCC
来源: https://blog.51cto.com/u_15262460/2883060

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有