




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM微控制器与嵌入式系统
串口通信内容串口通信协议:物理层和协议层物理层RS232标准串口通信USB转串口通信串口到串口通信协议层串口通信协议串口通讯(SerialCommunication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。串口通信协议物理层:规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬件部分。协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。串口通信协议物理层标准RS232标准USB转串口串口到串口RS232标准串口RS-232标准主要规定了:信号的用途通信接口信号的电平标准RS232标准串口RS232标准串口通信结构图RS232标准串口主要用于工业设备直接通信由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通信。RS232标准串口根据通信使用的电平标准不同,串口通信可分为TTL标准及RS-232标准。通信标准电平标准(发送端)5VTTL逻辑1:2.4V-5V逻辑0:0-0.5VRS-232逻辑1:-15V~-3V逻辑0:+3V~+15VRS232标准串口RS232标准串口通信结构图电平转换芯片一般有MAX3232,SP3232RS232标准串口RS232标准串口DB9标准的公头及母头接法RS232标准串口两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以DB9母头的收发信号接法一般与公头的相反。两个设备之间连接使用“直通型”的串口线即可。在目前的其它工业控制使用的串口通信中,一般只使用RXD、TXD以及GND三条信号线,直接传输数据信号。USB转串口通信USB转串口主要用于设备跟电脑通信电平转换芯片一般有CH340、PL2303、CP2102、FT232使用的时候电脑端需要安装电平转换芯片的驱动串口到串口通信原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块串口通信协议层串口通信的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通信的协议层中,规定了数据包的内容。它由启始位、主体数据、校验位以及停止位组成。通信双方的数据包格式要约定一致才能正常收发数据。串口通信协议层波特率起始位和停止位有效数据校验位串口通信协议层波特率串口异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为4800、9600、115200等。串口通信协议层起始位和停止位起始位:由1个逻辑0的数据位表示结束位:由0.5、1、1.5或2个逻辑1的数据位表示(只要双方约定好即可)有效数据在起始位后紧接着的就是要传输的主要内容有效数据的长度常被约定为5、6、7或8位长串口通信协议层校验位:可选,增强数据的抗干扰性。校验方法分为:奇校验(odd)偶校验(even)
0校验(space)1校验(mark)无校验(noparity)串口通信协议层奇校验(odd)有效数据和校验位中“1”的个数为奇数比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位偶校验(even)
有效数据和校验位中“1”的个数为偶数比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到偶校验效果,校验位为“0”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位串口通信协议层0校验不管有效数据中的内容是什么,校验位总为“0”1校验校验位总为“1”无校验数据包中不包含校验位小结串口通信协议:物理层和协议层物理层RS232标准串口通信USB转串口通信串口到串口通信协议层ARM微控制器与嵌入式系统
STM32-USART主讲人:景妮琴北京电子科技职业学院内容串行接口STM32-USART功能框图功能引脚数据寄存器控制器小数波特率生成串行接口串行接口:简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是指采用串行通讯方式的扩展接口。USART与UARTUSART:通用同步异步收发器UART:通用异步收发器STM32芯片具有多个USART和UART外设用于串口通讯STM32-USARTSTM32F407ZGT6有四个USART和两个UART,其中USART1和USART6的时钟来源于APB2总线时钟,其最大频率为84MHz,其他四个的时钟来源于APB1总线时钟,其最大频率为42MHz。STM32-USARTUSART满足外部设备对工业标准NRZ异步串行数据格式的要求使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会)SIRENDEC规范。STM32-USART功能框图113412STM32-USART功能框图-功能引脚TX:发送数据输出引脚。RX:接收数据输入引脚。SW_RX:数据接收引脚,只用于单线和智能卡模式。nRTS:请求以发送(RequestToSend),n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。nCTS:清除以发送(ClearToSend),n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。STM32-USART功能框图-功能引脚STM32F407ZGT6有四个USART和两个UART,其中USART1和USART6的时钟来源于APB2总线时钟,其最大频率为84MHz,其他四个的时钟来源于APB1总线时钟,其最大频率为42MHz。UART只是异步传输功能,所以没有SCLK、nCTS和nRTS功能引脚从上表可发现USART的功能引脚有多个,只要在程序编程时软件绑定引脚即可。STM32-USART功能框图-数据寄存器USART的数据寄存器USART_DR包含了发送数据寄存器或者接收数据寄存器。一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR写入数据会自动存储在TDR内。如我们要发送TEMP这个数据,就可以进行操作:USART_DR=TEMP;TEMPSTM32-USART功能框图-数据寄存器当进行读取操作时,向USART_DR读取数据会自动提取RDR数据。如我们要读取数据,就会使用TEMP这个变量从USART_DR取得数据,TEMP=USART_DR;TEMPSTM32-USART功能框图-控制器USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。STM32-USART功能框图-波特率生成波特率单位时间内传输的码元个数。比特率指单位时间内传输的比特数,单位bit/s(bps)。USART串口传输时的比特数与码元相同,因此波特率=比特率。波特率越大,传输速率越快。STM32-USART功能框图-波特率生成USART的发送器和接收器使用相同的波特率。USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义,USARTDIV的小数部分,DIV_Fraction[3]位只有在OVER8位为0时有效,否则必须清零。以115200为例。这里的OVER8我们取0,表示16倍过采样USART:USART1,时钟为84M波特率:115200OVER8:0,16倍过采样,BRR小数位有效STM32-USART功能框图-波特率生成小结STM32的USARTSTM32-USART功能框图功能引脚数据寄存器控制器小数波特率生成ARM微控制器与嵌入式系统
USART编程要点主讲人:景妮琴北京电子科技职业学院内容串口硬件连接串口编程要点USART结构体初始化USART库函数USART发送接收数据串口硬件连接以单片机与PC通信为例:USART通过3个引脚与其他设备连接在STM32的USART1中:RX:数据串行输入。PA10TX:发送数据输出。PA9GND串口硬件连接TXPA10RXPA9串口硬件连接串口编程要点1.使能RX和TX引脚GPIO时钟和USART时钟;2.初始化GPIO,并将GPIO复用到USART上;3.配置USART参数;4.配置中断控制器并使能USART接收中断;5.使能USART;6.在USART接收中断服务函数实现数据接收和发送。串口编程要点1.使能RX和TX引脚GPIO时钟和USART时钟使能GPIO时钟:PA9和PA10的GPIO口时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);串口编程要点1.使能RX和TX引脚GPIO时钟和USART时钟使能USART时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);串口编程要点2.初始化GPIO,并将GPIO复用到USART上;初始化GPIOGPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_9;GPIO_Init(GPIOA,&GPIO_InitStructure);串口编程要点2.初始化GPIO,并将GPIO复用到USART上;将GPIO复用到USART上voidGPIO_PinAFConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF)GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体typedefstruct{uint32_tUSART_BaudRate;//波特率BRRuint16_tUSART_WordLength;//字长CR1_Muint16_tUSART_StopBits;//停止位CR2_STOPuint16_tUSART_Parity;//校验控制CR1_PCE、CR1_PSuint16_tUSART_Mode;//模式选择CR1_TE、CR1_REuint16_tUSART_HardwareFlowControl;//硬件流选择CR3_CTSE、CR3_RTSE}USART_InitTypeDef;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_BaudRate;波特率一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV值,并设置USART_BRR寄存器值USART_InitStructure.USART_BaudRate=115200;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_WordLength数据帧字长,可选8位或9位。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。USART_InitStructure.USART_WordLength=USART_WordLength_8b;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_StopBits停止位设置,可选0.5个、1个、1.5个和2个停止位,一般我们选择1个停止位。USART_InitStructure.USART_StopBits=USART_StopBits_1;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_Parity奇偶校验控制选择。可选择无校验,偶校验,奇校验USART_InitStructure.USART_Parity=USART_Parity_No;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_ModeUSART模式选择,有USART_Mode_Rx
和USART_Mode_TxUSART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//同时使能收发串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体USART_HardwareFlowControl硬件流控制选择,只有在硬件流控制模式才有效可选有⑴使能RTS、⑵使能CTS、⑶同时使能RTS和CTS、⑷不使能硬件流。USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;串口编程要点-USART结构体初始化3.配置USART参数;--USART结构体
/*完成USART初始化配置*/USART_Init(DEBUG_USART,&USART_InitStructure);串口编程要点-USART结构体初始化4.配置中断控制器并使能USART接收中断;NVIC_Configuration();
/*嵌套向量中断控制器NVIC配置*/USART_ITConfig(DEBUG_USART,USART_IT_RXNE,ENABLE);/*使能串口接收中断*
串口编程要点-USART结构体初始化5.使能USART;USART_Cmd(DEBUG_USART,ENABLE);6.在USART接收中断服务函数实现数据接收和发送。常用的USART库函数函数USART_Init初始化异步串口,包括选定使用的串口,设定串口的数据传输速率、数据位、检验方式、停止位、流量控制方式USART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);USART_Init(USART1,&USART_InitStructure);常用的USART库函数函数USART_Cmd使能或失能USART外设voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);USART_Cmd(USART1,ENABLE);//使能USART_Cmd(USART1,DISABLE);//失能常用的USART库函数函数USART_ITConfig使能或失能指定的USART中断voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalStateNewState);常用的USART_IT的值有:USART_IT_TXE(发送数据寄存器为空),USART_IT_RXNE(接收数据寄存器非空,即有数据可读)USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断常用的USART库函数函数USART_SendData数据发送函数,通过外设USARTx发送单个数据voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);USART_SendData(USART1,0x26);//通过USART1发送字符0x26这里要说明的是发送的Data是字符常用的USART库函数函数USART_ReceiveData数据接收函数,返回外设USARTx接收的数据uint16_tUSART_ReceiveData(USART_TypeDef*USARTx);RxData=USART_ReceiveData(USART1);//从USART1接收的字符存入RxData中常用的USART库函数函数USART_GetFlagStatus检查指定的USART标志位设置与否FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint32_tUSART_FLAG);USART_FLAG为需要检查的USART标志位,可以取一个或多个值的组合作为该参数的值USART_FLAG的值有:USART_FLAG_RXNE(接收数据完成),USART_FLAG_TXE(发送数据寄存器为空),USART_FLAG_TC(发送数据完成)Status=USART_GetFlagStatus(USART1,USART_FLAG_TXE);//检查USART1的发送标志位常用的USART库函数函数USART_ClearFlag清除USART的待处理标志位voidUSART_ClearFlag(USART_TypeDef*USARTx,uint32_tUSART_FLAG);USART_ClearFlag(USART1,USART_FLAG_ORG);//清除USART1的溢出错误标志位常用的USART库函数函数USART_GetITStatus检查指定的USART中断发生与否ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint32_tUSART_IT);USART_IT为需要检查的USART中断标志位常用的USART_IT的值有:USART_IT_TXE(发送数据寄存器为空),USART_IT_RXNE(接收数据寄存器非空,即有数据可读)Status=USART_GetITStatus(USART1,USART_IT_TXE);//检查USART1的发送中断标志位常用的USART库函数函数USART_ClearITPendingBit清除USART的中断标志位voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint32_tUSART_IT);USART_ClearITPendingBit(USART1,USART_IT_TXE);//清除USART1的发送数据中断标志位常用的库函数函数GPIO_PinAFConfig配置GPIO的某个引脚为具体的第二功能voidGPIO_PinAFConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF);GPIO_AF的值有:GPIO_AF_USART1,GPIO_AF6_SPI1等GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//配置PA9为它的第二功能串口发送接收数据小结串口硬件连接串口编程要点USART结构体初始化USART库函数USART发送接收数据ARM微控制器与嵌入式系统
USART编程实验主讲人:景妮琴北京电子科技职业学院内容串口硬件连接串口软件编程串口接发数据调试串口硬件连接TXPA10RXPA9串口软件编程1.使能RX和TX引脚GPIO时钟和USART时钟;2.初始化GPIO,并将GPIO复用到USART上;3.配置USART参数;4.配置中断控制器并使能USART接收中断;5.使能USART;6.在USART接收中断服务函数实现数据接收和发送。串口收发数据小结串口硬件连接串口软件编程串口接发数据调试ARM微控制器与嵌入式系统
Systick-系统定时器主讲人:景妮琴北京电子科技职业学院内容Systick系统定时器系统定时器工作原理Systick寄存器Systick库函数Systick编程要点SysTick系统定时器SysTick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。一般在STM32+UCOSII系统中,都采用Systick定时器来做为UCOSII的心跳时钟。SysTick系统定时器Systick定时器就是系统滴答定时器,一个24
位的倒计数定时器,计到0
时,将从RELOAD
寄存器中自动重装载定时初值。只要不把它在SysTick
控制状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。Systick中断的优先级也可以设置。typedefstruct{__IOuint32_tCTRL;/*SYST_CSR控制与状态寄存器*/__IOuint32_tLOAD;/*SYS_RVR重装载寄存器*/__IOuint32_tVAL;/*SYST_CVR当前数值寄存器(计数器)*/__Iuint32_tCALIB;/*SYST_CALIB校准寄存器*/}SysTick_Type;
Systick寄存器Bit0 0=滴答定时器失能 1=滴答定时器使能Bit1 0=不开启中断 1=开启中断Bit2 0=AHB时钟8分频 1=AHB时钟Bit16 0=计数未完成 1=计数完成Systick状态与控制寄存器Systick状态与控制寄存器
重装载寄存器共32位,仅0-23位有效Systick重装载寄存器
当前数值寄存器,也可当成计数寄存器共32位,仅0-23位有效Systick当前数值寄存器重装载寄存器递减计数器STK_CLKSTK_LOADSTK_VALSTK_CTRLUSysTick的工作原理SysTick库函数在内核core_cm4.h中SysTick库函数的宏定义SysTick库函数在内核core_cm4.h中SysTick编程要点初始化系统定时器(时钟选择)设置重装载寄存器的值清除当前数值寄存器的值配置控制与状态寄存器SysTick编程要点初始化系统定时器(时钟选择)SysTick编程要点SysTick编程任务让SysTick产生1s的定时,让LED亮灭。小结Systick系统定时器系统定时器工作原理Systick寄存器Systick库函数Systick编程要点ARM微控制器与嵌入式系统
Systick-编程实验主讲人:景妮琴北京电子科技职业学院内容Systick编程任务Systick编程要点完成编程任务SysTick编程任务让SysTick产生1s的定时,让LED亮灭。点亮LED灯编程要点1-初始化LED相关的GPIO2-配置SysTick(STK_CTRL寄存器)3-main函数小结Systick编程任务Systick编程要点完成编程任务ARM微控制器与嵌入式系统
SPI协议主讲人:景妮琴北京电子科技职业学院内容SPI概述SPI协议SPI通讯SPI概述SPI:SerialPeripheralInterface-串行外设接口SPI是一种高速的,全双工,同步的通信总线四线同步串行通讯接口以主从方式工作,通常有一个主设备和一个或多个从设备SCLKSPIMOSI主机MISO
SSSCLKMOSISPIMISO从机SSSPI协议MOSI–MasterOutputSlaveInput,主出从入,主设备发送到从设备的信号;MISO–MasterInputSlaveOutput,主入从出,从设备发送到主设备的信号;SCLK–SerialClock,时钟信号,由主设备产生的工作时钟,每个SCK周期完成一个bit的传输;CS(NSS、SS)–ChipSelect,从设备选择端,由主设备控制;当从设备收到该端口为低电平时,设备有效,对于主设备,平时为高电平,当传输时给出低电平选通从设备。SPI协议做一个动画SPI:SerialPeripheralInterface串行同步全双工主从模式点对点或者总线灵活的时钟数据帧的长度可以是4-16位SPI通讯SPI通讯SPI模式CPOLCPHA空闲时SCK时钟采样时刻000低电平奇数边沿101低电平偶数边沿210高电平奇数边沿311高电平偶数边沿SPI通讯-CPOL/CPHA及通讯模式CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯SPI基本通讯过程SPI通讯-主模式控制整个传输过程通过SS信号选择对应的通信从节点决定SCK的波特率、相位、极性产生SCK的时钟信号驱动MOSI信号采样MISO信号SPI通讯-从模式响应主节点的信号当SS被选通时才激活根据预先约定的相位/极性来检测SCK信号驱动MISO信号采样MOSI信号小结SPI概述SPI协议SPI通讯ARM微控制器与嵌入式系统
STM32-SPI主讲人:景妮琴北京电子科技职业学院内容STM32的SPISPI框图SPI通讯SPI初始化结构体SPI库函数STM32的SPISPI接口提供两个主要功能,支持SPI协议或I2S音频协议。串行外设接口(SPI)可与外部器件进行半双工/全双工的同步串行通信。主模式或从模式操作,8个主模式波特率预分频器(最大值为fPCLK/2),从模式频率(最大值为fPCLK/2),可为外部从器件提供通信时钟
(SCK)该接口还能够在多主模式配置下工作8位或16位传输帧格式选择可编程的时钟极性和相位可编程的数据顺序,最先移位MSB或LSB可触发中断的专用发送和接收标志通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑STM32的SPI框图STM32芯片有多个SPI外设,它们的SPI通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》为准。引脚SPI编号SPI1SPI2SPI3SPI4SPI5SPI6MOSIPA7/PB5PB15/PC3/PI3PB5/PC12/PD6PE6/PE14PF9/PF11PG14MISOPA6/PB4PB14/PC2/PI2PB4/PC11PE5/PE13PF8/PH7PG12SCKPA5/PB3PB10/PB13/PD3PB3/PC10PE2/PE12PF7/PH6PG13NSSPA4/PA15PB9/PB12/PI0PA4/PA15PE4/PE11PF6/PH5PG8
其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达42Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为21Mbits/s。其它功能上没有差异。SPI的SPI通讯引脚SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对fpclk时钟的分频因子,对fpclk的分频结果就是SCK引脚的输出时钟频率BR[0:2]分频结果(SCK频率)BR[0:2]分频结果(SCK频率)000fpclk/2100fpclk/32001fpclk/4101fpclk/64010fpclk/8110fpclk/128011fpclk/16111fpclk/256其中的fpclk频率是指SPI所在的APB总线频率,APB1为fpclk1,APB2为fpckl2。SPI的时钟控制逻辑SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行。SPI的数据控制逻辑整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。实际应用中,一般不使用STM32SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。SPI的整体控制逻辑通讯过程跟其它外设一样,STM32标准库提供了SPI初始化结构体及初始化函数来配置SPI外设。初始化结构体及函数定义在库文件“stm32f4xx_spi.h”及“stm32f4xx_spi.c”中,编程时我们可以结合这两个文件内的注释使用或参考库帮助文档。SPI初始化结构体SPI_Direction:设置SPI为单向或双向的数据模式可设置为:双线全双工(SPI_Direction_2Lines_FullDuplex),双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单线只发送模式(SPI_Direction_1Line_Tx)。SPI初始化结构体SPI_Mode:设置SPI工作模式主机模式(SPI_Mode_Master)从机模式(SPI_Mode_Slave)这两个模式的最大区别为SPI的SCK信号线的时序,SCK的时序是由通讯中的主机产生的。若被配置为从机模式,STM32的SPI外设将接受外来的SCK信号。SPI初始化结构体SPI_DataSize:选择SPI通讯的数据帧大小4位(SPI_DataSize_4b)8位(SPI_DataSize_8b)16位(SPI_DataSize_16b)SPI初始化结构体SPI_CPOL:配置SPI的时钟极性CPOL高电平(SPI_CPOL_High)低电平(SPI_CPOL_Low)SPI_CPHA:配置时钟相位CPHASPI_CPHA_1Edge(在SCK的奇数边沿采集数据)
SPI_CPHA_2Edge
(在SCK的偶数边沿采集数据)
SPI初始化结构体SPI_NSS:配置NSS引脚的使用模式硬件模式(SPI_NSS_Hard
),这时SPI片选信号由SPI硬件自动产生软件模式(SPI_NSS_Soft
),外部引脚控制。实际中软件模式应用比较多。SPI初始化结构体SPI_BaudRatePrescaler:设置波特率分频因子,分频后的时钟即为SPI的SCK信号线的时钟频率。可设置为fpclk的2、4、6、8、16、32、64、128、256分频。SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;SPI初始化结构体SPI_FirstBit:设置数据传输从MSB开始还是LSB开始MSB先行:
SPI_FirstBit_MSBLSB先行:SPI_FirstBit_LSBSPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;SPI初始化结构体SPI_CRCPolynomial:这是SPI的CRC校验中的多项式,若我们使用CRC校验时,就使用这个成员的参数(多项式),来计算CRC的值。配置完这些结构体成员后,要调用SPI_Init函数把这些参数写入到寄存器中,实现SPI的初始化,然后调用SPI_Cmd来使能SPI外设SPI初始化结构体SPI的库函数SPI_InitVoidSPI_Init(SPI_TypeDef*SPIx,SPI_InitTypeDef*SPI_InitStruct)功能:根据SPI_InitStruct中的参数初始化外设SPIx的寄存器。SPI_Init(SPI1,&SPI_InitStruct);SPI的库函数SPI_CmdvoidSPI_Cmd(SPI_TypeDef*SPIx,FunctionalStateNewState);功能:使能或失能指定的SPI外设SPI_Cmd(SPI1,ENABLE);SPI的库函数SPI_I2S_ITConfigvoidSPI_I2S_ITConfig(SPI_TypeDef*SPIx,uint8_tSPI_I2S_IT,FunctionalStateNewState);功能:使能或失能指定的SPI/I2S中断SPI_I2S_IT可取的值:SPI_I2S_IT_TXE(发送缓存空中断屏蔽),SPI_I2S_IT_RXNE(接收缓存非空中断屏蔽),SPI_I2S_IT_ERR(错误中断屏蔽)SPI的库函数SPI_I2S_SendDatavoidSPI_I2S_SendData(SPI_TypeDef*SPIx,uint16_tData);功能:通过外设SPIx发送数据SPI_I2S_SendData(SPI1,0x55);SPI的库函数SPI_I2S_ReceiveDatauint16_tSPI_I2S_ReceiveData(SPI_TypeDef*SPIx);功能:返回通过外设SPIx最新接收的数据temp=SPI_I2S_ReceiveData(SPI1);SPI的库函数SPI_I2S_GetFlagStatusFlagStatusSPI_I2S_GetFlagStatus(SPI_TypeDef*SPIx,uint16_tSPI_I2S_FLAG);功能:检查指定的SPI/I2S标志位设置与否SPI_I2S_FLAG可取的值:
SPI_I2S_FLAG_TXE:发送缓存空标志位SPI_I2S_FLAG_RXNE:接收缓存非空标志位while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);SPI的库函数SPI_I2S_ClearFlagvoidSPI_I2S_ClearFlag(SPI_TypeDef*SPIx,uint16_tSPI_I2S_FLAG);功能:清除指定的SPI/I2S标志位SPI_I2S_FLAG可取的值:
SPI_I2S_FLAG_TXE:发送缓存空标志位SPI_I2S_FLAG_RXNE:接收缓存非空标志位SPI的库函数SPI_I2S_GetITStatusITStatusSPI_I2S_GetITStatus(SPI_TypeDef*SPIx,uint8_tSPI_I2S_IT);功能:用于检查指定的SPI/I2S中断发生与否SPI_I2S_IT可取的值:
SPI_I2S_IT_TXE:发送缓存空标志位SPI_I2S_IT_RXNE:接收缓存非空标志位小结STM32的SPISPI框图SPI通讯SPI初始化结构体SPI库函数ARM微控制器与嵌入式系统
PWM原理主讲人:景妮琴北京电子科技职业学院内容什么是PWM?PWM应用定时器生成PWM原理STM32定时器结构什么是PWM?PWM:“PulseWidthModulation”脉冲宽度调制脉冲宽度是指高电平持续的时间占空比是高电平时间与周期时间的比值。PWM应用数模转换电机控制音调产生灯的亮度控制使用PWM进行数模转换使用PWM驱动扬声器使用PWM调节灯的亮度使用PWM控制电机定时器生成PWM原理PWM原理计数寄存器CNT重装寄存器ARR比较寄存器CCRCNTARRCCR定时器生成PWM原理在边沿对齐模式下,计数器CNT只工作在一种模式,递增或者递减模式。这里我们以CNT
工作在递增模式为例,在图中,ARR=8,CCR=4,CNT从0开始计数,当CNT<CCR的值时,输出
为有效的高电平,CNT>=CCR时,输出为无效的低电平。当CNT>ARR时,CNT又从0开始计数并生成计数器上溢事件,以此循环往复。PWM的对齐方式重新画一个图PWM的对齐方式重新画一个图PWM的对齐方式重新画一个图STM32高级定时器结构基本定时器(TIM6,TIM7):只有最基本的定时功能。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动通用定时器(TIM2~TIM5,TIM9~TIM14)
:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)高级定时器(TIM1,TIM8):高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,比如它可以输出互补带死区的信号等等STM32高级定时器结构定时器种类位数计数器模式产生DMA请求捕获/比较通道互补输出特殊应用场景高级定时器(TIM1,TIM8)16向上,向下,向上/下可以4有带可编程死区的互补输出通用定时器(TIM2,TIM5)32向上,向下,向上/下可以4无通用。定时计数,PWM输出,输入捕获,输出比较通用定时器(TIM3,TIM4)16向上,向下,向上/下可以4无通用。定时计数,PWM输出,输入捕获,输出比较通用定时器(TIM9~TIM14)16向上没有2无通用。定时计数,PWM输出,输入捕获,输出比较基本定时器(TIM6,TIM7)16向上,向下,向上/下可以0无主要应用于驱动DACSTM32高级定时器结构STM32高级定时器结构默认调用SystemInit函数情况下:SYSCLK=168MAHB时钟=168MAPB1时钟=42M所以APB1的分频系数=AHB/APB1时钟=4所以,通用定时器时钟CK_INT=2*42M=84M内部时钟选择定时器生成PWM的频率与占空比若选用TIM3,挂载在APB1时钟总线上,因此TIMxCLK=84MHz所以:Prescaler=84(分频)TIMxcounterclock=84MHz/84=1MHz若ARR=1000=>Frequency=TIMxcounterclock/ARR=>Frequency=1MHz/1000=1KHzCCR1=500=>TIMxChannel1dutycycle=(CCR1/ARR)*100%=50%生成的PWM的频率为1KHz,占空比为50%定时器生成PWM的频率与占空比若选用TIM3,挂载在APB1时钟总线上,因此TIMxCLK=84MHz。如果想生成一个500HZ频率,占空比为25%的PWM。所以:Prescaler=(<2^32即可)(分频)TIMxcounterclock=84MHz/prescaler=(84)若ARR=(2000)
=>Frequency=TIMxcounterclock/ARRCCR1=(500)=>TIMxChannel1dutycycle=(CCR1/ARR)*100%=25%小结什么是PWM?PWM应用定时器生成PWMSTM32定时器结构ARM微控制器与嵌入式系统
STM32的PWM配置主讲人:景妮琴北京电子科技职业学院内容STM32的PWM定时器生成PWM的编程要点输出通道配置PWM结构体PWM库函数定时器生成PWM原理PWM原理计数寄存器CNT重装寄存器ARR比较寄存器CCRCNTARRCCR定时器生成PWM的编程要点1、开启GPIO时钟、定时器时钟2、PWM输出端口配置3、复用引脚功能映射4、定时器配置5、输出通道配置6、PWM使能7、设置比较器值输出PWMPWM的输出通道针对高级定时器和通用定时器,查STM32的数据手册,选择使用不同定时器的不同通道进行配置。我们使用TIM3。定时器生成PWM的编程要点1、打开输出通道的GPIO时钟以及定时器(PWM)的时钟(1)打开GPIO的时钟使用TIM3的4个通道分别为:PA6,PA7,PB0,PB1打开GPIOA和GPIOB的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
定时器生成PWM的编程要点1、打开输出通道的GPIO时钟以及定时器(PWM)的时钟(2)打开TIM3的时钟APB1时钟总线
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);定时器生成PWM的编程要点2、PWM输出端口配置使用TIM3的4个通道分别为:PA6,PA7,PB0,PB1先对PA6,PA7配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; //选择端口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用模式GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //输出最大速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_InitStructure);
定时器生成PWM的编程要点2、PWM输出端口配置使用TIM3的4个通道分别为:PA6,PA7,PB0,PB1再对PB0,PB1配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; //选择端口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用模式GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //输出最大速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//浮空模式GPIO_Init(GPIOB,&GPIO_InitStructure);
定时器生成PWM的编程要点3、复用引脚功能映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3);GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3);GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3);定时器生成PWM的编程要点4、定时器配置typedefstruct{uint16_tTIM_Prescaler; //预分频系数uint16_tTIM_CounterMode; //计数模式uint32_tTIM_Period; //定时器初值uint16_tTIM_ClockDivision; //分频因子uint8_tTIM_RepetitionCounter; //重复计数}TIM_TimeBaseInitTypeDef;定时器生成PWM的编程要点4、定时器配置分析:设置TIMx定时器的相关寄存器,主要是设置ARR和PSC。例:产生频率为500Hz,占空比为50%的PWM波形,可以设置如下:通用控制定时器时钟源TIM3CLK=42MHz*2=84MHz,设定定时器频率为=TIM3CLK/(TIM_Prescaler+1)=1MHz,得到:TIM_Prescaler=84-1而PWM的频率为1MHz/(TIM_Period+1)=500Hz.则TIM_Period=2000即定时器从0计数到1999,为一个定时周期定时器生成PWM原理TIM_CounterMode_Up 向上计数
定时器生成PWM原理TIM_CounterMode_Down 向下计数
TIMx_ARRTIMx_CNT中断定时器生成PWM的编程要点4、定时器配置TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Prescaler=84-1;//预分频系数TIM_TimeBaseStructure.TIM_Period=2000-1;//定时器初值TIM_TimeBaseStructureTIM_CounterMode=TIM_CounterMode_Up;//计数模式TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子TIM_RepetitionCounter=0; //重复计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);定时器生成PWM的编程要点5、输出通道配置TIM_OCInitTypeDefTIM_OCInitStructure;typedefstruct{uint16_tTIM_OCMode; //输出通道模式uint16_tTIM_OutputState; //输出通道使能或失能uint16_tTIM_OutputNState; //输出互补通道使能或失能uint32_tTIM_Pulse; //比较器预装初值uint16_tTIM_OCPolarity; //输出通道极性uint16_tTIM_OCNPolarity; //输出互补通道极性uint16_tTIM_OCIdleState; //输出通道空闲时电平uint16_tTIM_OCNIdleState; //输出互补通道空闲时电平}TIM_OCInitTypeDef;定时器生成PWM的编程要点5、输出通道配置(1)TIM_OCMode的取值范围 //输出通道模式TIM_OCMode_Timing //定时器输出比较时间模式TIM_OCMode_Active //定时器输出比较主动模式TIM_OCMode_Inactive //定时器输出比较非主动模式TIM_OCMode_Toggle //定时器输出比较触发模式TIM_OCMode_PWM1 //定时器脉宽调制模式1TIM_OCMode_PWM2 //定时器脉宽调制模式2TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;定时器生成PWM的编程要点5、输出通道配置(1)TIM_OCMode的取值范围 //输出通道模式PWM模式1在递增计数模式下,只要TIMx_CNT<TIMx_CCR1,通道1便为有效状态,否则为无效状态。在递减计数模式下,只要TIMx_CNT>TIMx_CCR1,通道1便为无效状态(OC1REF=0),否则为有效状态(OC1REF=1)。
PWM模式2在递增计数模式下,只要TIMx_CNT<TIMx_CCR1,通道1便为无效状态,否则为有效状态。在递减计数模式下,只要TIMx_CNT>TIMx_CCR1,通道1便为有效状态,否则为无效状态。TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;定时器生成PWM的编程要点5、输出通道配置(2)TIM_OutputState的取值范围 //输出通道使能或失能TIM_OutputState_Enable //输出通道使能TIM_OutputState_Disable //输出通道失能TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;(3)TIM_OutputNState取值范围//输出互补通道使能或失能TIM_OutputNState_Enable //输出互补通道使能TIM_OutputNState_Disable //输出互补通道失能
TIM3没有互补通道,这个可以不设置定时器生成PWM的编程要点5、输出通道配置(4)TIM_Pulse取值范围//比较器预装初值比较器初值取值0-65535,TIM2和TIM5比较器取值0-2^32设置占空比,占空比=(CCRx/ARR)*100%,设置50%的占空比为,前面已经设置ARR=2000,因此这个地方的CCR应该设置为100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中职旅游政策与法规课件
- 教育法规在职业教育中的实施与挑战
- 企业安全与数据保护技术应用场景
- 数字化教育背景下教师角色的转变与挑战
- 专题04 荐信 感谢信 倡议书(讲义)(解析版)-2025年高考英语二轮复习
- 教育国际化背景下的培训机构品牌塑造
- 新时代下的基础教育课程改革探讨特别关注未来几年内的发展
- 基础护士眼科常考题库及答案
- 教育建筑中生态屋顶的规划与设计思考
- 2025年四川省泸州市物理高二第二学期期末考试模拟试题含解析
- 遵义市仁怀市选聘城市社区工作者考试真题2024
- 起重作业安全知识考核试题(含答案)
- 2025至2030中国医疗头戴式显示器行业产业运行态势及投资规划深度研究报告
- 枪支安全管理培训课件
- 2025年 江苏苏州昆山国创投资集团有限公司第一期招聘考试试卷附答案
- 医院培训课件:《静脉中等长度导管临床应用专家共识》
- DB65∕T 2810-2009 核桃玛仁糖-行业标准
- 商业银行风险预警系统整体架构设计
- UPVC双壁波纹管
- 型直线振动筛使用说明书中文
- 超市生鲜棚格图分析模板
评论
0/150
提交评论