STM32 USART1 USART2 UART3配置 接收函式和傳送函式
阿新 • • 發佈:2018-12-30
STM32F10x系列,串列埠1、串列埠2、串列埠3配置以及中斷函式、接收資料和傳送資料函式
uart.c
//硬體驅動 #include "usart.h" #include "delay.h" //C庫 #include <stdarg.h> #include <string.h> /* ************************************************************ * 函式名稱: Usart1_Init * * 函式功能: 串列埠1初始化 * * 入口引數: baud:設定的波特率 * * 返回引數: 無 * * 說明: TX-PA9 RX-PA10 ************************************************************ */ void Usart1_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啟GPIOA的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //開啟USART1的時鐘 //PA9 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //設定為複用模式 gpioInitStruct.GPIO_Pin = GPIO_Pin_9; //初始化Pin9 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承載的最大頻率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA //PA10 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //設定為浮空輸入 gpioInitStruct.GPIO_Pin = GPIO_Pin_10; //初始化Pin10 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承載的最大頻率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬體流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和傳送 usartInitStruct.USART_Parity = USART_Parity_No; //無校驗 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位資料位 USART_Init(USART1, &usartInitStruct); USART_Cmd(USART1, ENABLE); //使能串列埠 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷 nvicInitStruct.NVIC_IRQChannel = USART1_IRQn; //usart1中斷號 nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; //中斷通道使能 nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; //搶佔中斷優先順序(值越小優先順序越高) nvicInitStruct.NVIC_IRQChannelSubPriority = 2; //子中斷優先順序(值越小優先順序越高) NVIC_Init(&nvicInitStruct); //初始化NVIC } /* ************************************************************ * 函式名稱: Usart2_Init * * 函式功能: 串列埠2初始化 * * 入口引數: baud:設定的波特率 * * 返回引數: 無 * * 說明: TX-PA2 RX-PA3 ************************************************************ */ void Usart2_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //PA2 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; gpioInitStruct.GPIO_Pin = GPIO_Pin_2; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); //PA3 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpioInitStruct.GPIO_Pin = GPIO_Pin_3; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬體流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和傳送 usartInitStruct.USART_Parity = USART_Parity_No; //無校驗 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位資料位 USART_Init(USART2, &usartInitStruct); USART_Cmd(USART2, ENABLE); //使能串列埠 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中斷 nvicInitStruct.NVIC_IRQChannel = USART2_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* ************************************************************ * 函式名稱: Usart3_Init * * 函式功能: 串列埠2初始化 * * 入口引數: baud:設定的波特率 * * 返回引數: 無 * * 說明: TX-PB10 RX-PB11 ************************************************************ */ void Usart3_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART1_TX GPIOB.10 gpioInitStruct.GPIO_Pin = GPIO_Pin_10; //PB.10 gpioInitStruct.GPIOSpeed = GPIO_Speed_50MHz; gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出 GPIO_Init(GPIOB, &gpioInitStruct); //初始化GPIOB.10 //USART1_RX GPIOB.11初始化 gpioInitStruct.GPIO_Pin = GPIO_Pin_11; //PB.11 gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入 GPIO_Init(GPIOB, &gpioInitStruct); //初始化GPIOB.11 usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬體流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和傳送 usartInitStruct.USART_Parity = USART_Parity_No; //無校驗 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位資料位 USART_Init(USART3, &usartInitStruct); USART_Cmd(USART3, ENABLE); //使能串列埠 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //使能接收中斷 nvicInitStruct.NVIC_IRQChannel = USART3_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* ************************************************************ * 函式名稱: Usart_SendString * * 函式功能: 串列埠資料傳送 * * 入口引數: USARTx:串列埠組 * str:要傳送的資料 * len:資料長度 * * 返回引數: 無 * * 說明: ************************************************************ */ void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len) { unsigned short count = 0; for(; count < len; count++) { USART_SendData(USARTx, *str++); //傳送資料 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); //等待發送完成 } } /* ************************************************************ * 函式名稱: UsartPrintf * * 函式功能: 格式化列印 * * 入口引數: USARTx:串列埠組 * fmt:不定長參 * * 返回引數: 無 * * 說明: ************************************************************ */ void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART_SendData(USARTx, *pStr++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); } } extern unsigned char usart1Buf[64]; extern unsigned char usart1Len; /* ************************************************************ * 函式名稱: USART1_IRQHandler * * 函式功能: 串列埠1收發中斷 * * 入口引數: 無 * * 返回引數: 無 * * 說明: ************************************************************ */ void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷 { if(usart1Len >= 64) //防止資料過多,導致記憶體溢位 usart1Len = 0; usart1Buf[usart1Len++] = USART1->DR; USART_ClearFlag(USART1, USART_FLAG_RXNE); } } extern char usart2Buf[64]; extern char usart2Len; /* ************************************************************ * 函式名稱: USART2_IRQHandler * * 函式功能: 串列埠2收發中斷 * * 入口引數: 無 * * 返回引數: 無 * * 說明: ************************************************************ */ void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷 { if(usart2Len >= 64) //防止資料過多,導致記憶體溢位 usart2Len = 0; usart2Buf[usart2Len++] = USART2->DR; USART_ClearFlag(USART2, USART_FLAG_RXNE); } } extern char usart3Buf[64]; extern char usart3Len; /* ************************************************************ * 函式名稱: USART3_IRQHandler * * 函式功能: 串列埠3收發中斷 * * 入口引數: 無 * * 返回引數: 無 * * 說明: ************************************************************ */ void USART3_IRQHandler(void) { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中斷 { if(usart3Len >= 64) //防止資料過多,導致記憶體溢位 usart3Len = 0; usart3Buf[usart3Len++] = USART3->DR; USART_ClearFlag(USART3, USART_FLAG_RXNE); } }