//USART.C
/*********************************************************************************************************/
/* USART 收发 */
/* 陈鹏 20110611*/
#include "SYSTEM.H"
#include "GPIO_INIT.H"
#include "USART.H"
//定义串口通道号最大值
#define UART_ChMax 1
//UART外设结构指针
static const USART_TypeDef * USARTxN[5] = {USART1,USART2,USART3,UART4,UART5};
//相关UART状态结构
typedef struct
{
FlagStatus NewDataFlag;//接收到新数据
FlagStatus BuffFull; //接收Buff满
FlagStatus IntRx; //是否开启中断接收
u8 *RxBuff;//接收Buff指针
u16 RxBuffSize;//接收缓冲区大小,一帧数据大小
u16 UartRxCnt;//接收数据计数器
} UartRx_TypeDef;
//UART1 接收状态结构
static UartRx_TypeDef UartRx[UART_ChMax + 1];
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
UARTx_SendByte(0,(u8)ch);
return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////
/*************************************************************************************************************************
* 函数 : u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
* 功能 : 串口初始化
* 参数 : ch:通道选择,0->usart1;SYS_CLK当前系统时钟,Speed:串口速度,RX_Int:是否时能中断接受
* 返回 : 0:成功,1:失败
* 依赖 : 底层宏定义
* 作者 : 陈鹏
* 时间 : 20120403
* 最后修改时间 : 20120403
* 说明 : USART1~UART5,对应通道0~4
*************************************************************************************************************************/
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针
u32 clock;
u8 irq_n;
float fclk;
if(ch > UART_ChMax)
return 1; //端口号超出范围
//初始化UART IO
DeviceClockEnable(DEV_AFIO,ENABLE);//复用功能AFIO时钟使能
switch (ch)
{
case 0: //通道0,USART1 ,TX:PA9;RX:PA10
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能
DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 时钟使能
GPIOx_Init(GPIOA,BIT9,AF_PP, SPEED_10M);
//PA09,TXD只能设置成复用推挽输出
GPIOx_Init(GPIOA,BIT10,IN_FLOATING,IN_IN); //浮空输入
DeviceReset(DEV_USART1);//复位串口1
irq_n = IRQ_USART1;//串口1中断号
}break;
case 1: //通道1,USART2 ,TX:PA2;RX:PA3
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能
DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 时钟使能
GPIOx_Init(GPIOA,BIT2,AF_PP, SPEED_10M);
//PA2,TXD只能设置成复用推挽输出
GPIOx_Init(GPIOA,BIT3,IN_FLOATING,IN_IN); //浮空输入
DeviceReset(DEV_USART2);//复位串口2
irq_n = IRQ_USART2;//串口2中断号
}break;
case 2: //通道2,USART3 ,TX:PD8;RX:PD9
{
DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能
DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 时钟使能
GPIOx_Init(GPIOD,BIT8,AF_PP, SPEED_10M);
//PD8,TXD只能设置成复用推挽输出
GPIOx_Init(GPIOD,BIT9,IN_FLOATING,IN_IN); //浮空输入
DeviceReset(DEV_USART3);//复位串口3
irq_n = IRQ_USART3;//串口3中断号
}break;
case 3: //通道3,UART4 ,TX:PC10;RX:PC11
{
DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能
DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 时钟使能
GPIOx_Init(