十天入门基于HAL库配置STM32的CubeMX(第二天)

目录

第二天

学习内容:

CubeMX以及HAL库的使用注意事项:

HAL库函数学习:

Keil调试(Debug)


第二天

学习内容:

  1. 在CubeMX中新建工程:

Flie→New Project

→选择芯片型号:STM32F407IGH7,勾选收藏工程(这样能够保存所建工程)并双击新建的工程

→开启总线和对应时钟树:

System处SYS的debug处勾选Serial Wire开启总线,

RCC勾选HSE的Resonator进行使能(选择外部时钟)

→配置时钟数:Input Frequency处选择输入频率为12Mhz,勾选HSE打开外部时钟,并勾选PLLCLK,且更改输入速率为最大的168MHz,并点击回车(才能保存时钟数的设置)

→Project Manger处定义工程名并选择路径(不能包含中文),IDE选择MDK-ARM,

→Code Generator处勾选Copy only the necessary libary files和generate ".c/.h"。

→然后点击右上角生成代码(PS;每次更改CubeMX中的配置都要生成对应代码,否则keil不能产生对应代码!)

→打开MDK的keil即打开工程

2.使用HAL库点亮LED:

查找手册可以知道红灯对应PH12引脚,绿灯对应PH11,蓝灯对应PH10.

点亮红灯——

启用引脚PH12,在CubeMX右下角处搜索PH12,找到PH12位置并选择OUTPUT输出模式,别忘了同步生成对应代码;

然后在keli的while循环中调用写入GPIO引脚电平的函数HAL_GPIO_WritePin,即可打开或熄灭红灯。

LED流水——

在CubeMX中启用PH11,PH10,然后在主循环中通过不断的点亮和熄灭对应的LED以及设置适当的延迟即可以做到LED流水闪烁了。

PS:HAL_GPIO_WritePin等函数使用见下方。

3.使用HAL库配置外部中断EXTI0:

(1)启用引脚PA0:在CubeMX右下角处搜索PA0,找到PA0位置并选择EXTI0模式,别忘了同步生成对应代码;

PS:如果要通过控制按键来控制LED,别忘了还要将LED也打开(PH12引脚启用OUTPUT输出模式)。

(2)使能EXTI0:左上角NVIC处开启对应的EXTI0外部中断

(3)配置中断函数:void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),注意不要输错函数名称了,并且由于此中断是多通道进入的,所以进入中断时第一步就是判断是否是对应通道进入的判断。这样按下按键Key后就可以触发PA0引脚对应的外部中断了。

4:使用HAL库配置定时器6(基本定时器)

PS:基本定时器有Tim6,7;通用定时器有TIM2,5等,高级定时器有TIM1,8

(1)启用引脚PH12,开启红灯以便观察定时器现象

(2)配置基本定时器Timer6—

  • Timers处选择TIM6,勾选Activated开启定时器,并在下方使能Enable,以及配置PSC和ARR;
  • 注意:

STM32系列需要注意仅高级定时器时钟与主频相同,其他定时器时钟是主频的一半,也就是说主频选择最大的168MHz的话,那么TIM6的频率为84=168/2MHz,

  • 计算预分频PSC:84-1=83,偏移1位,那么1us计数+1
  • 计算自动重装值ARR:1000-1=999,偏移1位,那么计数累计到1000的时候达到自动重装值,计数清零,所以1ms计数+1
  • 一般选择向上计数。
  • 别忘了还要去NVIC里面启用定时器6的中断

(3)在keil中编写代码:

  • 在Begin2和End2之间填写:HAL_TIM_Base_Start_IT(&htim6);//启动TIM6,使能其中断
  • 编写回调函数:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在里面定义静态变量进行计数,比如定时器每隔1ms进一次中断,那可以设置进入中断达到1000次让LED电平翻转,实现定时器控制LED以1s为周期进行闪烁。

5:学习使用PWM实现呼吸灯

(1)在CubeMX中开启定时器TIM5(通用定时器):选择通道3的PWM Generation CH3模式,用定时器的PWM模式输出,这样就将PH12引脚配置成此模式了;(这里无需打开通道)

(2)然后在下方配置定时器的PSC和ARR,PSC=84-1,ARR=1000-1,设置时钟1MHz的时钟输入。

