32串口,结构体,定时器等等
本来打算今天一天把32大部分知识都梳理出来写完,实在是干不动了,留了一点点等明天跟代码一起放出来
1.串口的学习
串口通信
串口的学习
TTL电平:数字芯片的电平,单片机
232电平:电脑串口的电平,负逻辑
1.USB转串口模块主要应用于电脑与其他设备的连接
2.使用的时候需要安装电平转换芯片驱动
串口数据包的基本组成
起始位:逻辑0(第一个低电平)
有效数据位:在起始位之后,长度为5,6,7或8位长
校验位:奇校验:
偶校验:
0校验:校验位为0
1校验:校验位为1
停止位:逻辑1(高电平,跟它讲可以不用传输了)
---保证数据的稳定性
2.串口的结构体
串口结构体讲解
串口通信
USART:通用同步异步收发器
UART :通用异步收发器
差了一个S,single 可以自己选择同步(SPI,IIC)异步(USART)
同步就是带时钟(SCLK)
可以理解为USART为SPI,IIC对等的"协议'.UART则不是协议,是一个实体
nRTS:请求发送
nCTS:请求接受
结构体配置
BaudRate 配置波特率为115200/9600
WordLength 字长数据位时长:八位/九位
WordLenth 停止位 0.1 1 1.5 2
Parity 校验位 无,奇,偶
Mode USART模式 配置工作模式 收发
HardwareFlowControl 硬件流控制
Clock 同步时钟 配置是否打开
CPOL 极性 配置串口空闲为低电平,高电平
CPHA 相位 配置选择边沿
LastBit 最后一位时钟 配置使能还是关闭
注:usart 通用同步异步收发机 百度翻译为使用
init 最开始的地方
Cmd 命令
USART_Init 初始化函数
USART_Cmd 串口使能函数
USART_ITConfig 中端配置函数
USART_SendData 串口发送函数
USART_ReceiveData串口接收函数
USART_GetFlagStatus获取相应的串口标志位
UASRT_GetITStayus 中断状态位获取
如何配置串口的发送
1.配置时钟:GPIO口的时钟,串口的时钟,引脚复用的时钟
2.配置GPIO的结构体
3.配置串口的结构体
4.串口的发送
3.通用定时器
定时器
APB1是低速时钟(分频)
APB2
STM32F1xx系列总共由八个定时器
高级定时器(两个)
TIM1,TIM8
16位
计数器模式:上,下,上/下
DMA请求:可以
捕获比较通道 :4
有互补输出
+
通用定时器(四个) 定时计数,PWM输出,输入捕获输出比较
位于ABP1低速总线上
TIM2~TIM5
16位
计数器模式:上,下,上/下
DMA请求:可以
捕获比较通道 :4
无
每个通用定时器都完全独立,没有互相共享任何内存
+
基本定时器(两个) 驱动DAC
16位
计数器模式:上,下,上/下
DMA请求:可以
捕获比较通道 :0
无
计数模式:
向上计数模式:0慢慢升到100,然后立即降为0,然后慢慢升为100........
向下计数模式:开始为100,然后降为0,然后因为某事件变成100........
中央对齐模式:从0慢慢升到100,然后慢慢降到0,........
时钟模块
1.时钟部分(始终来源)
内部时钟APB1倍频器
用的最多的三个部分: (时基单元)
预分频器(PSC)寄存器
计数器(CNT)计数器
自动重装载寄存器
4.定时器中断结构体配置函数
定时器结构体函数
APB1时钟的计算方法
APB1时钟 ---乘1/除2-->F(CK_PSC)---除N-->CK_CNT
|
|
CK_INT(定时器时钟)
除非APB1分频系数为1,否则通用定时器时钟为PAB1的两倍
举例: AHB=72M
APB1=36M(分频系数为2)
通用定时器时钟为36*2=72M
结构体配置
最常讲的三个
TIM_Prescaler: 初始化预分频值
TIM_Period: 设定自动重装载值
TIM_CounterMode:设定计数模式
TIM_ClockDivision:输入捕获使用
TIM_RepetitionCounter:高级定时器使用
定时器库函数结构体
TIM_TimeBaseInit: 定时器初始化
TIM_Cmd: 定时器使能
TIM_GetFlagStatus:定时器状态标志位
TIM_ClearFlag: 定时器清除标志位
TIM_GetITStatus:定时器中断标志位
TIM_ClearITPendingBit:定时器清除中断标志位
(是不是感觉跟串口很像!!没错,固件库就是这么玩的!!!)
定时器中断配置过程
1.使能时钟 定时器时钟
2.配置定时器结构体
3.开启定时器中断,配置中断结构体
4.中断服务函数
定时器配置LED每秒闪烁一次
Tout=[重装载值(ARR+1)*分频系数(PSC+1)]/Tclk
Tout=100000(9999+1)*7200(分频系数 7199+1) /72M(72000000)
5.端口复用,重映射
老实说,这块我不太懂,改天找大佬问问
端口复用,重映射(没太懂)
什么是部分重映射和完全重映射
部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚
完全重映射:功能外设的所有引脚都是重新映射
搜索给的解释是:
例如:
复用功能 USART3_REMAP[1:0]=00 。。。。 。。。。
(没有重映射) (部分重映射) (完全重映射)
TX PB10 PC10 PD8
RX PB11 PC11 PD9
CK PB12 PC12 PD10
CTS PB13 PD11
RTS PB14 PD12
1.部分重印像只适用于64,100和144脚的封装
2.完全重印像只适用于100和144脚的封装
6.定时器输出PWM原理
定时器输出PWM原理及结构体(难道有点大)
PWM(Pulse Width Modulation)脉宽调制
通用定时器输出PWM
以TIM3为例,STM32的通用定时器分为TIM2,TIM3,TIM4,TIM5,每个定时器都有独立的四个通道可以作为:输入捕获,输出比较,PWM输出,单脉冲模式输出等
STM的定时器除了TIM和TIM7(基本定时器)之外,其他定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多输出30路PWM输出!
以向上技术为列,讲讲PWM原理
当CNT小于CCRx时,TIMx_Chx通道输出低电平
当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平
所谓脉宽调制信号(PWM波),就是一个YTIMx_ARR自动重装载寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号
定时器输出PWM库函数讲解
TIM_OCxInit 结构体初始化
TIM_SetCompare1 设置比较值函数
TIM_OC1PreloadConfig 使能输入比较预装载
TIM_ARRPreloadConfig 使能自动重装载的预装载寄存器允许位
TIM_OC1PolarityConfig 配置修改极性
还是结构体配置
typedef struct
{
TIM_OCMode 配置PWM模式1还是模式2
TIM_OutputState 配置输出使能/OR使能
TIM_Pulse 配置比较值,CCRx
TIM_OCPolarity 比较输出极性
........
..........
......
}
模式1 边沿对其模式
向上计数时:当TIMx_CNT<TIMx_CCRx时通道1为有效电平,否则为无效电平
向下计数时:一旦TIMx_CNT>TIM_CCRx,CCR1通道1为无效电平,否则为有效电平
模式二 中央对齐模式
向上计数时:当TIMx_CNT<TIMx_CCRx时通道1为无效电平,否则为有效电平
向下计数时:一旦TIMx_CNT>TIM_CCRx,CCR1通道1为有效电平,否则为无效电平
PWM的内部运行机制
CCR1:设置捕获比较寄存器,设置比较值
CCMR1寄存区:设置PWM、模式1或者PWM模式2
COCER:P位:输出/捕获:设置极性:0高电平有效,1低电平有效
E位:输出/捕获:使能端口
自动加载的预加载寄存器
简单来说
APER=1,ARR立即有效
APER=0,ARR下个周期有效
void TIM_ARRPreloadConfig(Tim_TypeDef* TIMx,FunctiongalState NewState);
SPI,IIC,DMA,ADC一点点tips
关于IIC和SPI总线
IIC :为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了 ‘Inter-Integrated Circuit’,IIC 或 IIC ,一种只使用二根线接连所有外围芯片的总线协议
spi : SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。SPI总线是微控制器四线的外部总线(相对于内部总线。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节
SPI: 四种信号线协议
SPI Master : SLCK ---> SCLK SPI Slave
MOSI--->MOSI
MISO<---MISO
-ss---> -ss
....................
§ SCLK: Serial Clock (output from master);
§ MOSI; SIMO: Master Output, Slave Input(output from master);
§ MISO; SOMI: Master Input, Slave Output(output from slave);
§ SS: Slave Select (active low, outputfrom master).
SPI: 模式0,模式1,模式2,模式3
它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA
DMA:直接储存器访问
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的
作用:为CPU减负
从外设(TIMx、ADCx、SPIx、I2Cx、和USARTx)产生的DMA请求,通过逻辑或输入到DMA控制器,这就意味着同时只能有一个请求有效(在同一时间,就只能使用其中的一个,其他通道也类似)。外设的DMA请求,可以通过设置相应的外设寄存器中的控制位,被独立的开启或关闭。
看到这里串口DMA请求的定义就出来了:先举个例子:譬如我想用串口发送数据到PC机,一般做法是CPU通过APB1/APB2总线往串口写数据,然后串口发送;或者是CPU通过总线从串口取(读)数据;如果此时CPU处理的任务非常多,这就会耗费CPU的处理时间。
而我们如果用DMA来传送数据那就很快了,DMA会通过自己的特定通道将数据从一个地址空间复制到另一个地址空间,而且不需要CPU的干预。所以串口DMA请求的定义是:串口要发送/接收数据会请求DMA来完成数据的写和读(注意这句话只针对本文!)
ADC:STM32f103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生
就是转换
我不行了回去睡觉了,明天把没优化的补完!!!!
冲冲冲!!!!!