mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
173 lines
6.1 KiB
C
173 lines
6.1 KiB
C
#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;
|
||
}
|
||
}
|
||
}
|