11.串口收发实验:
/* Includes ------------------------------------------------------------------*/ #include \
#include \
/** @addtogroup STM32F10x_StdPeriph_Examples * @{ */
/** @addtogroupUSART_Interrupt * @{ */
GPIO_InitTypeDefGPIO_InitStructure;
/* Private typedef -----------------------------------------------------------*/ typedefenum { FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/ #define TxBufferSize1 (countof(TxBuffer1) - 1) #define TxBufferSize2 (countof(TxBuffer2) - 1) #define RxBufferSize1 TxBufferSize2 #define RxBufferSize2 TxBufferSize1
/* Private macro -------------------------------------------------------------*/ #define countof(a) (sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/ USART_InitTypeDefUSART_InitStructure;
uint8_t TxBuffer1[] = \串口中断收发示例: 串口1 ->串口2 (中断收发)%uint8_t TxBuffer2[] = \串口中断收发示例: 串口2 ->串口1 (中断收发)%uint8_t RxBuffer1[RxBufferSize1]; uint8_t RxBuffer2[RxBufferSize2]; __IO uint8_t TxCounter1 = 0x00; __IO uint8_t TxCounter2 = 0x00; __IO uint8_t RxCounter1 = 0x00; __IO uint8_t RxCounter2 = 0x00;
uint8_t NbrOfDataToTransfer1 = TxBufferSize1; uint8_t NbrOfDataToTransfer2 = TxBufferSize2; uint8_t NbrOfDataToRead1 = RxBufferSize1; uint8_t NbrOfDataToRead2 = RxBufferSize2; __IO TestStatus TransferStatus1 = FAILED; __IO TestStatus TransferStatus2 = FAILED;
/* Private function prototypes -----------------------------------------------*/ voidRCC_Configuration(void); voidGPIO_Configuration(void); voidNVIC_Configuration(void);
TestStatusBuffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
/* Private functions ---------------------------------------------------------*/ /**
* @brief Main program * @param None * @retvalNone */
int main(void) {
/*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */
/* System Clocks Configuration */ RCC_Configuration();
/* NVIC configuration */ NVIC_Configuration();
/* Configure the GPIO ports */ GPIO_Configuration();
GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有的LED指示灯*/ /* USART1 and USART2 configuration ------------------------------------------------------*/
/* USART1 and USART2 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity
- Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */
USART_InitStructure.USART_BaudRate = 115200; /*设置波特率为115200*/
USART_InitStructure.USART_WordLength = USART_WordLength_8b;/*设置数据位为8*/ USART_InitStructure.USART_StopBits = USART_StopBits_1; /*设置停止位为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; /*发送和接收*/
/*配置串口1 */
USART_Init(USART1, &USART_InitStructure); /*配置串口2*/
USART_Init(USART2, &USART_InitStructure);
/*使能串口1的发送和接收中断*/
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
/*使能串口2的发送和接收中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
/* 使能串口1 */
USART_Cmd(USART1, ENABLE);
/* 使能串口2 */
USART_Cmd(USART2, ENABLE);
/* Wait until end of transmission from USART1 to USART2 */ while(RxCounter2 < RxBufferSize2) { }
/* Wait until end of transmission from USART2 to USART1 */ while(RxCounter1 < RxBufferSize1) { }
/* Check the received data with the send ones */
TransferStatus1 = Buffercmp(TxBuffer2, RxBuffer1, RxBufferSize1);
/* TransferStatus1 = PASSED, if the data transmitted from USART2 and received by USART1 are the same */
/* TransferStatus1 = FAILED, if the data transmitted from USART2 and received by USART1 are different */
TransferStatus2 = Buffercmp(TxBuffer1, RxBuffer2, RxBufferSize2);
/* TransferStatus2 = PASSED, if the data transmitted from USART1 and received by USART2 are the same */
/* TransferStatus2 = FAILED, if the data transmitted from USART1 and received by USART2 are different */
while (1) {
if(TransferStatus1 == PASSED) { GPIO_SetBits(GPIO_LED,LD1_PIN);/*点亮LD1,串口1接收的数据与串口2发送的数据相同*/ }
else if(TransferStatus1 == FAILED) {
GPIO_SetBits(GPIO_LED,LD2_PIN);/*点亮LD2,串口1接收的数据与串口2发送的数据不相同*/ }
if(TransferStatus2 == PASSED) { GPIO_SetBits(GPIO_LED,LD3_PIN);/*点亮LD3,串口2接收的数据与串口1发送的数据相同*/ }
else if(TransferStatus2 == FAILED) { GPIO_SetBits(GPIO_LED,LD4_PIN);/*点亮LD4,串口2接收的数据与串口1发送的数据不相同*/ } } } /**
* @brief Configures the different system clocks. * @param None * @retvalNone */
voidRCC_Configuration(void) {
/*使能串口1和串口2使用的GPIO时钟*/
RCC_APB2PeriphClockCmd(USART1_GPIO_CLK |USART2_GPIO_CLK, ENABLE); /* Enable USART1 Clock */ /*使能串口1时钟*/
RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE); /*使能串口2时钟*/
RCC_APB1PeriphClockCmd(USART2_CLK, ENABLE);
/*使能LED灯使用的GPIO时钟*/
RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); } /**
* @brief Configures the different GPIO ports. * @param None * @retvalNone */
voidGPIO_Configuration(void) {
GPIO_InitTypeDefGPIO_InitStructure;
/*串口1 RX管脚配置*/
/* Configure USART1 Rx as input floating */ GPIO_InitStructure.GPIO_Pin = USART1_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
/*串口2 RX管脚配置*/
/* Configure USART2 Rx as input floating */ GPIO_InitStructure.GPIO_Pin = USART2_RxPin; GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
/*串口1 TX管脚配置*/
/* Configure USART1 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = USART1_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
/*串口2 TX管脚配置*/
/* Configure USART2 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = USART2_TxPin; GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
/* 配置LED灯使用的GPIO管脚模式*/
GPIO_InitStructure.GPIO_Pin = LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_LED, &GPIO_InitStructure); } /**