第六章
1、嵌入式系统中延时实现的方式及其优缺点
1.完全硬件实现
优点:使用电容及电阻即可完成特定的振荡延时作用
缺点:延时时间无法改变
2纯软件方式
优点:实现简单
缺点:由于不同的微控制器,每条指令执行的时间不一样,很难做到精确延时
cpu被占用,利用率不高。
3. 微控制器中的可编程/可定时计数器
优点:通用强,用户可编程,可重复利用,不占用cpu,成本低
2、STM32 F103中的基本定时器、通用定时器及高级定时器的区别(包括所在总线及功能区别)
总线:基本定时器APB1、通用定时器APB1、高级定时器APB2
功能区别:基本定时器相对通用定时器和高级定时器,无外部事件计数,定时器或触发级联、4个独立的输入捕获、输出比较通道、单脉冲输出方式等.。通用定时器相比高级定时器少了刹车信号输入,没有7路3对pwm互补输出带死区产生。P252
3、定时器的时钟源有哪些?
基本定时器的时钟
来源于内部时钟CK_INT,内部时钟CK_INT来源于RCC的TIM_CLK,TIM_CLK来源于APB1的分频输出。 TIM6.TIM7
通用定时器的时钟源
内部时钟CK_INT、内部触发输入ITRX、外部输入捕获引脚TIx、外部触发输入引脚。TIM2-TIM5 APB1
高级定时器的时钟源
TIM1和TIM8的内部时钟CK_INT的来源TIMxCLK来自于APB2的预分频器的输出。
4、定时器的工作模式
基本定时器(只能工作在向上计数模式)
计数模式
向上计数:计数器在计数器时钟作用下累加,从0开始计数到自动重装在寄存器TIMx_ARR的预设值。
通用定时器
计数模式
向上计数:计数器在计数器时钟作用下累加,从0开始计数到自动重装在寄存器TIMx_ARR的预设值。
向下计数:计数器在计数器时钟作用下从自动重装在寄存器TIMx_ARR预设值开始向下计数到0。
双向计数:先向下计数然后向上计数,或相反
输出比较模式
输出比较模式用于控制一个输出波形或指示已经持续的一段时间。
PWM输出模式
PWM(Pulse Width Modulation),脉冲宽度调制,简称脉宽调制,利用微控制器的数字输出来对模拟电路进行控制
TIM6和TIM无PWM输出 TIM1和TIM8可以同时产生7路PWM输出; TIM2-5可以同时产生4路PWM输出。
输入捕获模式
PWM输入模式
单脉冲模式
同步(接力模式)
5、PWM的作用及其实现方式
作用:利用微控制器的数字输出来对模拟电路进行控制
实现方式:
1传统的数字电路方式2.微控制器普通I/O模拟方式3.微控制器的PWM直接输出模式。
6、定时器中预分频、自动重装载、捕获/比较寄存器的初始值的设置
捕获/比较寄存器预设值为A,自动重装载寄存器的预设值N,
,PWM输出信号的占空比为A/(N+1)
7、定时器延时时间的计算
延时时间=(Timx_ARR+1)(TIMx_PSC+1)/TIMxCLK
例:
以时钟频率72MHZ为例,要计数500us,则预分频值和计数值为多少?
解:时钟频率72MHZ,其时钟周期为1/72000000 s,500us则需要50072个时钟周期。若预分频值为71,则计数器时钟频率为1MHZ,时钟周期为1/1000000s, 500us需要500个时钟周期,则计数值为499.
8、定时器相关库函数的使用(arr,psc及ccr值的设置,定时器中断的使用)
以精确定时led闪烁(熄灭500ms,亮500ms)为例
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler=3600-1;
TIM_TimeBaseStructure.TIM_Period=1000-1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_Init(Tim2,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_Cmd(TIM2,ENABLE);
while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==RESET);
以pwm输出为例
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 1-1; //0-65535
TIM_TimeBaseStructure.TIM_Period = 720-1; //0-65535
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//PWM Output Active(during the TIM_Pulse) Polarity
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TimOCInitStructure.TIM_Pulse =72;
//Enable Output State
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//Initialize TIM1_CH1
TIM_OC1Init(TIM1, &TimOCInitStructure);
定时器中断的使用
配置中断
NVIC_Config()
{
NVIC_InitStructure.NVIC_IRQNChannel=TIM2_IRQn;
}
打开TIM中断
TIM_ITConfig(TIM2,ENABLE)
第七章
1、什么是中断
在计算机执行程序的过程中,出现了某个特殊情况,cpu会中止当前程序的执行,转而去执行该事件的中断服务程序,中断服务程序执行完毕后,再返回端点执行原来的程序,这个过程称为中断。
2、中断的处理过程、中断向量表
1.中断响应(硬件自动实现):(1)保护现场(2)找到该中断对应的中断服务程序的地址——中断向量表
2.执行中断服务程序(用户编程)
3.中断返回:恢复现场
3、中断的利弊
中断之利
使计算机系统能够快速响应紧急事件或优先处理重要任务。
减少CPU负荷。
提高系统效率。
中断之弊
中断会增加程序执行的不确定性和时间长度。
中断会抢占正在使用的资源。
中断嵌套会增加栈空间。
4、STM32 中NVIC的中断优先级处理
抢占优先级,抢占优先级决定了是否会有中断嵌套发生,一个具有高抢占先优先级的中断会打断当前正在执行的中断服务程序,转而执行它对应的中断服务程序。
子优先级,在抢占优先级相同的情况下,如果有中断正被处理,那么高子优先级的中断只好等待正被响应的低子优先级中断处理结束后才能得到响应。在抢占优先级相同的情况下,如果没有中断正被处理,那么高子优先级的中断将优先被响应。
两者都相同时,比较它们在中断向量表中的位置,置低的中断优先响应。
5、STM32中断服务函数的作用及其特点
作用:当有中断发生时,在中断向量表中查找中断服务程序的入口地址,通过中断服务程序来响应中断。
特点:1.中断服务程序既没有参数,也没有返回值,不由用户调用,而是由硬件自动调用。
2. 预置弱定义属性。
3. 在中断服务程序中修改,在其他程序中访问的变量,需要在其定义和声明中加入volatile修饰词。
6、中断相关库函数(中断通道、优先级分组的设置)
7、外部中断/事件控制器EXTI的特性及其使用方式
STM32微控制器的外部中断∕事件控制器EXTI,由19根外部输入线、19个产生中断∕事件请求的边沿检测器和APB外设接口等部分组成。
特性
每个外部中断∕事件输入线都可以独立地配置它的触发事件(上升沿、下降沿或双边沿),并能够单独地被屏蔽;
每个外部中断都有专用的标志位(请求挂起寄存器),保持着它的中断请求;
可以将多达112个通用I/O引脚映射到16个外部中断∕事件输入线上;
可以检测脉冲宽度低于APB2时钟宽度的外部信号;
使用方式
如果使用STM32F103引脚的外部中断∕事件映射功能,必须打开APB2总线上该引脚对应端口时钟以及AFIO功能时钟。
8、volatile关键字的作用,并使用中断举例
volatile关键字不会让编译器进行优化,每次读取或修改变量中的值时,都必须重新从内存或者寄存器中读取或者修改。
中断举例
在中断服务程序中修改,在其他程序中访问的变量,需要在其定义和声明中加入volatile修饰词。
定时器中断
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
第八章
1、DMA的定义及传输要素
DMA(Direct Memory Access,直接存储器存取),是一种完全由硬件执行数据交换的工作方式。它由DMA控制器而不是CPU来控制在存储器和存储器、存储器和外设之间的批量数据传输。
传输源
传输目标
传输数据量
触发信号
2、DMA的传输过程
DMA请求:CPU初始化DMA控制器,外设(I/O接口)发出DMA请求。
DMA响应:DMA控制器判断DMA请求的优先级及屏蔽,向总线仲裁器提出总线请求。
DMA传输:DMA数据以规定的传输单位(通常是字)传输.直至达到预先设定的传送单位数量为止。
DMA结束:当规定数量的DMA数据传输完成后,停止传输,DMA控制器向cpu发送信号报告传输完成,同时释放总线控制权。
DMA的优缺点及其适用场景
优点
提高CPU利用率
提高数据传输效率
用户软件开发代码更方便
缺点
在一段时间内对独占总线
传输数据量过大,会导致中断延时较长,实时性强系统不适用
适用:高速、成组数据的传输
3、STM32中DMA的特点
1.DMA可实现存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。
2.DMA具有12个独立的可配置的通道∕请求,DMA1有7个触发通道,DMA2有5个触发通道。每个触发通道可对应不同的外设。当在存储器之间使用DMA进行数据传输时,可使用任意DMA的任意通道;
3.每个通道专用的硬件DMA请求,也有软件触发。
4.每个DMA通道都有3个事件标志:DMA半传输、DMA传输完成和DMA传输出错,这3个事件标志逻辑或成为一个单独的中断请求;
5.可编程的DMA数据传输数量最大为65535;
4、STM32中DMA的优先级机制
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
─ 最高优先级
─ 高优先级
─ 中等优先级
─ 低优先级
硬件:较低编号的通道比较高编号的通道有较高的优先级。
5、STM32中DMA的传输模式
STM32微控制器支持循环模式和普通模式两种工作模式
STM32中DMA的常用初始化过程(以flash到SRAM为例)
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void DMA_config(void)
{
DMA_InitTypedef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA_Channel6);
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)SRC_CONST_Buffer;
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)DST_Buffer;
DMA_InitStructure.DMA_BufferSize=BUFFERSIZE
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDatasize=DMA_PeripheralDatasize_Word;
DMA_InitStructure.DMA_MemoryDatasize=DMA_MemoryDatasize_Word;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_InitStructure.DMA_M2M=DMA_M2M_Enable;
DMA_Init(DMA1_channel6,&DMA_InitStructure);
DMA_ITConfig(DMA_Channel6,DMA_IT_TC,ENABLE)
DMA_Cmd(DMA_Channel6,ENABLE);
}
DMA的常用库函数(主要在初始化时结构体变量的设置)
Void DMA_Channel6_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC6)
{
DMA_ClearITPendingBit(DMA1_IT_TC6);
}
DMA_ITConfig(DMA_IT_TC,ENABLE)
DMA_IT_TC 传输完成中断
DMA_IT_HT 传输过半中断
DMA_IT_TE 传输错误
第九章
1、ADC的过程包括哪些
采样(采样频率应大于等于被测信号量的2倍以上才能复原信号)、量化、编码
2、ADC的性能参数
量程:单极性、双极性
分辨率: ADC所能分辨的最小的模拟输入量,分辨率有ADC的量化位数n决定,一个n位ADC的分辨率等于ADC的满量程与2的n次方的比值。
精度:指实际需要的模拟输入值与理论上要求的输入模拟值之间的差值
转换时间: 等于ADC的量化时间+编码时间+采样时间。采样速率必须小于或等于转换速率。
3、ADC的主要类型及其各自优缺点
逐次逼近型ADC 转换精度高、转换速度快,但抗干扰性差
电压时间转换型ADC(双积分型) 转换精度高、抗干扰性好,但转换速度慢
电压频率转换型 ADC 转换精度高、抗干扰性好、转换速度慢
4、STM32 F103中ADC的内部结构
模拟至数字转换器
在ADC时钟ADCCLK的驱动下对规则通道或注入通道中的模拟信号尽心采样、量化和编码
数据寄存器
用来存放模拟至数字转换器的转换结果,模拟至数字转换器的12位转换结果可以以左对齐或右对齐的方式存放在16位的数据寄存器中。数据寄存器可分为1个规则通道数据寄存器和4个注入通道数据寄存器。
5、STM32 F103中ADC主要特性:
1-3个12位逐次逼近型ADC
每个ADC最多有18路模拟输入通道,可测量16个外部信号和2个内部信号。
ADC数模转换可以单次、连续、扫描或间断模式进行,每次转换结束后转换结果以左对齐或者右对齐的方式存储在16位数据寄存器中,同时产生中断请求,并且ADC1和ADC3可以产生DMA请求。
ADC可将18路通道分为规则转换组和注入通道组,其中规则通道组最多包含16路通道,注入通道组最多包含4路通道。仅有规则通道可以产生DMA请求。
规则通道组数据寄存器有一个,注入通道组有四个,规则组通道最多可达16个,公用一个数据寄存器ADC_DR,因此,当多个规则通道转换时需要用到DMA,以免丢失ADC_DR中的内容。而每个注入组通道均有对应的数据寄存器,因此注入组通道不需要DMA。
6、STM32 中ADC的通道及分组
规则通道组(相当于正常运行的程序)
最多有16个规则通道。当每个规则通道转换完成后,将转换的结果存入同1个规则通道数据寄存器中,可产生ADC转换完成事件,可产生对应的中断和DMA请求。
注入通道组 (相当于中断)
最多有4个注入通道,有4个注入通道数据寄存器来存放注入通道的转换结果,通道转换完成后,可产生ADC转换完成事件,可产生中断,但不具备DMA传输能力。
注入通道组转化的启动有两种方式:触发注入和自动注入
触发注入:在规则通道转换期间,如果有外部触发注入产生,那么当前的规则通道被复位,注入通道将以单次扫描转换的方式进行转换。当注入通道转换期间,如果有规则通道组的触发事件,注入通道不会被中断。
自动注入:规则通道转换完成后,将自动进行注入通道转换。反之,若注入通道转换完成之后,不会自动进行规则通道转换。
7、ADC转换时间的计算
ADC预分频系数可以是2、4、6、8,并且ADCCLK最大不能超过14MHZ。最短转换时间1微秒。选取最小1.5个周期的采样时间,T=1.5+12.5=14个ADC时钟周期。 14*(1/(14*1000000))=1微秒
ADC转换时间=采样时间+量化编码时间,量化编码时间是固定的,为12.5个ADC时钟周期,采样时间是可编程的,可以是1.5,7.5,13.5,28.5,41.5…239.5个时钟周期。
8、ADC中断
ADC_IT_EOC:EOC中断,规则通道转换结束中断。
ADC_IT_JEOC: 注入组转换结束中断
ADC_IT_AWD:模拟看门狗中断
9、ADC的工作模式
Stm32f103ADC有两种工作模式:独立模式和双ADC模式
独立模式:每个ADC接口独立工作;
双ADC模式:ADC1为主设备,ADC2为从设备,转换的启动可以是ADC1主和ADC2从的交替触发或同步触发。每次转换完成后,由ADC2转换的数据可以通过双ADC模式,利用ADC1的DMA功能传输。
10、ADC转换模式
针对于单通道
单次转换模式,ADC只执行一次转换,
连续转换模式,ADC转换一结束后马上就启动另一次转换。
针对于多通道
规则转换扫描模式 :单次转换的扫描模式:ADC只执行一次转换,但一次可扫描规则通道组的所有通道。连续转换扫描模式:当ADC对规则通道组一轮转换结束后,立即启动对规则通道组的下一轮转换。
注入转换扫描模式:注入通道的触发转换将中断规则通道的转换,转而执行注入通道的转换,当注入通道全部转换完毕后,再回到被中断的规则通道中继续执行。
间断模式(可将通道转换序列分成多个子序列)
规则通道组的间断模式:每个子序列最多8个规则通道
注入通道组的间断模式:每个子序列最多1个注入通道
11、ADC的过程包括哪些?
(1)输入信号通过ADCx_IN0-ADCx_IN15送到ADC中的模拟至数字转换器;
(2)模拟至数字转换器收到触发信号后开始进行A/D转换,触发信号可以是软件触发也可以是硬件触发(EXTI外部触发或定时器触发)。规则组和注入组触发信号不同;
(3)模拟至数字转换器收到触发信号后,在ADCCLK时钟驱动下,对输入通道进行采样、量化和编码;
(4)在转换完成后,将转换后的12位数值以左对齐或右对齐的方法保存到16位的规则通道寄存器或注入通道寄存器中,产生ADC转换结束/注入转换结束事件,可触发中断或DMA请求。
ADC常用库函数(主要包括注入、规则通道的设置及转换数据的读取、中断的使用)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1)
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_SCanConvMode=DISABLE
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
ADC_InitStructure.ADC_NbrofChannel=1;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_Init(ADC1,&ADC_InitStructure)
ADC_RegualrChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5)//规则通道的设置,1,表示规则通道中的采样顺序
ADC_InjectedChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5)//注入通道的设置
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1))//检测校准位
ADC_StartCalibration(ADC1);//开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//检测ADC1校准是否完毕
ADC_SoftwareStartConvCmd(ADC1,ENABLE)//开始ADC1软件触发转换
if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==SET)//获取ADC转换标志位
ADC_GetConversionValue(ADC1)//得到最近一次的ADC转换结果。
ADC_ITConfig(ADC1,ADC_IT,ENABLE);
ADC_GETITStatus(ADC1,ADC_IT);
ADC_ClearITPendingBit(ADC,ADC_IT);
ADC_DMACmd(ADC1,ENABLE);
第十章
1、数据通信的基本概念(串行与并行、单工、双工、半双工、同步与异步)
串行:用一条数据线一位一位的传输数据
并行:使用多条数据线传输数据
单工:数据只能单向传送
半双工:在一条通路上,数据可以双向传送,但在同一时刻,这条通路上只能有一个方向的数据在传输。
双工:用不同的通路实现数据两个方向的传输。
同步:在发送端和接收端存在一个共同的时钟来协同
异步:发送端和接受端不存在共同的时钟,异步通信以指定的格式打包为帧来进行传输。
2、UART的数据格式及传输速率(传输时间的计算)
起始位:0表示数据传输开始
数据位:可以是5~8位逻辑”0”或”1”;如ASCII码(7位),扩展BCD码(8位);小端传输,即LSB先发,MSB后发
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平
空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送
UART数据传输速率,可以用比特率或者波特率来表示。在实际应用中,常用的UART传输速率有1200、2400、4800、9600、19200、38400、…、115200等。
例如,UART以115.2Kbps的速率使用8个数据位、奇校验、1个停止位的数据格式传输一个大小为1K字节的文件,所需时间为(1024*(8+1+1+1))/(115.210 3) = 97.8ms。
假设 STM32F103 微控制器的 USART1 设置为 38.4kbps,7 位数据位,一位偶校验位,2 位停止位,发送一个大小 1KB 的文件,需要多少时间?
答: 1KB = 1024B = 8x1024bit,大小 1KB 的文件等于 1024 个字,等于 8x1024 个字节。 因为数据帧中的数据位是 7 位,所以 1024B x(7+1)=1024x7+1024(bit) 然后,算法一:{【1024 x(7+1+2+1)】 + 【1024 / 7 x(7+1+2+1)】} /38400=335.2 毫秒 算法二:【1024 x 8 / 7 x(7+1+2+1)】/38400=335.2 毫秒
算法:((文件大小bit传送位数)/数据位数)/比特率
UART采用TTL/CMOS的逻辑电平标准表示数据,高电平表示逻辑1,低电平表示逻辑0.
3、STM32 USART的特性(异步串行全双工,还可以同步单向通信(UART只能异步串行全双工))
STM32F103微控制器小容量产品有2个USART,中等容量产品有3个USART,大容量产品有5个USART+2个UART。
USART1位于高速APB2总线上,其他的USART和UART位于APB1总线上;
全功能可编程串行接口特性:数据位(8或9位);校验位(奇、偶或无);停止位(1或2位);支持硬件流控制(CTS和RTS);
自带可编程波特率发生器(整数部分12位、小数部分4位),最高传输速率可达4.5Mbps;
两个独立带中断的标志位:发送标志位TXE(发送数据寄存器空)和接收标志位RXNE(接收数据寄存器非空)TC发送完成、CTS清除发送;
支持DMA传输:发送DMA请求和接收DMA请求
4、USART使用DMA发送及接收数据的流程
发送数据
- 在DMA控制寄存器上将USART_DR寄存器地址配置成DMA传输的目的地址。
- 在DMA控制寄存器上将存储器地址配置成DMA传输的源地址。
- 在DMA控制寄存器中配置要传输的总的字节数。
- 在DMA寄存器上配置通道优先级。
- 根据应用程序的要求,配置在传输完成一半还是全部完成时产生DMA中断。
- 在DMA寄存器上激活该通道。
接受数据
1.通过DMA控制寄存器把USART_DR寄存器地址配置成传输的源地址。
2.通过DMA控制寄存器把存储器地址配置成传输的目的地址
3.在DMA控制寄存器中配置要传输的总的字节数。
4.在DMA寄存器上配置通道优先级
5.根据应用程序的要求配置在传输完成一半还是全部完成时产生DMA中断
6.在DMA控制寄存器上激活该通道。
当接收完成DMA控制器指定的传输量时,DMA控制器在该DMA通道的中断矢量上产生一中断。
6、USART相关库函数(初始化结构体变量的设置、发送与接收数据、中断相关)
void USART1_Config(unsigned int baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=baud;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_2;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_Cmd(USART1,ENABLE);
}
USART_SendData(USART1,CH)//通过USART发送单个数据
USART_ReceiveData(USART1)//返回指定USART最近接受到的数据
USART_GetFlagStatus(USART1,USART_FLAG_TC);//查询指定USART的标志位状态
USART_ITConfig:使能或禁止指定的USART中断。
USART_GetITStatus:查询指定的USART中断是否发生。
USART_ClearITPendingBit:清除指定的USART中断挂起位
第十一章
1、SPI的物理层接口及互联(串行同步全双工)
一主多从时用SS低电平有效,一个设备通信时,其他设备高阻抗。
2、SPI的时钟极性及时钟相位
时钟极性(CPOL,Clock Polarity),是指SPI通信设备空闲时SPI时钟线SCK的电平。CPOL=0,SCK在空闲状态时为低电平;CPOL=1时,SCK在空闲状态时为高电平
时钟相位SPI,数据接收方在SCK一个时钟周期中的哪个跳变沿从准备就绪的数据线上采样数据。CPHA=0,在SCK时钟线的奇数跳变沿(即第1、3、5…个跳变沿)存取。CPHA=1,在SCK时钟线的偶数跳变沿(即第2、4、6…个跳变沿)存取。
3、SPI的数据格式及传输速率
- 与UART相似,SPI数据传输也是以帧为单位,通常可以选择8位或16位数据帧格式。
- SPI数据,可以由高位到低位(即MSB在前LSB在后),也可以由低位到高位(即LSB在前MSB在后)依次传输
3.SPI具有较高的传输速率,它的时钟SCK最高可达几十MHz。
SPI特性
3. SPI1位于高速APB2总线上,其他的SPI(如SPI2、SPI3等)位于APB1总线上
4. 既可以作为主设备,也可以作为SPI从设备;
5. 主模式和从模式下均可由软件或硬件进行NSS管理,动态改变主∕从操作模式;
6. 可编程的SPI时序:由时钟极性CPOL和时钟相位CPHA决定
可编程的SPI数据格式:8位或16位数据帧;LSB在前或MSB在前的数据顺序
SPI以帧为单位进行传输,可以选择8位或16位数据帧格式。传输顺序分为由高位到低位和由低位到高位两种。
7. 可编程的SPI传输速率:最高SPI速率可达18MHz
8. 可触发中断的两个标志位:发送标志位TXE(发送缓冲区空)和接收标志位RXNE(接收缓冲区非空)
9. 支持DMA功能的1字节发送和接收缓冲区:分别产生发送和接受请求
主模式 配置步骤:
11. 设置SPI串行时钟波特率
12. 设置SPI协议
13. 设置SPI数据格式
14. 设置NSS工作模式
发的过程:发送缓冲区—>移位寄存器—>MOSI
收的过程:MISO—>移位寄存器—>接受缓冲区
从模式 配置步骤:
15. 设置SPI协议
16. 设置SPI数据格式
17. 设置NSS工作模式
18. 清楚SPI_CR1寄存器的MSTR位和设置SPE位。
数据发送:数据先被写入发送缓冲区,当收到时钟信号并在MOSI引脚上输出第一个数据位时,数据发送过程开始(此时第一个被发送出去)。余下的位被装进移位寄存器。(对于8位数据帧格式的还有7位)
5、SPI的状态标志和中断(两个重要的:TXE和RXNE)
TXE(发送缓冲区空闲标志)数据完成从发送缓冲区到移位寄存器的转换和传输时,SPI_SR寄存器中的TXE标志被置位。此时,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。
RXNE(接收缓冲区非空标志)当移位寄存器中接收到的数据字节被全部转换并传送到接收缓冲区时,SPI_SR寄存器中的RXNE标志被置位。此时,如果SPI_CR2寄存器中的RXNEIE位被置1,则会产生中断。
BSY(Busy,忙标志) 为1时表示正在通信,主模式双向接收模式持续为低
6、SPI的常用库函数(初始化设置、收发数据)
SPI_I2S_DeInit(SPI1)
SPI_InitStructure.SPI_Direction=SPI_Direction_FullDuplex;
SPI_Mode=SPIO_Mode_Master SPI_Mode_Slave;
SPI_DataSize=SPI_DataSize_16b SPI_DataSize_8b;
SPI_CPOL=SPI_CPOL_HIGH SPI_CPOL_LOW;
SPI_CPHA=SPI_CPHA_1Edge SPI_CPHA_2Edge;
SPI_NSS=SPI_NSS_Hard NSS SPI_NSS_Soft
SPI_BaudRatePrescaler=SPI_BaudRatePrescaler2
SPI_FirstBit=SPI_FirstBit_MSB SPI_FirstBit_LSB
SPI_CRCPolynomial
SPI_Cmd:使能或禁止指定SPI。
SPI_I2S_SendData:通过SPI/I2S发送单个数据。
SPI_I2S_ReceiveData:返回指定SPI/I2S最近接收到的数据
SPI_I2S_GetFlagStatus:查询指定SPI/I2S的标志位状态。
SPI_I2S_ClearFlag:清除指定SPI/I2S的标志位(SPI_FLAG_CRCERR)。
SPI_I2S_ITConfig:使能或禁止指定的SPI/I2S中断。
SPI_I2S_GetITStatus:查询指定的SPI/I2S中断是否发生。
SPI_I2S_ClearITPendingBit:清除指定的SPI/I2S中断挂起位(SPI_IT_CRCERR)。
第十二章 IIC (同步串行半双工)
1、I2C的物理层接口(电平特性)及互联
SCL(Serial Clock,串行时钟线):I2C通信中用于传输时钟的信号线,通常由主机发出。SCL采用集电极开路或漏极开路的输出方式。IIC只能使SCL下拉到逻辑0,而不能强制SCL上拉至逻辑1.
SDA(Serial Data,串行数据线):I2C通信中用于传输数据的信号线。与SCL类似,SDA也采用集电极开路或漏极开路的输出方式。IIC只能使SDA下拉到逻辑0,而不能强制SDA上拉至逻辑1.
2、I2C、SPI及UART三者之间的对比
19. I2C是同步半双工通信,SPI是同步全双工通信,USRAT是异步全双工通信。
20. 在物理层接口发面,I2C有SCL根串行时钟线和SDA串行数据线,仅用两根线,SPI有SCK时钟线,MOSI主机输出/从机输入数据线,MISO主机输入/从机输出数据线,SS片选信号线。USART有RX,TX以及GND.
21. 在传输数据时,I2C高位在前,低位在后,由高位到低位传输,USART低位在前,高位在后,由低位到高位传输,SPI可有用户自定义是高位到低位传输,还是低位到高位传输。
22. 三者都产生中断,并调用DMA请求
23. SPI和I2C都存在主从设备,SPI用片选信号选择从机,I2C用地址选择从机
24. 传输速率:SPI最快
3、与SPI互联相比,I2C互连有什么特点?
(1)必须在I2C总线上外接上拉电阻。
(2)通过地址区分挂载在I2C总线上不同的器件。
(3)支持多主机互连。
4、I2C中的主从机、收发器的概念
主机:初始化发送、产生时钟和终止发送的器件,通常是微控制器
从机:被主机寻址的器件;
发送器:本次传输中发送数据到I2C总线的器件,既可以是主机也可是从机,由通信过程具体确定;
接收器:本次传输中从I2C总线上接收数据的器件,既可以是主机也可以从机,由通信过程具体确定;
5、I2C中的起始条件、停止条件、数据有效性及数据格式
起始条件(起始信号)
当SCL为高电平时,SDA上由高到底的跳变。
数据有效性
SDA的数据线必须在SCL为高电平时内保持稳定,只能在SCL为低电平时改变。否则,被误判为起始位或停止位。
停止条件(停止信号)
当SCL为高电平时,SDA上由低到高的跳变
每当发送器发送一个字节,接收器必须发送一个应答位,确认是否接收。
6、I2C一次通信过程的组成及传输速率
一次标准的I2C数据流通信,通常由起始信号、从机地址传输、数据传输和停止信号组成。
I2C的标准传输速率为100Kbps,快速传输可达400K bps。目前,还增加了高速模式,最高传输速率可达3.4Mbps。
STM32中I2C的特性
1.所有的I2C都位于APB1总线;
2.支持标准(100Kbps)和快速(400Kbps)传输速率;
3.所有的I2C可工作于主模式或从模式,可以作为主发送器、主接收器、从发送器或者从接收器;
4.支持7位或10位寻址和广播呼叫
具有3个状态标志:发送器/接收器模式标志、字节发送结束标志、总线忙标志;
具有2个中断向量:1个中断用于地址∕数据通讯成功,1个中断用于错误