(3)CH Polarity默认为High无需更改。

(4)keil中先开启PWM:HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_3);

(4)然后在注释Begin PV和End PV注释之间定义一个计数counter

(5)最后在主循环中累计counter并调用函数__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_3,counter);即可实现用PWM控制呼吸灯了。

6:用高级定时器的PWM模式控制舵机

(1)开启高级定时器TIM1,打开通道1:设置为PWM generation CH1。

(2)设定PSC和ARR,因为是高级定时器,所以定时器频率为168MHz,其中PSC=168-1,ARR=20000-1,那么设置了50KHz即以20ms为周期的PWM的输出。

(3)通道1 的Pluse设为2000。

(3)在keil中开启定时器1和定时器1的通道(使用函数HAL_TIM_Base_Start开启定时器1,HAL_TIM_PWM_Start开启通道1)。

(4)主循环中用宏定义__HAL_TIM_SET_COMPARE(充当函数)来设置PWM的占空比,根据换算从而得到舵机会转动到的角度——注意不是转过的角度而是转到的角度。

  • 计算__HAL_TIM_SET_COMPARE的第三个参数COMPARE:比如0.5/20*20000,其中0.5为每个PWM周期高电平持续的时长为0.5m,那么0.5/20就是占空比,在根据公式COMPARE=占空比RCC/(ARR+1))即可得到0.5/20*20000。

CubeMX以及HAL库的使用注意事项:

1:每次修改CubeMX后都要记得点右上角生成对应代码到keil里。

2:CubeMX生成的文件路径不能有中文。

3:keil中如果想要右键到函数的定义去一定要先编译一次代码才行。可以刚打开keil就build一下。

4:keil中代码要写在User Group下的main,c下注释的USER CODE BEGIN和USER CODE END之间,

写在其他地方无效。

5:HAL库的每个函数前面都要加上"HAL_"。

6:注意CubeMX的配置和keil代码相对应。

9:中断函数里面不能使用delay延迟,否则会影响程序运行。可以在中断里面进行累积,当达到累计时才在中断里面执行对应的程序,以此来替代延时。

HAL库函数学习:

1:HAL_GPIO_WritePin:写入对应电平,参数依次为:GPIOx,GPIO_PIN_x,GPIO_PIN_(RE)SET,

注意PIN是三个单词都要大写!,RESET和SET也是均为大写字母。

其中SET设置高电平能点亮对应的LED,RESET设置低电平则为熄灭。在实现流水灯时点亮了对应的的LED要在延迟后及时熄灭,否则就会出现红蓝绿三灯一起亮的情况——效果就是白灯。

2:HAL_Delay:延迟单位为毫秒。注意不要在中断中使用延迟函数,会影响程序正常运行(中断函数执行时间应极短)。

3:void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin):中断回调函数,函数参数就是括号内的这个,回调函数的参数固定,无需改变,右键跳转到定义去即可将函数参数copy过来使用。

4:HAL_GPIO_ReadPin:读入对应电平,相比WritePin函数少了设置电平的参数。

5:中断函数(固定模板,包括判断引脚是否为SET,以及清楚标志位,用户只需要编写回调函数EXTI_Callback)

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } }

PS:用户无需调用HAL_GPIO_EXTI_IRQHandler,此中断函数模板已经写好了,用户需要调用的是EXTI_Callback去把中断函数补充完成,其中清楚标志位无需用户操作,用户只需在回调函数中对是哪个通道进的中断进行判断就行了。

6:HAL_TIM_Base_Start_IT(&htim6):启动TIM6,使能其中断

7:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim):定时器的中断回调函数,和EXTI一样,无需调用中断函数,只需要编写回调函数。

8:HAL_GPIO_TogglePin:引脚电平翻转函数。

9:HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_3):启动定时器5的PWM模式

10:__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_3,counter):呼吸灯函数,其中第个参数为COMPARE=占空比RCC/(ARR+1)。

11:HAL_TIM_Base_Start(&htim1):开启高级定时器1

12:HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1):开启定时器1的通道1

13:__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0.5*20000/20):控制舵机占空比

Keil调试(Debug)

点击Start /Stop Debug按钮,设置断点,点击运行既可以进行调试了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值