赛元微 SC92F8003 UART0收发数据 使用示范
#include "sc92f8003_uart0.h"
#include "sc92f8003_gpio.h"
void Uart0Init()
{
GPIO_Init(GPIO1, GPIO_PIN_5, GPIO_MODE_IN_PU);
//波特率9600,TIMER1做时钟源,允许接收
UART0_Init(16000000, 9600, UART0_Mode_10B, UART0_CLOCK_TIMER1, UART0_RX_ENABLE);
UART0_ITConfig(ENABLE, LOW); //使能uart0中断
}
void main(void)
{
Uart0Init();
enableInterrupts();
while(1);
}
#include "sc92f8003_uart0.h"
/**************************************************
*函数名称:void UART0_DeInit(void)
*函数功能:UART0相关寄存器复位至缺省值
*入口参数:void
*出口参数:void
**************************************************/
void UART0_DeInit(void)
{
OTCON &= 0XEF;
SCON = 0X00;
PCON &= 0X7F;
IE &= (~0X10);
IP &= (~0X10);
}
/**************************************************
*函数名称:UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion)
*函数功能:UART0引脚选择
*入口参数:PinSeletion 选择UART0引脚为P15P16或P11P20
*出口参数:void
**************************************************/
void UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion)
{
OTCON = OTCON & 0XDF | PinSeletion;
}
/**************************************************
*函数名称:void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode)
*函数功能:UART0初始化配置函数
*入口参数:Uart0Fsys 系统时钟频率
BaudRate 波特率(模式0下只可选择UART0_BaudRate_FsysDIV12或UART0_BaudRate_FsysDIV4)
Mode UART0工作模式
ClockMode 波特率时钟源(TIMER1/TIMER2)
RxMode 接收允许选择
*出口参数:void
**************************************************/
void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode)
{
SCON = (SCON & 0X2F) | Mode | RxMode; //设置UART工作模式,设置接收允许位
if(Mode == UART0_Mode_8B)
{
if(BaudRate == UART0_BaudRate_FsysDIV12)
{
PCON &= 0X7F;
}
else if(BaudRate == UART0_BaudRate_FsysDIV4)
{
PCON |= 0X80;
}
}
else
{
T2CON = (T2CON & 0xCF) | ClockMode; //设置波特率时钟源
if(ClockMode == UART0_CLOCK_TIMER1)
{
TH1 = (Uart0Fsys / BaudRate) / 256;
TL1 = (Uart0Fsys / BaudRate) % 256;
TR1 = 0;
}
else if(ClockMode == UART0_CLOCK_TIMER2)
{
RCAP2H = (Uart0Fsys / BaudRate) / 256;
RCAP2L = (Uart0Fsys / BaudRate) % 256;
TR2 = 1;
}
}
}
/*****************************************************
*函数名称:void UART0_SendData8(uint8_t Data)
*函数功能:UART0发送8位数据
*入口参数:uint8_t Data 发送的数据
*出口参数:void
*****************************************************/
void UART0_SendData8(uint8_t Data)
{
SBUF = Data;
}
/**************************************************
*函数名称:uint8_t UART0_ReceiveData8(void)
*函数功能:获得SBUF中的值
*入口参数:void
*出口参数:uint8_t
**************************************************/
uint8_t UART0_ReceiveData8(void)
{
return SBUF;
}
/*****************************************************
*函数名称:void UART0_SendData9(uint16_t Data)
*函数功能:UART0发送9位数据
*入口参数:uint16_t Data 发送的数据
*出口参数:void
*****************************************************/
void UART0_SendData9(uint16_t Data)
{
uint8_t Data_9Bit;
Data_9Bit = (Data >> 8);
if(Data_9Bit)
{
SCON |= 0X08;
}
else
{
SCON &= 0XF7;
}
SBUF = (uint8_t)Data;
}
/**************************************************
*函数名称:uint16_t UART0_ReceiveData9(void)
*函数功能:获得SBUF中的值及第九位的值
*入口参数:void
*出口参数:uint16_t
**************************************************/
uint16_t UART0_ReceiveData9(void)
{
uint16_t Data9;
Data9 = SBUF + ((uint16_t)(SCON & 0X04) << 6);
SCON &= 0XFB;
return Data9;
}
/*****************************************************
*函数名称:void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority)
*函数功能:UART0中断初始化
*入口参数:FunctionalState NewState 中断使能/关闭选择
PriorityStatus Priority 中断优先级选择
*出口参数:void
*****************************************************/
void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority)
{
//中断使能/关闭设置
if(NewState == DISABLE)
{
EUART = 0;
}
else
{
EUART = 1;
}
//中断优先级设置
if(Priority == LOW)
{
IPUART = 0;
}
else
{
IPUART = 1;
}
}
/*****************************************************
*函数名称:FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
*函数功能:获得UART0中断标志状态
*入口参数:UART0_Flag 中断标志位选择
*出口参数:FlagStatus UART0中断标志状态
*****************************************************/
FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
{
return (FlagStatus)(SCON & UART0_Flag);
}
/*****************************************************
*函数名称:void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
*函数功能:清除UART0中断标志状态
*入口参数:UART0_Flag 中断标志位选择
*出口参数:void
*****************************************************/
void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
{
SCON &= (~UART0_Flag);
}
#ifndef __SC92F8003_UART0_H
#define __SC92F8003_UART0_H
#include "sc92f8003.h"
#define UART0_BaudRate_FsysDIV12 0X00 //仅模式0可用,串行端口在系统时钟的1/12下运行
#define UART0_BaudRate_FsysDIV4 0X01 //仅模式0可用,串行端口在系统时钟的1/4下运行
typedef enum {
UART0_PinSelection_P15P16 = (uint8_t)0x00, //UART0引脚为P15,P16
UART0_PinSelection_P11P20 = (uint8_t)0x10 //UART0引脚为P11,P20
} UART0_PinSelection_TypeDef;
typedef enum {
UART0_CLOCK_TIMER1 = (uint8_t)0X00, //TIMER1做波特率发生器
UART0_CLOCK_TIMER2 = (uint8_t)0X30 //TIMER2做波特率发生器
} UART0_Clock_Typedef;
typedef enum {
UART0_Mode_8B = 0X00, //UART工作模式:8位半双工
UART0_Mode_10B = 0X40, //UART工作模式:10位全双工
UART0_Mode_11B = 0XC0 //UART工作模式:11位全双工
} UART0_Mode_Typedef;
typedef enum {
UART0_RX_ENABLE = 0x10, //允许接收数据
UART0_RX_DISABLE = 0x00 //不允许接收数据
} UART0_RX_Typedef;
typedef enum {
UART0_FLAG_RI = 0X01, //接收中断标志位RI
UART0_FLAG_TI = 0X02 //发送中断标志位TI
} UART0_Flag_Typedef;
void UART0_DeInit(void);
void UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion);
void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode);
void UART0_SendData8(uint8_t Data);
uint8_t UART0_ReceiveData8(void);
void UART0_SendData9(uint16_t Data);
uint16_t UART0_ReceiveData9(void);
void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority);
FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag);
void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag);
#endif
#include "sc92f8003_gpio.h"
#include "sc92f8003_timer0.h"
#include "sc92f8003_timer1.h"
#include "sc92f8003_timer2.h"
#include "sc92f8003_adc.h"
#include "sc92f8003_btm.h"
#include "sc92f8003_pwm.h"
#include "sc92f8003_exti.h"
#include "sc92f8003_uart0.h"
#include "sc92f8003_ssi.h"
void EXTI0Interrupt() interrupt 0
{
}
void Timer0Interrupt() interrupt 1
{
}
void EXTI1Interrupt() interrupt 2
{
}
void Timer1Interrupt() interrupt 3
{
}
void UART0Interrupt() interrupt 4
{
if(UART0_GetFlagStatus(UART0_FLAG_TI))
{
UART0_ClearFlag(UART0_FLAG_TI); //清除TI
}
else if(UART0_GetFlagStatus(UART0_FLAG_RI))
{
UART0_ClearFlag(UART0_FLAG_RI); //清除RI
UART0_SendData9(UART0_ReceiveData9()); //发送接收的数据
}
}
void Timer2Interrupt() interrupt 5
{
}
void ADCInterrupt() interrupt 6
{
}
void SSIInterrupt() interrupt 7
{
}
void PWMInterrupt() interrupt 8
{
}
void BTMInterrupt() interrupt 9
{
}
void EXTI2Interrupt() interrupt 10
{
}