STM32F030 UART应用

//==文件uart.h============================================================
#ifndef _UART_H_
#define _UART_H_

#define			V_UART_RX			0   //接收时状态
#define			V_UART_TX			1		//发送时状态

#define			V_RX_NUM		11	//接收数据字节长

#define			V_TX_NUM		8 //发送数据字节长

#define			VT_ClrRxIndex		5		//50ms没有接收到数据 清除接收索引

//==================================================
extern uint8 Rx_Buf[V_RX_NUM] ;
extern uint8 Tx_Buf[V_TX_NUM] ;
extern uint8 Rx_Index ;
extern uint8 Tx_Index ;

extern void uart_putc(unsigned char c);
extern void uart_puts(char *s ) ;
extern void USART_INIT(void) ;

extern void USART_GPIO_Init(void) ;
extern void USART_Param_Init(uint32 Invalue) ;
extern void Init_Uart_SendDat(uint8 Invalue) ;

extern uint8 CalcateCheckSumUart(uint8 *a,uint8 DataLong) ;

#endif

//==文件uart.c============================================================
#include "global.h"
#include "uart.h"

#define    Init_Uart_CALL

uint8 Rx_Buf[V_RX_NUM] ;
uint8 Tx_Buf[V_TX_NUM] ;

uint8 Rx_Index = 0 ;
uint8 Tx_Index = 0 ;

#ifdef  Init_Uart_CALL

//*************************************
// 函数名称:USART_GPIO_Init
// 函数功能:uart GPIO初始化
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
void USART_GPIO_Init(void)
{
		GPIO_InitTypeDef  GPIO_InitStructure;

		RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);

		//-----PB6 TX------------- -----PB7 RX-------------
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);

		GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
		GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
}
//======串口 发送时IO状态初始化======================================
void USART_Param_Init(uint32 Invalue)
{
		GPIO_InitTypeDef  GPIO_InitStructure;

		RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);

		//-----PB7 RX-------------		接收为UART
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
		GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);

		if(Invalue == V_UART_RX)	//接收时状态
		{
			//-----PB6 TX------------- 		发送为输入
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
			GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //GPIO_OType_OD ;//
			GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//GPIO_PuPd_DOWN;//;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_Init(GPIOB, &GPIO_InitStructure);

			USART_ClearITPendingBit(USART1,USART_IT_RXNE) ;	 //清除接收中断标志
			USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断使能
			USART_ITConfig(USART1,USART_IT_TC,DISABLE); //发送中断不使能 USART_IT_TXE
		}
		else if(Invalue == V_UART_TX)		//发送时状态
		{
			//-----PB6 RX-------------		发送为UART
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
			GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
			GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_Init(GPIOB, &GPIO_InitStructure);

			GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);

			USART_ITConfig(USART1,USART_IT_RXNE,DISABLE );//接收中断不使能
			USART_ClearITPendingBit(USART1,USART_IT_TC) ;		//清除发送中断标志
			USART_ITConfig(USART1,USART_IT_TC,ENABLE); //发送中断使能 USART_IT_TXE	

		}

}
//*************************************
// 函数名称:USART_INIT
// 函数功能:uart初始化
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
void USART_INIT(void)
{
		USART_InitTypeDef USART_InitStructure;
		NVIC_InitTypeDef 	NVIC_InitStructure;

		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );		

		NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);

		USART_InitStructure.USART_BaudRate = 4800;//9600
		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_ClearITPendingBit(USART1,USART_IT_RXNE) ;	 //清除接收中断标志
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断使能

		USART_ClearITPendingBit(USART1,USART_IT_TC) ;		//清除发送中断标志
//		USART_ITConfig(USART1,USART_IT_TC,ENABLE); //发送中断使能 USART_IT_TXE
}
//*************************************
// 函数名称:uart_putc
// 函数功能:uart发送一字符
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
void uart_putc(unsigned char c)
{
	while(!((USART1->ISR)&(1<<7)));
	USART1->TDR=c;
}
//*************************************
// 函数名称:uart_puts
// 函数功能:uart发送一字符串
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
void uart_puts(char *s )
{
	while (*s)
	uart_putc(*s++);
}

//*************************************
// 函数名称:uart_puts
// 函数功能:uart发送一字符串
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
void Init_Uart_SendDat(uint8 Invalue)
{

	Tx_Buf[0] = 0xc3 ;
	Tx_Buf[1] = 0x00 ;
	Tx_Buf[2] = 0x00 ;
	Tx_Buf[3] = 0x00 ;
	Tx_Buf[4] = 0x00 ;
	Tx_Buf[5] = 0x00 ;
	Tx_Buf[6] = Invalue ;	

	Tx_Buf[V_TX_NUM-1] = CalcateCheckSumUart(&Tx_Buf[0],(V_TX_NUM-1)) ;

	USART_Param_Init(V_UART_TX) ; //发送数据时 初始化端口
	Tx_Index = 0 ;
	uart_putc(Tx_Buf[Tx_Index]) ;
	Tx_Index ++ ;
}

