历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32CubeMX学习教程之四:定时器中断

2019-03-24 来源:eefocus

软件:


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上的。


推荐阅读

史海拾趣

Chipcon AS公司的发展小趣事

Chipcon AS公司深知人才是企业发展的核心力量。因此,公司一直注重人才的引进和培养。通过与高校和研究机构建立合作关系,公司吸引了大量优秀的研发人才加入。同时,公司还建立了完善的培训体系,为员工提供了广阔的职业发展空间。这些措施使得Chipcon AS公司的研发实力不断增强,为公司的持续发展提供了有力保障。

Eurosil Electronics Ltd公司的发展小趣事

面对日益激烈的市场竞争,Eurosil始终保持对研发的投入和关注。公司不断引进新技术、新设备,加强研发团队的建设,推动产品升级和产业升级。通过持续的创新,Eurosil在电子行业中保持了领先地位,并为客户提供了更加先进、高效的产品解决方案。

Datasensor公司的发展小趣事

随着公司的不断发展壮大,DATALOGIC公司逐渐整合为三大业务模块:自动化产品、手持设备和自动扫描系统。为了更好地适应市场变化和满足客户需求,公司于1998年将自动化产品业务模块独立出来,成立新的公司,并启用DATALOGIC Sensor &More新标识。2000年,公司进一步启用全新的DATASENSOR品牌标识,标志着公司在工业自动化光电检测领域的新篇章。同时,公司投入大量资金用于生产改善、项目管理和高新技术领域的发展,为公司的持续创新和市场拓展提供了有力保障。

COMPUTAR公司的发展小趣事

在光学技术不断革新的背景下,CBC株式会社于1979年成功研制出第一只手动变焦镜头。这一创新产品不仅提升了镜头的拍摄效果和灵活性,还进一步巩固了CBC在光学领域的领先地位。手动变焦镜头的推出,为CBC赢得了更多客户的青睐,也为公司的后续发展注入了新的动力。

雅特力(Artery)公司的发展小趣事

雅特力在追求经济效益的同时,也高度重视企业社会责任和可持续发展。公司积极参与社会公益事业,通过捐款、捐物等方式支持教育、环保等领域的发展。此外,雅特力还注重环境保护和资源利用,采用环保材料和节能技术,努力降低生产过程中的能耗和排放。这些举措不仅有助于提升公司的社会形象,也为实现可持续发展做出了积极贡献。

EFINIX公司的发展小趣事

随着中国电子行业的快速发展,EFINIX公司看到了巨大的市场潜力。公司积极拓展中国市场,与中国本土企业展开合作,推动Quantum™可编程加速器技术和Trion FPGA产品在中国市场的应用。EFINIX公司的产品和服务得到了中国客户的广泛认可,为中国电子行业的发展做出了积极贡献。

问答坊 | AI 解惑

晶体管的置换(代换)原则

我们在维修、设计和实验或试制中,常常会碰到晶体管的置换(代换)问题。如果掌握了晶体管的置换(代换)原则,就能使工作初有成效。其置换(代换)原则可划分为三种:即类型相同、特性相近、外形相似。 开关电源,变压器,电源模块,脉宽调制,发 ...…

查看全部问答>

风电词汇中英文对照表4

sprocket 链轮齿 spur gear正齿轮 spur wheel gear正齿轮 square 平方;方块;【修】矩形[SQ],正方形的, 四方的, 直角的, 正直的, 公平的, 结清的, 平方的, 彻底的 square nut 四方螺母, 螺帽 square thread矩形螺纹 square-head bo ...…

查看全部问答>

KITL的问题

以太网的KITL已连通,加载了一些东西就停了。用的优龙2440a开发板, PB中显示: 294772034 PID:c3d93bfa TID:c3d934aa 0x83d93000: [dm9: Chip signature is 90000A46 4294772041 PID:c3d93bfa TID:c3d934aa 0x83d93000: ***NDIS*** (a, 534) ...…

查看全部问答>

关于altera与actel芯片通信的问题

我现在在做毕业设计,我在altera的开发板上进行了简单SPI口的设计,通信正常,能用四根线进行十位二进制的串行传输,并能将传来的数据显示在四位数码管上,也就是用同一块altera的芯片做主片和从片的任务,试验是对的。然后我再将从片的程序烧在ACT ...…

查看全部问答>

EVE下移位的奇怪问题

请问: 1 如果我的CPU是32的,byte a=16; a…

查看全部问答>

51是很流行,很强大,但不适合未来硬件系统的发展.

51是很流行,很强大,但不适合未来硬件系统的发展. 虽然勉强有许多厂商提供带扩展的接口、单周期的片子,51的速度也太落后了,首先指令位长这点就是命门。 流行的东东不一定是好的,关键是要技术能进步的。 执行一个程序周期太长是致命伤。 现在 ...…

查看全部问答>

STM32DSPLib数字滤波FIR没例子啊!

STM32 DSPLib 数字滤波FIR没例子啊!不知到如何使用。;void fir_16by16_stm32(void *a, void *x, COEFS *c, u32 N) 哪位大虾指教一下。谢谢!…

查看全部问答>

TPS61059 可为作为相机闪光灯或电影照明灯的白光 LED 供电

使用白光 LED 的一个难题在于如何使用输入电压宽泛的电池为其供电。 德州仪器 (TI) 便携式电源 DC/DC 应用部工程师Scot Lester为您答疑解惑。…

查看全部问答>