目录
第二天
学习内容:
- 在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按钮,设置断点,点击运行既可以进行调试了。