2021-09-05 14:34:01 +08:00

173 lines
6.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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“这
样以后就可以使用printfsprintf函数了*/
//重定义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;
}
}
}