文章目录
所用软件 STM32CubeMX、keil5
未注明的操作表示在keil中
笔记来源:https://www.bilibili.com/video/BV1Ht41157eu?p=2&vd_source=c40ab5658bef241a1d15ffea353293aa
1、关于代码的生成
- 生成代码以后需要编译,不然有些函数无法跳转
1.1、设置Project Manager
- 在cubemx中设置
- 文件名不能有中文,IDE改为MDk
- 自动生成 .c 和 .h,不然很多初始化函数会直接在main中生成
1.2、设置SYS
- 在cubemx中设置
- Serial Wire 占用引脚最少
1.3、要编译utf-8格式的中文
- 在魔法棒的c/c++里的miscControls添加:–locale=english
1.4、.s文件
- 修改堆栈
Stack_Size EQU 0x400
Heap_Size EQU 0x200
1.5、代码保护区
/* USER CODE BEGIN XXX */
/* USER CODE END XXX */
- 不能自己构建保护区
- 非保护区的内容会在cubemx生成代码时被删除
- 最好别动类似的注释
1.6、{}Function选项卡
- 可以直观的查看文件里的函数
1.7、函数前的注释
- @brief 说明函数功能
- @param 第1参数
- @param 第2个参数
- @retval 返回值
2、GPIO与外部中断
2.1、切换引脚电平 (toggle)
- 就是这个HAL_GPIO_TogglePin函数
2.2、中断优先级
- 抢占优先级 Preemption priority
抢占优先级越高,当中断产生时越先执行
如:a中断函数执行时,b优先级高于a,产生b中断,暂停a执行b中断函数 - 响应优先级
cubemx中 以Sub priority表示
抢占优先级相同时,当两个中断来临时,响应优先级越高的先执行
2.3、中断设置
- 在cubemx中设置
- 直接在芯片引脚选择GPIO_EXIT
GPIO mode:设置中断触发方式:下降沿触发(高变低)具体看情况 - 使能外部总线中断
NVIC–> EXIT line - 设置中断优先级
NVIC–> EXIT line–>Preemption Priority
值越小中断优先级越高
2.4、外部中断的使用
- 在stm32f2xx_it.c中的 EXTI15_10_IRQHandler函数查看
- main中重写HAL_GPIO_EXTI_Callback
3、RCC与定时器中断
HSI RC、LSI RC为芯片自带晶振
3.1、设置系统时钟
-
在cubemx中设置,具体的设置要看芯片手册
-
HSI 为内部时钟
-
HSE 外部高速时钟
BYPASS Clock Source是旁路时钟源,使用外部晶振时不能选择旁路时钟源 -
PLL 锁相环
PLL 的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。
由 HSE 或者 HSI 提供时钟输入信号
-
CSS
如果 HSE 发生故障,HSE 和 PLL 也会被关闭,此时系统会自动切换 HSI 作为系统时钟
没有开启 CSS 和 CSS 中断的话,此时SYSCLK = HSI 系统低速运行
开启了 CSS 功能,在css中断使用 HSI可以重新设置系统频率 -
LSE外部低速 时钟
主要是给RTC用的(一般不用),所以还需要配置RTC使能 -
AHB 高速总线
Advanced High-performance Bus, 用来接高速外设。 -
APB 低速总线
Advanced Peripheral Bus,用来接低速外设。
3.2、时钟预分频值和自动重装值(16bit)
- psc:时钟预分频值 从0开始计
- arr:自动重装值 从0开始计
- Tclk:输入时钟频率(单位为 Mhz)
- Tout:中断时间(单位 us)
- Tout= ((arr+1)(psc+1))/Tclk
例:(4999+1)( 7199+1))/72=500000us=500ms 每0.5秒中断一次 - 中断频率 = 1/Tout (单位 Hz)
例:72000000/(4999+1)*( 7199+1)) = 2 Hz
3.3、设置预分频值和自动重装值
- 在cubemx中设置
- 设置定时器
TIMx --> Clock Source --> internal clock (内部时钟) - 预分频值 Prescaler和自动重装值Counter Period
TIMx --> ParamterSettings --> Prescaler,Counter Period
3.4、查看内部时钟
- time.c --> HAL_TIM_Base_MspInit --> __HAL_RCC_TIM1_CLK_ENABLE()
- 也可在芯片手册 RCC registers查看
3.5、定时器中断的使用
- stm32f2xx_hal_tim.c --> HAL_TIM_Base_Start_IT(在main中调用启动函数)
- 中断处理回调函数HAL_TIM_PeriodElapsedCallback(在main中重写)
4、定时器中断频率与pwm
4.1、设置pwm
- 在cubemx中设置
- 选一个空闲引脚 选择 TIMx_CHx 以 TIM3_CH2 为例
- TIM3 --> 设置Clock Source(选内部时钟) 和 Channel(选PWM Generation CH2)
- 设置预分频值和自动重装值
- 设置占空比 Pulse
占空比 = Pulse/自动重装值
可不设置 在main中设置TIM3->CCR2的值 Pulse = TIM3->CCR2
D:占空比 F:中断频率
4.2、设置启动函数
- 同定时器中断一样
在main中调用 stm32f2xx_hal_tim.c --> HAL_TIM_PWM_Start
在time.c中的pwm对应定时器初始化函数中可找到如何传参 - 设置占空比
在main中设置:TIM3->CCR2 = xx; 占空比 = xx / 自动重装值
那个大佬后面还讲了串口,我只是为了熟悉cubemx所以就没往后看了