打印
[应用方案]

SC92F8003 UART0收发数据

[复制链接]
507|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2024-1-31 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
赛元微 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
{

}
————————————————



原文链接:https://blog.csdn.net/ZCY5202015/article/details/127461537

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9591

帖子

23

粉丝