#include "uart.h" #include "string.h" #include "stdlib.h" #include "led.h" #include "beep.h" #include "dataString.h" /********************************************************************************* ************************启明欣欣 STM32F407核心开发板****************************** ********************************************************************************** * 文件名称: usart1.c * * 文件简述:USART1使用 * * 创建日期:2015.03.06 * * 版 本:V1.0 * * 作 者:Clever * * 说 明:利用串口调试助手经过USART1控制LED亮灭与蜂鸣器响闭 * ********************************************************************************** *********************************************************************************/ u8 UART1_reciveBuff[USART1_REC_NUM]; //接收缓存数组,最大USART_REC_LEN个字节 u8 uart_byte_count=0; u8 aRxBuffer[RXBUFFERSIZE]; //HAL库使用的串口接收缓冲 UART_HandleTypeDef UART1_Handler; //UART句柄 u8 UART1_reciveStr[USART1_REC_NUM]; //接收缓存数组,最大USART_REC_LEN个字节 u8 UART1_reciveOk = 0; /**************************************************************************** * 名 称: void HAL_UART_MspInit(UART_HandleTypeDef *huart) * 功 能:UART底层初始化,时钟使能,引脚配置,中断配置 * 入口参数:huart:串口句柄 * 返回参数:无 * 说 明:此函数会被HAL_UART_Init()调用 ****************************************************************************/ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { //GPIO端口设置 GPIO_InitTypeDef GPIO_Initure; if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化 { __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PA9 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速 GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9 GPIO_Initure.Pin=GPIO_PIN_10; //PA10 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10 HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3 } } /**************************************************************************** * 名 称: void uart1_init(u32 bound) * 功 能:USART1初始化 * 入口参数:bound:波特率 * 返回参数:无 * 说 明: ****************************************************************************/ void uart1_init(u32 bound) { //UART 初始化设置 UART1_Handler.Instance=USART1; //USART1 UART1_Handler.Init.BaudRate=bound; //波特率 UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式 UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位 UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位 UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控 UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式 HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1 HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 } void uart1_sendStr(char *data) { uart1SendChars((u8 *)data,strGetSize(data)); } /*因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法 运行,以下是解决方法:使用微库,因为使用微库的话,不会使用半主机模式. 请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“这 样以后就可以使用printf,sprintf函数了*/ //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } //串口1发送一个字符 void uart1SendChar(u8 ch) { while((USART1->SR&0x40)==0) { } USART1->DR = (u8) ch; } /**************************************************************************** * 名 称: void uart1SendChars(u8 *str, u16 strlen) * 功 能:串口1发送一字符串 * 入口参数:*str:发送的字符串 strlen:字符串长度 * 返回参数:无 * 说 明: ****************************************************************************/ void uart1SendChars(u8 *str, u16 strlen) { u16 k= 0 ; do { uart1SendChar(*(str + k)); k++; } //循环发送,直到发送完毕 while (k < strlen); } //串口1中断服务程序 void USART1_IRQHandler(void) { u32 timeout=0; HAL_UART_IRQHandler(&UART1_Handler); //调用HAL库中断处理公用函数 timeout=0; while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//等待就绪 { timeout++;////超时处理 if(timeout>HAL_MAX_DELAY) break; } timeout=0; while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1 { timeout++; //超时处理 if(timeout>HAL_MAX_DELAY) break; } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //中断执行任务函数 被 中断服务函数调用 { if(huart->Instance==USART1)//如果是串口1 { if (UART1_reciveOk == 1) { return; } u8 inputChar = aRxBuffer[0]; if (inputChar != '\r' && inputChar != '\n') { strAppendWithSize((char *)UART1_reciveBuff,(char *)&inputChar, 1); } if (inputChar == '\r') { memcpy(UART1_reciveStr, UART1_reciveBuff, USART1_REC_NUM); UART1_reciveBuff[0] = 0; UART1_reciveOk = 1; } } }