STM32F103_USART_GPIO配置及相应的IO口设置

来源:互联网 发布:seo招聘石家庄 编辑:程序博客网 时间:2024/05/22 15:55
STM32 系列单片机 GPIO 资料收集及总结一、GPIO 配置(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出GPIO_Speed_10MHz 最高输出速率 10MHzGPIO_Speed_2MHz 最高输出速率 2MHzGPIO_Speed_50MHz 最高输出速率 50MHz1.1 I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz 和 50MHz),这个速度是指 I/O 口驱动电路的响应速度而不是输出信号的速度,***输出信号的速度与程序有关***(芯片内部在 I/O 口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的 EMI 性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是 GPIO 的引脚速度跟应用匹配(推荐 10 倍以上?)。比如:1.1.1 对于串口,假如最大波特率只需 115.2k,那么用 2M 的 GPIO 的引脚速度就够了,既省电也噪声小。1.1.2 对于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选用 10M 的 GPIO 引脚速度。1.1.3 对于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的 GPIO 的引脚速度显然不够了,需要选用 50M的 GPIO 的引脚速度。1.2 GPIO 口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。1.3 在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式。1.4 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。1.5 GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。2、推挽输出与开漏输出的区别推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内).推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.要实现 线与 需要用 OC(open collector)门电路.是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流当端口配置为输出时:开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出 0。输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出 1(需要外部上拉电路);此模式可以把端口作为双向 IO使用。推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出 0。输出 1 时,N-MOS 高阻,P-MOS 导通,输出 1(不需要外部上拉电路)。简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC3、在 STM32 中选用 IO 模式(1) 浮空输入_IN_FLOATING ——浮空输入,可以做 KEY 识别,RX1(2)带上拉输入_IPU——IO 内部上拉电阻输入(3)带下拉输入_IPD—— IO 内部下拉电阻输入(4) 模拟输入_AIN ——应用 ADC 模拟输入,或者低功耗下省电(5)开漏输出_OUT_OD ——IO 输出 0 接 GND,IO 输出 1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以由外部电路改变为低电平或不变 。可以读 IO 输入电平变化,实现 C51 的 IO 双向功能(6)推挽输出_OUT_PP ——IO 输出 0-接 GND, IO 输出 1 -接 VCC,读输入值是未知的(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C 的 SCL,SDA)(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)实例总结:(1)模拟 I2C 使用开漏输出_OUT_OD,接上拉电阻,能够正确输出 01;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读 IO 的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);(2)如果是无上拉电阻,IO 默认是高电平;需要读取 IO 的值,可以使用带上拉输入_IPU 和浮空输入_IN_FLOATING 和 开漏输出_OUT_OD;4、IO 低功耗:关于模拟输入&低功耗,根据 STM32 的低功耗 AN(AN2629)及其源文件,在 STOP 模式下,为了得到尽量低的功耗,确实把所有的 IO(包括非 A/D 输入的 GPIO)都设置为模拟输入5、程序(1)时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);(2)IO 配置:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // IR 输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);(3)输出输入:输出 0:GPIO_ResetBits(GPIOB, GPIO_Pin_0)输出 1:GPIO_SetBits(GPIOB, GPIO_Pin_0)输入: GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
***简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC----------------------------------------------------***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
关于 STM32 上电复位瞬间 I/O 口的电平状态STM32 上电复位瞬间 I/O 口的电平状态默认是浮空输入,因此是高阻。做到低功耗.STM32 的 IO 管脚配置口默认为浮空输入,把选择权留给用户,这是一个很大的优势:一方面浮空输入确保不会出现用户不希望的默认电平(此时电平取决于用户的外围电路);另一方面降低了功耗,因为不管是上拉还是下拉,都会有电流消耗。从另一个角度来看,不管 I/O 管脚的默认配置如何,还是需要在输出的管脚外加上拉或下拉,这是为了保证芯片上电期间和复位时,输出的管脚始终处于已知的电平。─ 输入浮空─ 输入上拉─ 输入下拉─ 模拟输入─ 开漏输出─ 推挽式输出─ 推挽式复用功能─ 开漏复用功能IO 端口复位后处于浮空状态,也就是其电平状态由外围电路决定,这很重要,如果设计工业品的话,这是必须要确定的;IO 引脚可以兼容 5V 电源;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
stm32 串口 1,2,3,4,5 为什么不工作?请注意一些常规问题,譬如:UART3 和 SPI2 有冲突,要把 SPI 的时钟关掉。仔细分析程序,最有可能的就是 rcc 了,我把她们全都打开了,结果我逐一调试,发现RCC_APB1Periph_I2C1,RCC_APB1Periph_I2C2 打开导致 usart3 不正常,RCC_AHBPeriph_SDIO 打开导致usart4 不正常,想的可能是管脚冲突,打开管教定义,呵呵,的确如此。usart1 是 APB2,USART2,3,UART4,5 都是 APB1 的, 这个不会搞错的。一般来说,代码要处理一下几部分内容:1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);2)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);3)/* Configure UART4 Rx (PC.11) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure UART4 Tx (PC.10) as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);4)USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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;5)USART_Init(UART4, &USART_InitStructure);/* Enable USART4 Receive and Transmit interrupts */USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);/* Enable the USART4 */USART_Cmd(UART4, ENABLE);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
STM32 UART 的使用过程1、使用 UART 前必须启动相应的外设时钟,其主要用到固件库的 RCC_APBnPeriphClockCmd 函数。使能 UART1:使用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)使能 UART2:使用 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE)2、使用中断进行 UART 操作的需要配置 NVIC,设置中断优先级。如:/* Configure the NVIC Preemption Priority Bits */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/* Enable the USART1 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);3、配置相应的 GPIO 口。如 果 系 统 的 UART 需 要 进 行 重 映 射 , 需 要 使 用 GPIO_PinRemapConfig 函 数 进 行 重 映 射 , 如 :GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//注意:Rx 为浮空,Tx 为第二功能上拉。将 Rx 配置为:浮空输入模式,Tx 配置为带上拉的第二功模式。并用 GPIO_Init() 函数初始化。如:/* Configure USART2 Rx PA3 input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure USART1 Tx (PA.09) as alternate push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);4、配置 UART当在 conf 文件种配置正确的外晶振后,在 USART_InitTypeDef 定义的结构体种直接写入 UART 的波特率、通讯长顿、模式、硬件通讯控制,收发模式。再用 USART_Init()进行初始化。如:USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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;/* Configure USART1 */USART_Init(USART1, &USART_InitStructure);而后使能收发中断。如:/* Enable USART1 Receive and Transmit interrupts */USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_ITConfig(USART1, USART_IT_TXE, ENABLE);// USART_ITConfig(USART1, USART_IT_TXE, DISABLE);注意:一般不将 TXE 中断使能。因为一旦将此中断使能,如果 UART 发送缓冲区空,则会立即进入 UART 中断中,因此可在程序中需要发送数据处,使能 TXE 中断。在 UART 中断种用 USART_SendData()来发送数据。完成中断使能后,还需要使能 UART 口:如:/* Enable the USART1 */USART_Cmd(USART1, ENABLE);/* Enable the USART2 */USART_Cmd(USART2, ENABLE);中断程序(stm32f10x_it.c)可以如下完成发送:注意所有的的串口中断需要在中断服务程序中判断中断源以分别处理。void USART1_IRQHandler(void){if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){/* Read one byte from the receive data register */RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);if(RxCounter1 == NbrOfDataToRead1){USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//发送完成后,将 RXNE 禁止。}}if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){USART_SendData(USART1, TxBuffer1[TxCounter1++]);if(TxCounter1 == NbrOfDataToTransfer1){USART_ITConfig(USART1, USART_IT_TXE, DISABLE);}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
void USART1_IRQHandler(void){if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){/* Read one byte from the receive data register */RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);if(RxCounter1 == NbrOfDataToRead1){USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//发送完成后,将 RXNE 禁止。}}if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){USART_SendData(USART1, TxBuffer1[TxCounter1++]);if(TxCounter1 == NbrOfDataToTransfer1){USART_ITConfig(USART1, USART_IT_TXE, DISABLE);}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
STM32 UART 整理说明该接口通过 3 个引脚连接到另外的外部设备上。任何 USART 双向通信都至少需要两个引脚:接收数据输入 RX 和发送数据输出 TX当发送器禁能时输出引脚恢复到 I/O 端口配置。当发送器使能时且无数据发送,TX 引脚为高电平。字长可以通过设置 USART_CR1 寄存器中的 M 位来选择是 8 位还是 9 位TX 引脚在起始位期间为低,停止位期间为高空闲符被认为是一个全“1”的帧,其后紧跟着包含数据的下一个帧的起始位(“1”的数目包含了停止位的数目)间隙符被认为是一个帧周期都接收到“0”。在间隙帧之后,发送器插入 1 个或者 2 个的停止位(逻辑“1”)来应答起始位发送器发送器可以发送 8 或者 9 位的数据字,这取决于 M 位的状态。相关时钟脉冲在 SCLK 引脚输出1、字符发送USART 发送期间,TX 引脚先出现最低有效位。这种模式下,USART_DR 寄存器包含了一个内部总线和发送移位寄存器之间的缓冲区 TDR。每个字符之前都有一位逻辑低电平的起始位,以可设置数目的停止位结束。TE 位使能之后将发送一个空闲帧2、可配置的停止位1 个停止位:这是陌生人的停止位数目2 个停止位:常规 USART,单线和调制解调器模式下支持0.5 个停止位:当处于智能卡模式下接收数据时使用1.5 个停止位:当处于智能卡模式下发送数据时使用空闲帧的发送包含了停止位。间隙帧是 10(11)个低位之后跟着配置的停止位配置流程:通过把 USART_CR1 寄存器中的 UE 位写 1 来使能 USART->配置 USART_CR1 寄存器中的 M 位来定义字长->配置 USART_CR2 寄存器中的停止位数目->若采用多缓冲通信选择 USART_CR3 寄存器中的 DMA 使能位(DMAT),按照多缓冲通信中解释的配置 DMA 寄存器->设置 USART_CR1 寄存器中的 TE 位来发送一个空闲帧来作为第一次发送->通过 USART_BRR 寄存器选择期望的波特率->往 USART_DR 寄存器中写入要发送的数据,这也将清除 TXE 位。3、单字节通信清除 TXE 位一般都是通过往数据寄存器中写入数据完成的TXE 是由硬件设置的,它表明:数据已经从 TDR 中转移到移位寄存器了,数据发送已经开始;TDR 寄存器是空的;下一个数据可以写入 USART_DR 寄存器,而不会覆盖前面的数据当发送在进行时,一个对 USART_DR 寄存器的写命令将数据保存到 TDR 寄存器中,并且当前传输完成之后,TDR 寄存器中的数据将被复制到移位寄存器中。当没有进行发送时,往 USART_DR 寄存器中写入一个数据,数据将直接被放入移位寄存器,发送开始,TXE位将被立即置 1当一个帧发送完成时(结束位之后),TC 位被置 1清除 TC 位是通过下面的软件操作完成的:(1)读一次 USART_SR 寄存器(2)写一次 USART_DR 寄存器(TC 位也可以通过对它写 0 清除,这个清除序列只建议在多缓存通信中使用)4、间隙字符设置 SBK 位将发送一个间隙字符。若 SBK 位被置 1,在完成当前的发送之后将在 TX 线路上发送一个间隙字符。这一位在间隙字符发送完成时由硬件复位。USART 在最后一个间隙帧的末端插入一个逻辑 1,从而保证下一个帧的起始位能被识别软件在间隙符发送之前复位 SBK,间隙符将不会被发送5、空闲符设置 TE 位将驱动 USART 在第一个数据帧之前发送一个空闲帧接收器接收器可以接收 8 位或 9 位的数据字,这取决于 USART_CR1 寄存器中的 M 位1、字符接收在一次 USART 接收期间,RX 引脚最先接收到最低有效位。这种模式下,USART_DR 寄存器由一个内部总线和接收移位寄存器之间的缓冲区(RDR)构成配置流程:通过把 USART_CR1 寄存器中的 UE 位写 1 来使能 USART->配置 USART_CR1 寄存器中的 M 位来定义字长->配置 USART_CR2 寄存器中的停止位数目->若发生多缓冲通信,选择 USART_CR3 寄存器中的 DMA 使能位(DMAT)->通过波特率寄存器 USART_BRR 来选择期望的波特率->置位 USART_CR1 寄存器中的 RE,这将使能接收器开始寻找起始位。当接收到一个字符时:RXNE 位被置 1,表明移位寄存器的内容被转移到 RDR如果 RXNEIE 位被置 1,将产生一个中断接收期间若发现帧错误,噪音或者溢出错误错误标志将会被置 1多缓冲接收中,RXNE 在每接收到一个字节都会被置 1 并通过 DMA 读取数据寄存器来清除在单缓冲模式,清除 RXNE 位是由软件读取 USART_DR 寄存器万层。RXNE 标志也可以通过对它写 0 清除。RXNE位必须在下一个字符接收完成前被清除,否则将产生溢出错误2、间隙符:当接收到间隙符时,USART 把它当做帧错误处理3、空闲符:当接收到空闲帧时,将和接收到数据一样处理,此外如果 IDLEIE 位被置 1 的话将产生一个中断4、溢出错误当接收到一个字符,而 RXNE 位还没有被复位,这时候将出现错误。在 RXNE 位被清除之前数据不能从移位寄存器转移到 RDR 寄存器出现溢出错误时,ORE 位被置 1,通过在读 USART_SR 寄存器之后读 USART_DR 寄存器,ORE 位被复位ORE 位被置 1 时,表明至少 1 个数据已经丢失:若 RXNE=1,上一个有效数据存放在接收寄存器 RDR,并且可读;RXNE=0,上一个有效数据已被读出,RDR 中无可读数据5、噪音错误在帧内发现噪音:NE 在 RXNE 位的上升沿被置 1无效的数据从移位寄存器转移到 USART_DR 寄存器若为单字节通信,将不产生中断;多缓冲通信下,若 USART_CR3 寄存器中的 EIE 位准备置 1,将导致一个中断NE 位通过依次读取 USART_SR 寄存器和 USART_DR 寄存器复位6、帧错误由于没有同步上或大量噪音的原因,停止位没有在与其的时间上接和收识别出来当发现帧错误时:FE 位被硬件置 1;无效的数据从移位寄存器转移到 USART_DR 寄存器;若为单字节通信,将不会产生中断,但这一位将和自身产生中断的 RXNE 位一起上升,多缓冲通信中,若 USART_CR3 寄存器中的 EIE 位被置 1,将导致一个中断NE 位通过一次读取 USART_SR 寄存器和 USART_DR 寄存器复位7、接收期间配置停止位要接收的停止位的数目可以通过控制寄存器 2 中的控制为配置。普通模式下可以是 1 位或者 2 位。智能卡模式下可能是 0.5 位或 1.5 位分数波特率的产生接收器和发送器(RX 和 TX)都是设置城 USARTDIV 整数和小数寄存器中配置的值。TX/RX 波特率=Fck/(16*USARTDIV)例子:从 BRR 寄存器的值计算得到 USARTDIV如果 DIV_Mantissa=27D,DIV_Fraction=12D(BRR=1BCH),那么Mantissa(USARTDIV)=27DFraciton(USARTDIV)=12/16=0.75D因此,USARTDIV=27.75D在写入 USART_BRR 后,波特率计数器会被波特率寄存器中的新值更新,因此在处理期间不应改变波特率寄存器的值只有 USART1 是由 PCK2(最大位 72MHZ)提供时钟,其他的都由 PCLK1 提供时钟(最大为 36MHZ)多处理器通信利用 USART 可以进行多处理器通信(只需把多个 USART 连接城一个网络)。未编址设备可以通过静默功能的方式置为静默模式。静默模式下:所有接收状态位都不会被设置所有的接收中断都被禁止USART_CR1 寄存器中的 RWU 位被置 1,RWU 可以硬件自动控制或者在某些条件下有软件写USART 可以通过两种方式进入和退出静默模式:如果 WAKE 位被复位,采用空闲线路检测模式如果 WAKE 位被置位,采用地址标记检测模式1、空闲线路检测模式(WAKE=0)当 RWU 位被写 1 时,USART 进入静默模式当发现空闲帧时,USART 退出静默模式,RWU 位也将被硬件清除,但是 USART_SR 寄存器中的 IDLE 位不会被置 1.RWU 也可以被软件清 02、地址标记检测(WAKE=1)此模式下,MSB 为 1 的字节被认为是地址,否则被认为是数据。当接收到一个和预先设置在 USART_CR2 寄存器中 ADD 位中的地址不匹配的地址字符,USART 进入静默模式。当接收到一个和设置的地址匹配的地址字符,USART 退出静默模式。RWU 被清除,后面的字节也将正常接收,RXNE 位会因为接收到地址字符被置 1.当接收端缓冲区没有数据时(USART_SR 寄存器中的 RXNE=0),RWU 位可以被写 0 或者 1,否则写操作会被忽略。在选择静默模式之前(设置 RWU 位)。USART 必须先接收一个数据字节,否则它不能运行在通过空闲线路检测唤醒的静默模式。在地址标志检测唤醒配置中(WAKE=1),RWU 位在 RXNE 位被置 1 时不能通过软件修改奇偶控制可以通过设置 USART_CR1 寄存器中的 PCE 位来使能奇偶控制。发送模式:若 USART_CR1 的 PCE 位被置位,写进数据寄存器的数据 MSB 位被校验位替换后发送出去。LIN 模式此模式通过 USART_CR2 寄存器的 LINEN 位选择。LIN 模式下,CLKEN 位,STOP[1:0]位,SCEN,HDSEL,IREN必须保持清除状态1、LIN 发送与正常 USART 发送存在如下区别:清除 M 位来设置 8 位字长度;设置 LINEN 位进入 LIN 模式,此情况下,设置 SBK 位来发送 13 个“0”作为间隙符,然后发送一个“1”来开启其实检测2、LIN 接收当 LIN 模式被使能时,间隙检测电路被激活。检测和正常 USART 接收器完全独立。间隙不管是在空闲时或者接收帧期间发生都能被检测到检测起始位的方法和寻找间隙符或者数据是一样的。发现起始位后,电路采样下面的位。若 10(LBDL=0)或者 11 位(LBDL=1)连续的位都是 0,且金钩一个分隔符,USART_SR 寄存器的 LBD 标志被置 1如果第 10 或者 11 次采样之前采样到 1,间隙检测电路取消当前的检测而重新查找一个起始位LIN 模式被使能,一旦发生了帧错误,接收器不会停止直到间隙字没有完成时接收到一个“1”或检测到间隙后接收到一个分隔符USART 同步模式同步模式是通过往 USART_CR2 寄存器中的 CLKEN 位写 1 来选择。此模式下,下面这些位必须保持清除状态:LINEN,SCEN,HDSEL,IRENUSART 允许用户在主模式下控制双向同步串行通信。SCLK 引脚是 USART 发送者时钟的输出。起始位和停止位期间不会往 SCLK 发送时钟脉冲。在空闲,实际数据到来前和发送间隙期间,外部时钟不会被激活SCLK 和 TX 同步,TX 上的数据也是同步的。USART 接收器和异步模式采用不同的工作方式。若 RE=1,数据在 SCLK 上采样而没有任何过采样SCLK 引脚和 TX 引脚一起工作,故只有在发送使能时且数据在发送时才会提供时钟,这就意味着不可能在不发送数据时接收到同步数据LBCL,CPOL,CPHA 必须在发送器和接收器都禁能时选择,这些为在发送器或者接收器使能时不能改变建议在同一条指令中设置 TE 和 RE 位以保证接收器的建立时间和保持时间最小单线半双工模式此模式通过设置 USART_CR3 寄存器中的 HDSEL 位来选择。此模式下必须保持下面这些位的清除状态:LINEN,CLKEN,SCEN,HDSEL,IREN一旦 HDSEL 被写 1:RX 不再被使用;无数据传输时,TX 总是被释放的。因此,它在空闲状态或接收状态时表现为一个标准 I/O 口,该 I/O 口在不被 USART 驱动时,必须配置成悬空呼入或开漏的输出高。特别的是,发送永远都不会被硬件阻止,一旦 TE 位被置 1 并且数据写入数据寄存器,发送就会连续发生智能卡智能卡模式是通过设置 USART_CR3 寄存器中的 SCEN 位来选择。此模式下,下面这些为必须保持清除状态:LINEN,HDSEL,IRENCLKEN 位可能被设置,从而为智能卡提供时钟智能卡接口设计是支持 ISO7816-3 标准中定义的一部协议的智能卡。USART 应做如下配置:8 位数据家奇偶校验,USART_CR1 寄存器中的 M=1,PCE=1,并且满足如下条件之一:接收时 0.5 停止位:USART_CR2 中的 STOP=01发送时 1.5 停止位,USART_CR2 中的 STOP=11当与智能卡相连时,USART 的 TX 输出驱动一个智能卡也驱动的双向线(SW_RX 和 TX 必须连接到相同的 I/O)。在发送起始位和数据字节时,TX_EN 被置有效,而在停止位被置无效。这样接收器只能在出现奇偶错误时才能驱动这条线路。若没有使用 TX_EN,在停止位期间 TX 被拉高,这样只要 TX 被配置成开漏,接受者也可以驱动这条线路智能卡是一个单线半双工通信协议通过发送移位寄存器的数据发送至少延迟 1/2 的波特时钟如果在接收 1/2 停止位帧时检测到奇偶错误,发送线路在完成接收帧时拉低并保持一个波特时钟置 TC 标记有效可以通过设置保护时间寄存器延迟TC 标志的撤销不会受智能卡模式影响如果发送器检测到帧错误,NACK 不会被发送器的接收模块当做起始位在接收器端,若检测到奇偶错误并且发送了 NACK,接收器不会把 NACK 当做起始位智能卡模式下,间隙符是没有意义的,带帧错误的 00H 数据被看做是数据而不是间隙符当来回切换 TE 位时,不会发送空闲帧。ISO 协议没有定义空闲帧USART 能够通过 SCLK 输出位智能卡提供时钟。在智能卡模式下,SCLK 和通信无关,而是先通过一个 5 位预分频器简单地用内部的外设输入时钟来驱动智能卡的时钟。IrDA SIR ENDEC 模块IrDA 模式是通过设置 USART_CR3 寄存器中的 IREN 位来选择的。此模式下,下面这些位必须保持清除状态:LINE,STOP,CLKEN,SCEN,HDSELSIR 发送编码器对从 USART 输出的 NRZ 比特流进行调制。正常模式下,发送的脉宽定义在 3/16 位周期SIR 接收解码器借条来自红外检测器归零位流,且向 USART 输出 NRZ 串行比特流。在空闲状态里,解码器的输入就通常是高。发送器输出和解码器输入有相反的极性。IrDA 是一个半双工通信协议,如果发送器忙,IrDA 解码器将忽略所有 IRDA 接收线路上的数据。如果接收器忙,TX 上从 USART 到 IrDA 的数据不会被 IrDA 编码。在接收数据时,应避免发送数据,否则要发送的数据可能被破坏“0”是作为高脉冲发送,而“1”是作为“0”发送SIR 解码器把 IrDA 兼容的接收信号转变成 USART 的比特流SIR 接收逻辑把高状态逻辑“1”,而低脉冲看做逻辑“0”发送编码器输出和解码器输入有相反的极性。空闲时 SIR 的输出是低电平IrDA 规范要求可接受的脉冲大于 1.41 微秒,可接受的脉冲宽度是可设置的。接收器可以和低功耗发送器通信在 IrDA 模式下,USART_CR2 寄存器中的 STOP 位必须设置城 1 停止位IrDA 低功耗模式叙述如下:发送器:脉宽 3 倍于低功耗波特率。低功耗模式下可设置预分频值对系统时钟分频接收器:与正常模式下接收类似。USART 应忽略宽度小于 1PSC 的脉冲使用 DMA 的连续通信USART 可以利用 DMA 进行连续通信。RX 和 TX 缓冲器可以独立产生 DMA 请求1、使用 DMA 发送DMA 模式发送可以通过设置 USART_CR3 寄存器中的 DMAT 位使能。只要 TXE 位被置 1,数据就可以通过 DMA外设从配置好的 SARM 区域导入到 USART_DR 寄存器。使用下面的流程映射一个用于发送的 DMA 通道把 USART_DR 寄存器的地址写到 DMA 控制寄存器,配置成传输的目标地址,每次 TXE 事件发生时,数据将从存储器转移到这个地址把存储器的地址写到 DMA 控制寄存器,配置成传输的源地址,每次 TXE 时间发生时,数据将从这个存储器区域转移到 USART_DR 寄存器把要发送的字节总数写入 DMA 控制寄存器在 DMA 寄存器中设置通道的优先级根据应用需要,设置半/全传输的 DMA 中断利用 DMA 寄存器激活通道当传输的数目达到 DMA 控制寄存器中设置的值时,DMA 控制寄存器在 DMA 通道中断向量上产生一个中断。若要使用 DMA 来发送,不要使能 TXEIE2、使用 DMA 接收DMA 模式接收可以通过设置 USART_CR3 寄存器中的 DMAR 位使。只要接收到一个数据字节,数据就可以通过DMA 外设从 USART_DR 寄存器导入到配置好的 SARM 区域。使用下面的流程映射一个用于 USART 接收的 DMA通道把 USART_DR 寄存器的地址写到 DMA 控制寄存器,配置成传输的目标地址,每次 RXNE 事件发生时,数据将从这个地址转移到存储器把存储器的地址写到 DMA 控制寄存器,配置成传输的目标地址,每次 RXNE 事件发生时,数据将从 USART_DR寄存器转移到这个存储器区域把要发送的字节总数写入 DMA 控制寄存器在 DMA 寄存器中设置通道的优先级根据应用需要,设置半/全传输的 DMA 中断当传输的数目达到 DMA 控制寄存器中设置的值时,DMA 控制寄存器在 DMA 通道中断向量上产生一个中断。若使用 DMA 来接收,不要使能 RXNEIE 位3、多缓冲通信中的错误标志和中断产生在多缓冲通信情况下,传输过程中发生任何错误,错误标志都将在当前字节之后置有效。在单字节接收中,和 RXNE 一起置有效的帧错误,溢出错误和噪音错误,它们有独立的错误标志中断使能位,若被使能,初相任何一个错误,都会在当前字节传输之后产生中断硬件流控制可以通过 nCTS 输入和 nRTS 输出来控制两个设备之间的串行数据流RTS 和 CTS 流控制可以分别通过 USART_CR3 寄存器中的 RTSE 和 CTSE 位来使能1、RTS 流控制若 RTS 流控制被使能,那么只要 USART 接收器准备好了接收新数据,nRTS 有效。当接收寄存器为空时,nTRS无效,表明希望在发送当前帧结束后停止传输2、CTS 流控制若 CTS 流控制被使能,那么发送器在发送下一个帧之前检查 nCTS 输入。若 nCTS 有效,那么下一个数据将被发送,否则发送不会发生。若 nCTS 在发送期间变为无效,当前的传输完成之后停止发送当 CTSE=1 时,一旦 nCTS 输入翻转,CTSIF 状态位自动被硬件置位,这表明接收器是否准备好了通信。若USART_CR3 寄存器中的 CTSIE 位被置 1,将产生一个中断。
阅读全文
0 0
原创粉丝点击