STM32学习
Posted Caramel_biscuit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32学习相关的知识,希望对你有一定的参考价值。
软件定时原理
使用纯软件(CPU死等)的方式实现定时(延时)功能。
- 不精准:函数调用压栈进栈需要耗费额外的时间;流水线使得程序执行时间不确定。
- CPU死等。
定时器定时原理
使用精准的时基,通过硬件的方式,实现定时功能。
定时器核心就是计数器。
STM32定时器分类
计数器位数16位,可以记0~65535个数。
STM32基本、通用、高级定时器功能整体的区别
基本定时器
基本定时器:TIM6/TIM7
16位递增计数器:计数值(0~65535)
16位预分频器:分频系数(1~65536)
可用于触发DAC(数模转换)
在更新事件(计数器溢出)时,可产生中断/DMA请求。
- 基本定时器时钟源只能来自于内部时钟。
- 影子寄存器是实际起作用的寄存器,不可直接访问。
- 自动重载寄存器(ARR)起到缓冲作用,写入到ARR的值不能直接起作用,而是要转入到影子寄存器才能起作用。
- 向PSC预分频器写入分频系数时,不直接起作用,而是等值转移到影子寄存器后才起作用。
- 当计数器溢出时,更新事件默认产生,而中断和DMA并不是默认产生,而是通过配置来产生。
- UG位可产生软件更新事件。
- 更新事件产生后,会让预装载寄存器的值加载到对应的影子寄存器。
- ARPE位决定ARR是否具有缓冲。如果有缓冲,将值装载到自动重载寄存器ARR中,并不立即起作用,而是等待更新事件发生后,值装载到对应的影子寄存器,才会起作用。如果无缓冲作用,则值会直接转移到影子寄存器,立刻生效。
- 定时器1~8都是72MHz。
STM32定时器计数模式及溢出条件
递增计数模式实例说明
PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
递减计数模式实例说明
PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
中心对齐模式
PSC=0,也就是1分频。
ARR=6。
CNT=ARR-1或1时产生溢出。
定时器中断实验相关寄存器
TIM6 和TM7 控I制寄存器 1(TIMx_CR1)
用于设置ARR寄存器是否具有缓冲,使能/关闭计数器。
- 默认情况下,ARPE(Auto-reload preload enable)为0,TIMx_ARR寄存器没有缓冲,操作ARR寄存器,其值会直接转移到ARR影子寄存器直接生效。
ARR寄存器具有缓冲时,会减少操作这个寄存器带来的时间误差。
TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
用于使能更新中断
TIM6 和TIM7 状态寄存器(TIMx_SR)
用于判断是否发生了更新中断,由硬件置1,软件清零。
TIM6 和TIM7 计数器(TIMx_CNT)
计数器实时数值,可用于设置计时器初始值,范围:0~65535
TIM6 和TIM7 预分频器(TIMx_PSC)
用于设置预分频系数,范围:0~65535,实际预分频系数等于PSC+1
TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)
用于设置自动重装载值,范围:0~65535
定时器溢出时间计算方法
- Tout是定时器溢出时间
- Ft是定时器的时钟源频率(没有分频)
- ARR是自动重装载寄存器的值
- PSC是预分频器寄存器的值
定时器中断实验配置步骤
- 配置定时器基础工作参数:HAL_TIM_Base_Init()
- 定时器基础MSP初始化:HAL_TIM_Base_MspInit() 配置NVIC,CLOCK等
- 使能更新中断且启动计数器:HAL_TIM_Base_Start_IT()
- 设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
- 编写中断服务函数:TIMx_IRQHandler() ->HAL_TIM_IRQHandler()
- 编写定时器更新中断回调函数:HAL_TIM_PeriodSlapsedCallback()
关键结构体介绍
typedef struct
TIM_TypeDef *Instance; //外设寄存器基地址
TIM_BASE_InitTypeDef Init;//定时器初始化结构体
TIM_HandleTypeDef;//定时器句柄
typedef struct
uint32_t Prescaler;//预分频系数
uint32_t CounterMode;//计数模式
uint32_t Period; //自动重装载值ARR
uint32_t ClockDivision; //时钟分频因子
uint32_t RepetitionCounter; //重复计数器寄存器的值
uint32_t AutoReloadPreload; //自动重装载预装载使能
TIM_BASE_InitTypeDef;//定时器基础初始化结构体
使用基本定时器6,实现500ms定时器更新中断,在中断里翻转LED0
PSC=7199,ARR=4999为例
STM32入门学习路线
可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部分的stm32的学习者是在入门阶段的,所以今天我们就来聊聊stm32的入门学习路线。
先来看个图,相信会有所了解。
首先学习stm32 不管是C语言还是汇编肯定跑不了的所以C语言一样要打好基础,尤其是C语言中的指针,结构体,循环 等等一些最基础的知识你要能够熟练应用,要不然对于从事stm32开发的难度是非常大的。
针对C语言我给大家推荐一个视频资料虽然是某某机构录的资料不过讲的倒是很详细值得一看
C语言入门视频教程_9天精通Linux C语言
书籍的话其实不用买纸质的现在晚上电子版的pdf很多可以搜一下,我推荐两本《C和指针》《C语言核心技术》看着都还可以,网上就有我就不上传了。
然后就是要学会读stm32手册,不要小看这个现在市面上stm32的本子很多,原子,野火等等每一个公司的板子多少有些不同,没必要都去学会如果是那样我们的学习成本会成倍增长,毕竟每学习一个板子就要买一块板子,所以学会一个板子之后其他板子也是有很多相同的不同的那一部分我们学会读手册和文档就OK了。
至于其中的一些细节只是像什么中断,时钟,外设,ADC,DMA就不给大家一 一介绍了自己找一套系统的学习资料就OK了,现在免费的多的是就算自己找个群进去要一套,遇到好心的网友给你一套也是有可能的,实在不行花个几十块钱自己去买一套,为了学习投入,这个无可厚非。
最后我再给大家推荐一个串口和一个直流电机驱动与测速的资料,玩小车和四轴想自己搞点小玩意的可以看看
概念这么多,我该如何学
http://www.makeru.com.cn/live/4034_1461.html?s=45051
(stm32串口应用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051
(stm32直流电机驱动)
http://www.makeru.com.cn/live/1392_1218.html?s=45051
(STM32中断系统)
http://www.makeru.com.cn/live/1392_1124.html?s=45051
以上是关于STM32学习的主要内容,如果未能解决你的问题,请参考以下文章