//*************************************
// 函数名称:uart_puts
// 函数功能:uart发送一字符串
// 入口参数:无
// 出口参数:无
// 备注:
//***************************************
uint8 CalcateCheckSumUart(uint8 *a,uint8 DataLong)
{
	uint8 i ;
	uint8 Tmp=0 ;

	for(i=0;i<DataLong;i++)
	{
		Tmp += a[i] ;
	}
	Tmp = (Tmp^0xff)+1 ;	

	return Tmp ;
}

#endif //Init_Uart_CALL

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 04:56:59

STM32F030 UART应用的相关文章

UART

A Universal Asynchronous Receiver and Transmitter (UART) in Exynos 4412 SCP provide four independent Exynos 4412 SCP 的UART提供了4个异步串口通道(ch0~3).还提供的ch4专用通道给GPS.channels with asynchronous and serial input/output (I/O) ports for general purpose (Ch0 to 3)

[tty与uart]1.Linux中tty框架与uart框架之间的调用关系剖析

转自:http://developer.51cto.com/art/201209/357501_all.htm 目录 在这期间有一个问题困扰着我,那就是来自用户空间的针对uart设备的操作意图是如何通过tty框架逐层调用到uart层的core驱动,进而又是如何调用到真实对应于设备的设备驱动的,本文中的对应设备驱动就是8250驱动,最近我想将这方面的内容搞清楚. 在说明这一方面问题之前我们先要大致了解两个基本的框架结构,tty框架和uart框架. 1.tty框架 在linux系统中,tty表示各种

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

UART基础知识【转载】

1.UART原理说明 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出:接收数据时,UART检测另一根电线上的信号,串行收集然后放在缓冲区中,CPU即可读取UART获得这些数据.UART之间以全双工方式传输数据,最精确的连线方法只有3根电线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双发提供参考电平,连线如下: UART使用标准的TTL/CMOS逻辑电平(0~5v.0~3.3v.0~2.5v或0~1.8v)来表示数据,高电平表示1,低电平表示0.为了

(三) UART 串口通讯

UART  : university asynchronous receiver and transmitter UART  // 通用异步接收器和发送器 为什么要有串口:因为许多嵌入式设备没有显示屏,无法获得设备的实事数据信息,所以可以通过 UART 串口和超级终端相连,打印嵌入式设备输出信息.也可以通过串口跟踪和调试. 比如设备: 网络路由器.交换机通过串口配置, GPS接收器通过串口输出GPS接收的数据. 1.异步通信技术:发送和接收方没有同步时钟,只有数据线,但是协商好了协议,(固定频率

Tiny4412之串口(Uart)驱动编写

一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线 接收数据.它很简单并且能够实现远距离通信.比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2 米:而对于串口而言,长度可达1200米. 串口通信所采用的通信协议为RS-232,RS-232通信方式允许简单连

linux下uart应用编程

目的:在用户空间通过读写uart设备文件,控制uart串口发送和接收数据. 在用户空间设置uart波特率.奇偶校验使能等操作是通过termios结构体和termios库函数完成,需要在应用程序中包含termios.h头文件. 一.termios结构体定义 #define NCCS 17 // 控制字符数组的长度. struct termios { unsigned long c_iflag; // 输入模式标志 unsigned long c_oflag; // 输出模式标志 unsigned

采用FPGA实现UART转SPI

应用笔记 V1.1 2015/2/10 采用FPGA实现UART转SPI ? 概述 ? 本文提供了实现UART转SPI的Verilog代码的功能描述.这份笔记将介绍UART和SPI的基本知识,代码设计的基本思路,以及代码的具体实现及其描述.本程序的具体功能在于配合AD9512_Serial_GUI完成AD9512寄存器的配置,包括读及写过程. 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/02/08 V1.0 初始版本,通过实际验证 2015/02/10 V1.1

Uart串口与RS232串口的区别

Uart这里指的是TTL电平的串口:RS232指的是RS232电平的串口. TTL电平是3.3V的,而RS232是负逻辑电平,它定义+3~+15V为低电平,而-15~-3V为高电平. Uart串口的RXD.TXD等一般直接与处理器芯片的引脚相连,而RS232串口的RXD.TXD等一般需要经过电平转换(通常由Max232等芯片进行电平转换)才能接到处理器芯片的引脚上,否则这么高的电压很可能会把芯片烧坏. 我们平时所用的电脑的串口就是RS232的,当我们在做电路工作时,应该注意下外设的串口是Uart