单片机小组
直播中

djelje

8年用户 996经验值
擅长:光电显示
私信 关注
[问答]

请问怎样去设计一种基于中断函数的stm32呼吸灯?

中断函数有什么特点?
怎样去设计一种基于中断函数的STM32呼吸灯?

回帖(1)

乔丽娜

2021-7-1 14:04:01
  软件
  Keil 5(单片机集成开发环境)
  STM32CubeMX(自动配置stm32编程的相关文件)
  FLYMCU(stm32串口下载软件,也可用ST-LINK代替)
  XCOM(串口监视器)
  准备
  GPIO、RCC、SYS的配置、生成文件的方法详见往期。
  打开“Clock Configuration”,将时钟配置改为如下图所示,此时的时钟频率为72MHz。
  打开“Timers”中的“TIM2”,设置“Clock Source”为“Internal Clock”。点击下方的“Parameter Settings”,设置第一项为72,第三项为10000。打开“NVIC Settings”,勾选“Enabled”。(更严谨的写法为72-1和 10000-1,此处不深入探讨)
  设置的具体含义:
  第一项:分频设置。时钟的原本频率是72MHz,我们可以将其分为72份,每个为1MHz。
  第三项:上限设置。计数上限为10000。溢出后将执行一次中断函数,并从头计数。
  由于频率为1MHz,计数上限为10000,所以在1s内会执行100次中断函数,这样我们就得到了一个时差为10ms的中断函数。
  打开“Timers”中的“TIM3”,设置“Clock Source”为“Internal Clock”。选择“Channel”为“PWM Generation CH1”。点击下方的“Parameter Settings”,设置第一项为72,第三项为1000(更严谨的写法同上)。设置“Pulse”为500。打开“NVIC Settings”,勾选“Enabled”。
  Pulse:占空比。500:表示500/1000=50%,产生一个占空比为50%,频率为1kHz的方波。这个参数也可以在程序中进行调节。
  在右图中找到输出方波的引脚(以实际型号为准),生成文件。
  代码
  打开keil,在/* USER CODE BEGIN 2 */和/* USER CODE BEGIN 2 */之间插入下列代码:
  /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); //初始化定时器 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //初始化PWM输出/* USER CODE END 2 */ 在在/* USER CODE BEGIN 4*/和/* USER CODE BEGIN 4 */之间(约为250-300行处)插入下列代码:
  /* USER CODE BEGIN 4 */int duty=0;int flag=0;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器中断函数,按照刚才的配置每10ms会进入此函数一次{ if(htim-》Instance == htim2.Instance) { if(flag==0) { duty+=10;//方波占空比增大,表现为灯变暗 if(duty》=1000) flag=1;//转换状态 } else if(flag==1) { duty-=10;//方波占空比减小,表现为灯变亮 if(duty《=0) flag=0;//转换状态 } __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,duty);//设置方波比占空的函数 }}/* USER CODE END 4 */ 编译上传代码,并按下开发板的“Reset”按键,观察现象。
  实验效果
  stm32-呼吸灯
  备注
  本实验也可以不引入中断函数,但中断函数具有计时更加精准的特点,在自动控制程序中有重要的应用,stm32初学者应力求掌握。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分