通用同步异步收发器(USART)USART介绍全双工的异步通信。接口通过三个引脚与其余设施连贯在一起(接管RX、发送TX、时钟输入CK)(任何USART双向通信至多须要RX和TX)发送方为同步传输提供时钟。发送和接管由一共用的波特率发生器驱动,当发送器和接收器的使能位别离置位时,别离为其产生时钟。波特率
应用分数波特率发生器零碎发送和接管共用的可编程波特率,最高达4.5Mbits/s12位整数和4位小数的示意办法。只有USART1应用PCLK2(即APB2最高72MHz)。其它USART应用PCLK1(即APB1最高36MHz)。可编程数据字长度(8位或9位)(8数据+n进行位/9数据+n进行位)(数据位最初一个可能是奇偶校验位)(数据最低无效位在前)可配置的进行位-反对1或2个进行位。发送和接收数据流程:(数据寄存器USART_DR蕴含发送寄存器TDR和接管寄存器RDR)
发送数据:零碎进行写操作将数据写入发送寄存器TDR,而后TDR将数据移送到发送移位寄存器中,再由发送移位寄存器送入编解码模块中编码后从TX输入。接收数据;数据从RX进入,先到编解码模块中解码后送入接管移位寄存器,而后再到接管寄存器RDR中供零碎进行读操作。当发送使能位(TE)被设置时,发送移位寄存器中的数据在TX脚上输入,相应的时钟脉冲在CK脚上输入。留神:在数据传输期间不能复位TE位,否则将毁坏TX脚上的数据,因为波特率计数器进行计数。正在传输的以后数据将失落。分数波特率的计算波特率 = PCK /(16*USARTDIV)(USARTDIV是波特比率寄存器中的值换算失去,即分频系数)已知USARTDIV = 25.62;求波特比率寄存器USART_BRR该写入的值。
DIV_Fraction = 16*0.62 = 9.92。最靠近的整数是:10 = 0xADIV_Mantissa = 取整(25.620) = 25 = 0x019。(整数局部是12位所以是0x019,写0x19也行,这里是为了好分别)、所以USART_BRR = 0x019A(写作0x19A也行)USART的中断请求USART的各种中断事件被连贯到同一个中断向量以下各种状况会触发中断:(如果设置了对应的使能管制位,这些事件就能够产生各自的中断)
发送期间:发送实现、革除发送、发送数据寄存器为空。接管期间:闲暇总线检测、溢出谬误、接收数据寄存器非空、校验谬误、LIN断开符号检测、乐音标记(仅在多缓冲器通信)和帧谬误(仅在多缓冲器通信)。USART寄存器状态寄存器(USART_SR)
复位值:0x00C0TXE:发送寄存器DTR是否为空标记位。
当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果管制寄存器USART_CR1中的TXEIE为1,则产生中断。对数据寄存器USART_DR的写操作,硬件会将该位清零。1:数据曾经被转移到移位寄存器。TC:发送实现标记位。
当一帧数据发送实现后,并且TXE=1时,该位被硬件置一。如果管制寄存器USART_CR1中的TXEIE为1,则产生中断。由软件序列革除该位(先读USART_SR,而后写入USART_DR)1:发送实现。RXNE:查看接管移位寄存器是否为空标记位。
当接管移位寄存器中的数据被转移到接收数据寄存器RDR中时,该位被硬件置位(接管移位寄存器中为空)如果管制寄存器USART_CR1中的RXNEIE为1,则产生中断。对数据寄存器USART_DR的读操作能够将该位清零。1:收到数据,能够读出。IDLE:监测到总线闲暇标记位。
当检测到总线闲暇时,该位被硬件置位。如果USART_CR1中的IDLEIE为1,则产生中断。由软件序列革除该位(先读USART_SR,而后读USART_DR)。1:检测到闲暇总线。数据寄存器(USART_DR)
复位值:不确定DR:数据值,蕴含了发送或接管的数据。波特比率寄存器(USART_BRR)
复位值:0x0000DIV_Mantissa:USARTDIV的整数局部DIV_Fraction:USARTDIV的小数局部管制寄存器 1(USART_CR1)
复位值:0x0000UE:USART使能位。该位由软件设置和清零。(0:USART分频器和输入被禁止)M:设置传输字长,由软件对其设置和清零(0:8个数据位。1:9个数据位)PCE:测验管制使能(1:使能校验管制)PS:校验抉择(0:偶校验)PEIE:PE中断使能(1:当USART_SR中的TXE为1时,产生USART中断)TCIE:发送实现中断使能(1:当USART_SR中的TC为1时,产生USART中断)RXNEIE:接管移位寄存器为空的中断使能(1:当USART_SR中的ORE或者RXNE为1时,产生USART中断)IDLEIE:总线闲暇IDLE中断使能(该位由软件设置或革除)(1:当USART_SR中的IDLE为1时,产生USART中断)TE:发送使能(1:使能发送)RE:接管使能(1:使能接管,并开始搜查RX引脚上的起始位)管制寄存器 2(USART_CR2)
复位值:0x0000STOP:进行位(UART4和UART5不能用0.5进行位和1.5进行位)
00:1个进行位。01:0.5个进行位。10:2个进行位。11:1.5个进行位CLKEN:时钟使能(0:禁止CK引脚)代码示例USART初始化设置/******************************************************************************** 函 数 名 : USART1_Init* 函数性能 : USART1初始化函数* 输 入 : bound:波特率* 输 出 : 无*******************************************************************************/ void USART1_Init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; //申明GPIO对象 USART_InitTypeDef USART_InitStructure; //申明串口对象 NVIC_InitTypeDef NVIC_InitStructure; //申明嵌套断的对象 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输入PA9 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输入 GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输入PA9*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输出PA10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模仿输出 GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输出PA10*/ //USART1 初始化设置 USART_InitStructure.USART_BaudRate = bound;//波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个进行位 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); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口1 USART_ClearFlag(USART1, USART_FLAG_TC); //革除串口的挂起标记 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相干中断 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //依据指定的参数初始化VIC寄存器、 }串口的中断函数/******************************************************************************** 函 数 名 : USART1_IRQHandler* 函数性能 : USART1中断函数* 输 入 : 无* 输 出 : 无*******************************************************************************/ void USART1_IRQHandler(void) //串口1中断服务程序{ u8 r; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接管中断 { r =USART_ReceiveData(USART1);//(USART1->DR); //读取接管到的数据 USART_SendData(USART1,r); // 将接管到的数据再发送回去 while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET); } USART_ClearFlag(USART1,USART_FLAG_TC);} I2C通信之EEPROMI2C特点遵循着与51单片机雷同的I2C协定。接口通过数据引脚(SDA)和时钟引脚(SCL)连贯到I2C总线(数据引脚SDA用于数据传输,时钟引脚SCL用于收发数据的同步)I2C模块接管和发送数据,并将数据从串行转换成并行,或并行转换成串行。I2C主设施性能:
...