⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 stm32+ucos-ii
💻 C
字号:
 /****************************************************************************
* Copyright (C), 2010 求是信息科技
*
* 文件名: uart.c
* 内容简述: 本文件包含USART1使用的一些常用函数。
* 函数说明:USART1_Init()
*              将串口USART1配置好,默认打开中断,优先级为组0,从优先级为0,在实际应用中根据需要更改
*           USART1_RCC_Configuration()
*	       系统初始化,使能USART1和GPIOA时钟,调用时就放在最前面,否则程序无法正常运行
*           USART1_GPIO_Configuration()
*	       USART1管脚配置
*           USART1_Configuration()
*              USART1参数配置
*           USART1_WriteString()
*              向USART1写一个字符串	
*           USART1_IRQHandler()
*              中断服务子程序,根据需要进行更改
*           printf() scanf()
*              向串口输出,从串口接收数据,与平常使用无差别			
* 文件历史:
* 版本号  日期       作者    说明
* v1.0    2011-2-8   吴占敏  创建该文件
*/
#include "stm32f10x.h"
#include <stdio.h>
#include "uart.h"
#include "includes.h"
extern OS_EVENT *USART1MsgQueue;
char     msg[40];

/*******************************************************************************
*	函数名:USART1_Init
*	输  入:	无
*	输  出:	无
*	功能说明:USART1初始化,管脚配置,USART1参数配置,时钟使能,中断配置。
**/
void USART1_Init(void)
{
	USART1_RCC_Configuration();	//必须放在第一行,否则串口无法正常工作	 
	USART1_GPIO_Configuration();
	USART1_Configuration();
	//USART1_NVIC_Configuration();
}

/*******************************************************************************
*	函数名:USART1_RCC_Configuration
*	输  入:	无
*	输  出:	无
*	功能说明:系统初始化,使能USART1和GPIOA时钟,调用时就放在最前面,否则程序无法正常运行
*/
void USART1_RCC_Configuration(void)
{   
    /*使能USART1和GPIOA时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );
}

/*******************************************************************************
*	函数名:USART1_GPIO_Configuration
*	输  入:	无
*	输  出:	无
*	功能说明:USART1管脚配置。
*			  根据手册,USART1_TX为PA9,必须设置为复用推挽输出 ,
*			  USART_RX为PA10,必须设置为浮动输入或上拉输入
*/
void USART1_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

    /*把 GPIO_InitStruct 中的每一个参数按缺省值填入
      其实没有这一步程序功能不会有太大影响,但是编写C程序时,
      我们往往希望变量的值在我们的掌控之中*/
	GPIO_StructInit(&GPIO_InitStructure);

    /* USART_TX管脚配置 */
    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_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 浮动输入,也可用上拉输入 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);	
}


/*******************************************************************************
*	函数名:UART1_SendByte
*	输  入:	1字节数据
*	输  出:	无
*	功能说明:USART1发送一个字节的数据。
*/
void UART1_SendByte(INT8U TxData)
{ 
   while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));
   USART_SendData(USART1, TxData);	  
}

/*******************************************************************************
*	函数名:UART1_WriteString
*	输  入:	字符串地址指针
*	输  出:	无
*	功能说明:USART1发送一个字符串。
*/
void USART1_SendString(u8* TxString)
{
	while(*TxString != '\0')
	{	while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//等待数据寄存器数据移入移位寄存,防止覆盖上一次数据
		USART_SendData(USART1, *(TxString++));//该函数在标准库定义,参考文件stm32f10x_usart.c
	}		
}

/*******************************************************************************
*	函数名:USART1_Configuration
*	输  入:	无
*	输  出:	无
*	功能说明:USART1配置。
*			  波特率115200,数据位8位,停止位1位,无奇偶校验,无流控制,
*			  全双工,使能中断,使能USART1外设
*/	
void USART1_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate            = 115200  ;
	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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能USART1中断
	USART_Cmd(USART1, ENABLE);     
}


/*******************************************************************************
*	函数名:USART1_NVIC_Configuration
*	输  入:	无
*	输  出:	无
*	功能说明:系统中断管理,USART1中断优先级设置。
*			  优先级组0,USART1的IRQ通道,从优先级为0,通道使能
*	备  注:为了方便使用,此处单独定义了这么一个中断管理函数,
*           若还有其他中断,则最好把所有中断放一起进行优先级分配。		  
*/
void USART1_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  /* Enable the USARTy Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
*	函数名:USART1_IRQHandler
*	输  入:	无
*	输  出:	无
*	功能说明:USART1中断服务子程序。
**/
void USART1_IRQHandler(void)
{
	u8 RxData;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
	    RxData = USART_ReceiveData(USART1);
		UART1_SendByte(RxData); 	    
	} 
	 
}

void USART1_Isr(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
        msg[0] = USART_ReceiveData(USART1);
        OSQPost(USART1MsgQueue,(void *)&msg[0]);
	} 
}



//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
/*******************************************************************************
*	函数名:fputc
*	输  入:
*	输  出:
*	功能说明:重定义fputc函数,这样可以使用printf函数从串口1打印输出
*/
int fputc(int ch, FILE *f)
{
	/* Place your implementation of fputc here */
	/* e.g. write a character to the USART */
	/* Loop until the end of transmission */
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
	USART_SendData(USART1, (uint8_t) ch);
	return ch;
}     

/*******************************************************************************
*	函数名:fgetc
*	输  入:
*	输  出:
*	功能说明:重定义fgetc函数,这样可以使用scanf函数从串口1输入数据
*/
int fgetc(FILE *f)
{
	/* 等待串口1输入数据 */
	while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
	{}
	return (int)USART_ReceiveData(USART1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -