定时器
STM32F4的通用定时器包括TIM(25)**和**TIM(914),包含一个16位或32位的自动重载计数器(CNT),由可编程预分频器(PSC)驱动。
(分频器是指将不同频段的声音信号区分开来,分别给于放大,然后送到相应频段的扬声器中再进行重放。)定时器可以被用来测量输出信号的脉冲长度,或者产生输出波形(输出比较和PWM(脉冲宽度调制,通过改变脉冲宽度改变输出电压,本质上就是调节占空比,能输出PWM的IO口是固定的,可以通过重映射改变引脚)),每个通用定时器都是独立的。
TIM2和TIM5支持向上,向下,向上/向下自动装载计数器,TIM9TIM14只支持向上计数。**165536**
4个独立通道(TIM9TIM14最多两个):**输入捕获**,**输出比较**,**PWM生成**(边缘和中间对齐模式(914不支持中间对齐)),单脉冲输出(单脉冲就是脉冲输入一直有,通过方向输入的高低电平来控制方向!一般称为脉冲信号+方向信号控制方式
2:双脉冲就是指脉冲输入和方向输入两路都是脉冲输入,只是一路是正向脉冲,一路是反向脉冲!一般称为正向脉冲+反向脉冲控制方式)
定时器时钟来源:内部时钟,外部时钟模式1(外部输入脚TIx),外部时钟模式2(ETR),**内部触发输入(ITRx)**TIM9~14的时钟来自于APB2.
定时器溢出时间计算方法 Tout=((arr+1)*(psc+1))/Ft us. Tclk:输入时钟频率(单位为 Mhz)。psc为预分频系数,对系统时钟进行分频。Tout:溢出时间(单位为 us) 重装载值arr,这个重装载值的意思就是当我们的定时器的计数值达到这个arr时,定时器就会重新装载其他值.例如当我们设置定时器为向上计数时,定时器计数的值等于arr之后就会被清0重新计数,定时器计数的值被重装载一次就是一个更新
(UPDATE)
注意:PSC预分频系数需要加1(为了避免预分频系数没有设置的取0的情况),自动重装载值也要加1(从ARR到0之间的数字为ARR+1个)
NVIC 提供中断控制器,用于总体管理异常。
(系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如SPI,USART)要高,答案:不是的,它们是在同一个NVIC下面设置的。)嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
重映射就是管脚的外设功能映射到另一个管脚
通用定时器中断设置的步骤
1.使能定时器时钟
2.初始化定时器参数,包含自动重装载值,分频系数,计数方式等
3.设置定时器中断类型,并使能 void TIM_ITConfig(TIM_TypeDef* TIMx,unit16_t TIM_IT, FunctionalState NewState)
4.设置定时器中断优先级,使能定时器中断通道
NVIC初始化函数 NVIC_Init
5.开启定时器
6.编写定时器中断服务函数
在中断产生后,通过状态寄存器的值来判断此次属于什么中断,执行相关操作,清除寄存器的中断标志
另外固件库中函数TIM_ClearFlag(清除寄存器状态),TIM_GetFlagStatus(判断定时器状态),TIM_GetITStatus(判断中断标志位)
在HAL库中
HAL_TIM_IRQHandler(&htim2);定时器中断服务函数,每进行一次中断,回到中断回调函数
void TIM3_IRQHandler(void) 首先进入中断函数
HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数
判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数
在中断回调函数中添加用户代码
寄存器
计数器寄存器(TIMx_CNT),预分频寄存器(TIMx_PSC)(1~65536),自动重装载寄存器(TIMx_ARR)(如果TIM1——CR1)寄存器中的ARPE位(自动重载预装载使能位)为0,ARR寄存器的内容将直接写入影子寄存器,当
计数器达到上溢值(或者在递减计数时达到下溢值)并且 TIMx_CR1 寄存器中的 UDIS 位为0 时,将发送更新事件,置1,则禁止UEV事件。
定时器时间=1/(时钟频率/预分频/计数周期)
串口通信
并行通信:数据各个位同时传输
串行通信:数据按位顺序传输,速度慢 单工,半双工(切换方向的单工通信),全双工,,同步通信(带时钟同步信号传输,SPI,IIC),异步通信(不带时钟同步信号UART)
串口:TXD发送端,RXD接收端,异步通信
串口相关寄存器: USART_SR状态寄存器,USART_DR数据寄存器,USART_BRR波特率寄存器。数据发送与接收,通过USART_DR实现,在TDR写入数据,串口自动发送数据,当收到数据读取的是RDR,虽然是一个 32 位寄存器,但是只用了低 9 位(DR[8:0]),其他都是保留
DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器(TDR 和 RDR)组
成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。TDR 寄存器
提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部
总线之间的并行接口。
当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长
度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。
当使能校验位进行接收时,读到的 MSB 位是接收到的校验位。
串口配置的一般步骤:
1.串口时钟使能:RCC_APBxPeriphClockCmd();
GPIO时钟使能:RCC_AHB1PerighClockCmd();
2.引脚复用映射:GPIO_PinAFConfig();
3.GPIO端口模式设置:GPIO_Init();//模式设置为GPIO_Mode_AF
4.串口参数初始化:USART_Init();
5.开启中断并且初始化NVIC(有中断才要这个) NVIC_Init();USART_ITConfig();
6.使能串口:USART_Cmd();
7.编写中断处理函数:USARTx_IRQHandler();
8.串口数据收发:void USART_SendData();//发送数据到串口,DR
unit16_t USART_ReceiveData();//接受数据,从DR读取接收到的数据
9.串口传输状态获取:
FlagStatus USART_GetFlagStatus();
void USART_ClearITPendinngBit();
串口通信数据包 起始位,位0~7,校验位,停止位,起始位由1个逻辑0的数据位表示,结束位 由0.5,1,1.5,2个逻辑1的数据位表示,有效数据位后紧接着就是有效数据,长度为5~8位长,校验位,可选,数据的抗干扰性。
奇校验,有效数据和校验位中“1”的个数为奇数,偶校验,0校验,1校验,无校验,数据包里不含校验位