[STM32F1] STM32CubeMx 生成定时器代码后无法进入中断

[复制链接]
4586|2
 楼主| sunwise123 发表于 2016-12-13 18:37 | 显示全部楼层 |阅读模式
STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(RTOS, USB, FatFs, TCP/IP,  Graphics, 等等).
  • 直观的STM32微控制器的选择和时钟树配置
  • 微控制器图形化配置外围设备和中间件的功能模式和初始化参数
  • C代码生成项目覆盖STM32微控制器的初始化符合IAR™,Keil的™和GCC编译器。

对于新的产品设计,我们强烈推荐使用STM32Cube来加速你的开发过程,并为以后的产品平台移植打下良好的基础。


接下来使用STM32CubeMx实现最简单的TIM1的10ms定时中断功能。
1.选择对应MCU型号(此处就不上图了)
2.仿真接口选择为SW,RCC选择外部时钟,开启定时器主模式,选择内部时钟源。
3.配置时钟树各分频参数。
4.配置定时器预分频72,定时周期为10000个时钟周期,上升计数模式。
5.生成代码。
使用MDK4.72打开代码并编译后,烧录到开发板仿真调试,在定时器中断函数中添加断点,发现定时器并未启动和产生中断。
查看定时器相关寄存器,定时器启动控制位CEN和中断控制位UIE没有置位。
查看生成的源代码,在函数HAL_TIM_Base_MspInit中,并没有开启定时器,只是预留了用户添加代码的区域,所以用户需添加启动定时器和中断的代码
HAL_TIM_Base_Start_IT(tim_baseHandle);
    HAL_TIM_Base_Start(tim_baseHandle);


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM1_CLK_ENABLE();

    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(TIM1_UP_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
  /* USER CODE BEGIN TIM1_MspInit 1 */

    HAL_TIM_Base_Start_IT(tim_baseHandle);
    HAL_TIM_Base_Start(tim_baseHandle);
               
  /* USER CODE END TIM1_MspInit 1 */
  }
}


至此,仿真调试可以进入定时器中断。

2

2

3

3

4

4

5

5

6

6

7

7
mmuuss586 发表于 2016-12-13 20:13 | 显示全部楼层
谢谢楼主分享经验;
dongnanxibei 发表于 2016-12-13 22:12 | 显示全部楼层
没看明白,楼主是说这代码有问题呢,还是解决了问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部