123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #include "main.h"
- static void USART1_Init(uint32_t baudRate);
- static void USART2_Init(uint32_t baudRate);
- static void USART3_Init(uint32_t baudRate);
- static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
- static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str);
- USARTClassStruct USARTClass = {
- .USART1_Init = USART1_Init,
- .USART2_Init = USART2_Init,
- .USART3_Init = USART3_Init,
- .USART_SendString1 = USART_SendString1,
- .USART_SendString2 = USART_SendString2
- };
- #define use_USART1
- #define use_USART2
- //#define use_USART3
- #define DEBUG_USART USART1
- /* 在别的地方复现此函数 串口1中断函数
- void USART1_IRQHandler(void)
- {
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- }
- }
- */
- /* 在别的地方复现此函数 串口2中断函数
- void USART2_IRQHandler(void)
- {
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);
- }
- }
- */
- /* 在别的地方复现此函数 串口3中断函数
- void USART3_IRQHandler(void)
- {
- if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART3, USART_IT_RXNE);
- }
- }
- */
- /**
- * @brief USART1初始化
- * @param baudRate: 波特率
- * @retval None
- */
- static void USART1_Init(uint32_t baudRate)
- {
- #ifdef use_USART1
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- // 打开串口GPIO的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- // 打开串口外设的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- // 将USART Tx的GPIO配置为推挽复用模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- // 将USART Rx的GPIO配置为浮空输入模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- // 配置波特率
- USART_InitStructure.USART_BaudRate = baudRate;
- // 配置 针数据字长
- 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;
- // 完成串口的初始化配置
- USART_Init(USART1, &USART_InitStructure);
- // 使能串口
- USART_Cmd(USART1, ENABLE);
- //使能接收中断
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- }
- /**
- * @brief USART2初始化
- * @param baudRate: 波特率
- * @retval None
- */
- static void USART2_Init(uint32_t baudRate)
- {
- #ifdef use_USART2
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- // 打开串口GPIO的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- // 打开串口外设的时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- // 将USART Tx的GPIO配置为推挽复用模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- // 将USART Rx的GPIO配置为浮空输入模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- // 配置波特率
- USART_InitStructure.USART_BaudRate = baudRate;
- // 配置 针数据字长
- 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;
- // 完成串口的初始化配置
- USART_Init(USART2, &USART_InitStructure);
- // 使能串口
- USART_Cmd(USART2, ENABLE);
- //使能接收中断
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- }
- /**
- * @brief USART3初始化
- * @param baudRate: 波特率
- * @retval None
- */
- static void USART3_Init(uint32_t baudRate)
- {
- #ifdef use_USART3
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- // 打开串口GPIO的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- // 打开串口外设的时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
- // 将USART Tx的GPIO配置为推挽复用模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- // 将USART Rx的GPIO配置为浮空输入模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- // 配置波特率
- USART_InitStructure.USART_BaudRate = baudRate;
- // 配置 针数据字长
- 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;
- // 完成串口的初始化配置
- USART_Init(USART3, &USART_InitStructure);
- // 使能串口
- USART_Cmd(USART3, ENABLE);
- //使能接收中断
- USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
- NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- }
- /**
- * @brief USART发送定长字符串
- * @param USARTx: 串口几发送
- * @param str: 发送的内容
- * @param len: 长度
- * @retval None
- */
- static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len)
- {
- unsigned short count = 0;
-
- for(; count < len; count++)
- {
- USART_SendData(USARTx, *str++); //发送数据
- while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); //等待发送完成
- }
- }
- /**
- * @brief USART发送不定长字符串
- * @param USARTx: 串口几发送
- * @param str: 发送的内容
- * @retval None
- */
- static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str)
- {
- unsigned int k=0;
- do
- {
- USART_SendData(USARTx, *(str + k) );
- /* 等待发送数据寄存器为空 */
- while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){}
- k++;
- }while(*(str + k)!= '\0');
- /* 等待发送完成 */
- while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}
- }
- #ifdef DEBUG_printf
- ///重定向c库函数printf到串口,重定向后可使用printf函数
- int fputc(int ch, FILE *f)
- {
- /* 发送一个字节数据到串口 */
- USART_SendData(DEBUG_USART, (uint8_t) ch);
- /* 等待发送完毕 */
- while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);
- return (ch);
- }
- #else
- int fputc(int ch, FILE *f)
- {
- return (ch);
- }
- #endif
|