STM32CubeMX学习教程之四:定时器中断

发布者:静逸闲云最新更新时间:2019-03-24 来源: eefocus关键字:STM32CubeMX  定时器中断 手机看文章 扫描二维码
随时随地手机看文章

软件:


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并使能其中断


  /* USER CODE BEGIN 2 */

 HAL_TIM_Base_Start_IT(&htim1);

 

  /* 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”,然后跳转到它的定义


static void MX_GPIO_Init(void)

{

 

  GPIO_InitTypeDef GPIO_InitStruct;

 

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pins : LED1_Pin LED4_Pin */

  GPIO_InitStruct.Pin = LED1_Pin|LED4_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 

}

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


#define __HAL_RCC_GPIOD_CLK_ENABLE()   do { \

                                        __IO uint32_t tmpreg; \

                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\

                                        /* Delay after an RCC peripheral clock enabling */\

                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\

                                        UNUSED(tmpreg); \

                                      } while(0U)

 

#define __HAL_RCC_ADC1_CLK_ENABLE()   do { \

                                        __IO uint32_t tmpreg; \

                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\

                                        /* Delay after an RCC peripheral clock enabling */\

                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\

                                        UNUSED(tmpreg); \

                                      } while(0U)

 

#define __HAL_RCC_TIM1_CLK_ENABLE()   do { \

                                        __IO uint32_t tmpreg; \

                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\

                                        /* Delay after an RCC peripheral clock enabling */\

                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\

                                        UNUSED(tmpreg); \

                                      } while(0U)

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


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


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


关键字:STM32CubeMX  定时器中断 引用地址:STM32CubeMX学习教程之四:定时器中断

上一篇:使用STM32CubeMX开发:按键中断实验
下一篇:STM32CubeMX串口接收中断

推荐阅读最新更新时间:2024-03-16 16:26

STM32CubeMX Hal库的一些坑
使用的是stm32f103 V1.40版本的库 UART DMA发送的问题 发送函数 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 发送完毕之后成功的回调函数也正常,可是再次发送的时候就发不出去了。一直返回错误。 我们看下这个函数的代码 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { uint32_t *tmp;
[单片机]
AVR之最简单外部中断定时器0、定时器1程序
程序太简单啦,就不说啦,自己看吧 ATMEGA16用ICCAVR编译器 1、外部中断 #include iom16v.h #include AVRdef.h unsigned char temp=0x80; void main() { DDRA=0xff; GICR|=0x40;//使能外部INT0 MCUCR|=0x01;//INT0下降沿触发 SEI();//总中断 while(1); } #pragma interrupt_handler int0_isr:iv_INT0 void int0_isr(void) { PORTA=temp; temp=temp 7|temp 1; } 2
[单片机]
stm32cubemx 多路adc采集
采用的软件是STM32CUBEMX+KEIL5 硬件为stm32F103C8T6 我与原文作者做的区别在于 External Trigger Conversion Edge,我在进行配置的时间没有None选项,我选择的是默认的Regular Conversion launched by software 原文地址: http://www.eemaker.com/stm32cubemxadc.html 实现功能:stm32cubeMX配置ADC多通道采集(非dma和中断方式) Stm32ADC的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方
[单片机]
<font color='red'>stm32cubemx</font> 多路adc采集
利用单片机PWM信号对舵机进行驱动控制
  在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 图1 舵机的控制要求 舵机的控制
[单片机]
利用单片机PWM信号对舵机进行驱动控制
用51单片机定时器中断设计电子钟
把前天设计的时钟的功能补全了一些,贴上来, #include reg52.h #define uchar unsigned char sbit rd=P2^6; sbit wr=P2^5; sbit lcde=P2^7; sbit k1=P1^0; sbit k2=P1^1; sbit k4=P1^3; sbit k8=P1^7; uchar code table1 = 2011-11-05 ; uchar code table2 = 00:00:00 ; uchar code table3 ={{ MON },{ TUE },{ WED },{ THU },{ FRI },{ SAT },{ SUN }};
[单片机]
STM32CubeMX系列教程26:USB HOST
一.USB MSC 这一节介绍usb作为主机读取U盘设备,通过USB虚拟串口通信。程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备,PE2设置为GPIO输出模式,USB口输出电压给从设备。 USB HOST选择大容量存储主机类,选择USB Disk开启FATFS文件系统。 配置系统时钟频率为216MHZ,USB频率均为48MHz。 在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。 USB_OTG_FS为默认配置不作修改。 中间件USB_HOST配置中,USB
[单片机]
<font color='red'>STM32CubeMX</font>系列教程26:USB HOST
51单片机基础之定时器中断(一)
TH和TL定时换算: 定时器说白了倒数的,时间到了触发一次中断,那么必须设置倒数时间, TH0和TL0就是高八位和第八位 假设定时1ms一次,那么2的16次方等于65536,定时1ms,就等于65536-1000=64536,再把十进制换成十六进制,如下图的例子。 代码: #include reg51.h sbit LED=P2^0; //等下要用到,会看到LED闪烁,闪烁一次说明定时器中断触发了100次 typedef unsigned char u8;//typedef关键字的作用是自己重定义数据类型 typedef unsigned int u16; u16 i=0; //定义
[单片机]
51单片机基础之<font color='red'>定时器</font><font color='red'>中断</font>(一)
STM32CubeMX代码生成和点亮LED
所需工具STM32CubeMX和Keil5 1、先打开STM32CubeMX软件,点击New Project新建工程; 2.在搜索框中搜索你的项目芯片; 3、搜索出来有两个不同封装的芯片,写程序没区别,但是这个软件可以生成IO说明文档,可能会导致文档与实际封装差异。选择确定后双击~; 4、创建完工程,简单介绍一下功能; 5、先配置时钟树,我使用的F429最大支持180M时钟,我配置为最大时钟。 6、我的板子LED是接在PA11上的,在搜索栏上搜索PA11,芯片PA11会一闪一闪的。 7、点击PA11引脚,会出现下面画面,我们选择GPIO_Output 8、当PA11选择作为输出时,外设USB功
[单片机]
<font color='red'>STM32CubeMX</font>代码生成和点亮LED
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved