打印
[demo程序]

NV32 F100 串口驱动

[复制链接]
880|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanzhen654|  楼主 | 2020-2-24 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始化UART,关中断,无硬件流控制
void UART_Init(UART_Type *pUART, UART_ConfigType *pConfig)
{
    uint16_t u16Sbr;
    uint8_t u8Temp;
    uint32_t u32SysClk = pConfig->u32SysClkHz;//定义系统时钟
    uint32_t u32Baud = pConfig->u32Baudrate;//定义波特率

    /* 合法性检查 */
    ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));
  
        /* 设置时钟选通控制用来选择相应的 UART 口 */
  if (pUART == UART0)
        {
                SIM->SCGC |= SIM_SCGC_UART0_MASK;//使能相应功能位, 选通对应 UART
        }
#if defined(CPU_NV32)  
        else if (pUART == UART1)
        {
        SIM->SCGC |= SIM_SCGC_UART1_MASK;
        }
    else
        {
        SIM->SCGC |= SIM_SCGC_UART2_MASK;
        }
#endif   
    /*确保在我们进行配置时, 禁止发送和接收*/
    pUART->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK );
   
    /* 配置 UART 为 8 位模式, 无奇偶校验位 */
    pUART->C1 = 0;
   
    /* 波特率计算 */
    u16Sbr = (((u32SysClk)>>4) + (u32Baud>>1))/u32Baud;
   
    /*把当前数据存放在串口波特率寄存器中, 且SBR位清0,即波特率发生器被禁止*/
    u8Temp = pUART->BDH & ~(UART_BDH_SBR_MASK);
   
    pUART->BDH = u8Temp |  UART_BDH_SBR(u16Sbr >> 8);
    pUART->BDL = (uint8_t)(u16Sbr & UART_BDL_SBR_MASK);

    /*使能 UART 接收和发送 */
    pUART->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK );
}


使用特权

评论回复

相关帖子

沙发
hanzhen654|  楼主 | 2020-2-24 13:38 | 只看该作者
接收一个字符
uint8_t UART_GetChar(UART_Type *pUART)
{

    /* 合法性检测 */
    ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));

    /* 等待直到一个字符被接收 */
    while (!(pUART->S1 & UART_S1_RDRF_MASK));
   
    /* 返回接收到的8位数据 */
    return pUART->D;
}


使用特权

评论回复
板凳
hanzhen654|  楼主 | 2020-2-24 13:38 | 只看该作者
发送一个字符
void UART_PutChar(UART_Type *pUART, uint8_t u8Char)
{   
    /* 一直等待, 直到缓冲区为空 */
    while (!(pUART->S1 & UART_S1_TDRE_MASK));
   
    /* 发送字符到数据寄存器 */
    pUART->D = (uint8_t)u8Char;
}


使用特权

评论回复
地板
hanzhen654|  楼主 | 2020-2-24 13:39 | 只看该作者
波特率设置
void UART_SetBaudrate(UART_Type *pUART, UART_ConfigBaudrateType *pConfig)
{
    uint8_t u8Temp;
    uint16_t u16Sbr;
    uint32_t u32SysClk    = pConfig->u32SysClkHz;
    uint32_t u32baud       = pConfig->u32Baudrate;

    /* 合法性检测 */
    ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));

    /*计算波特率,四舍五入提高精度 */
    u16Sbr = (((u32SysClk)>>4) + (u32baud>>1))/u32baud;

  
    u8Temp = pUART->BDH & ~(UART_BDH_SBR_MASK);
   
    pUART->BDH = u8Temp |  UART_BDH_SBR(u16Sbr >> 8);
    pUART->BDL = (uint8_t)(u16Sbr & UART_BDL_SBR_MASK);


    pUART->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK );

}


使用特权

评论回复
5
hanzhen654|  楼主 | 2020-2-24 13:39 | 只看该作者
使能UART中断
void UART_EnableInterrupt(UART_Type *pUART, UART_InterruptType InterruptType)
{

    /* 通道合法性检查 */
    ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));

    if (InterruptType == UART_TxBuffEmptyInt)      //发送中断使能
    {
        pUART->C2 |= UART_C2_TIE_MASK;
    }
    else if (InterruptType == UART_TxCompleteInt)  //传输完成中断使能
    {
        pUART->C2 |= UART_C2_TCIE_MASK;
    }
    else if (InterruptType == UART_RxBuffFullInt)  //接收器中断使能
    {
        pUART->C2 |= UART_C2_RIE_MASK;
    }
    else if (InterruptType == UART_IdleLineInt)    //空闲线中断使能
    {
        pUART->C2 |= UART_C2_ILIE_MASK;
    }
    else if (InterruptType == UART_RxOverrunInt)   //过载中断使能
    {
        pUART->C3 |= UART_C3_ORIE_MASK;
    }
    else if (InterruptType == UART_NoiseErrorInt)  //噪声错误中断使能
    {
        pUART->C3 |= UART_C3_NEIE_MASK;
    }
    else if (InterruptType == UART_FramingErrorInt) //帧错误中断使能
    {
        pUART->C3 |= UART_C3_FEIE_MASK;
    }
    else if (InterruptType == UART_ParityErrorInt)  //奇偶校验中断使能
    {
        pUART->C3 |= UART_C3_FEIE_MASK;
    }
    else
    {
        //其他暂不支持类型的中断
    }  
}


使用特权

评论回复
6
hanzhen654|  楼主 | 2020-2-24 13:40 | 只看该作者
禁用UART中断
void UART_DisableInterrupt(UART_Type *pUART, UART_InterruptType InterruptType)
{
     /* 通道合法性检查 */
    ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));


    if (InterruptType == UART_TxBuffEmptyInt)       //发送中断禁用
    {
        pUART->C2 &= (~UART_C2_TIE_MASK);
    }
    else if (InterruptType == UART_TxCompleteInt)  //传输完成中断禁用
    {
        pUART->C2 &= (~UART_C2_TCIE_MASK);
    }
    else if (InterruptType == UART_RxBuffFullInt)  //接收器中断禁用
    {
        pUART->C2 &= (~UART_C2_RIE_MASK);
    }
    else if (InterruptType == UART_IdleLineInt)    //空闲线中断禁用
    {
        pUART->C2 &= (~UART_C2_ILIE_MASK);
    }
    else if (InterruptType == UART_RxOverrunInt)    //过载中断禁用
    {
        pUART->C3 &= (~UART_C3_ORIE_MASK);
    }
    else if (InterruptType == UART_NoiseErrorInt)   //噪声错误中断禁用
    {
        pUART->C3 &= (~UART_C3_NEIE_MASK);
    }
    else if (InterruptType == UART_FramingErrorInt)  //帧错误中断禁用
    {
        pUART->C3 &= (~UART_C3_FEIE_MASK);
    }
    else if (InterruptType == UART_ParityErrorInt)   //奇偶校验中断禁用
    {
        pUART->C3 &= (~UART_C3_FEIE_MASK);
    }
    else
    {
       //其他暂不支持类型的中断
    }  
}


使用特权

评论回复
7
hanzhen654|  楼主 | 2020-2-24 13:40 | 只看该作者
从两个状态寄存器获取UART状态
uint16_t UART_GetFlags(UART_Type *pUART)
{
    uint16_t u16StatusFlags = 0;//先清空标志位

    u16StatusFlags = pUART->S2; //将状态寄存器 2 的值赋给标志参数
    u16StatusFlags = (u16StatusFlags<<8)| pUART->S1; //两个状态寄存器拼接赋给标志参数

    return u16StatusFlags;//返回标志参数的值
}


使用特权

评论回复
8
hanzhen654|  楼主 | 2020-2-24 13:41 | 只看该作者
检查特定的位是否置位
uint8_t UART_CheckFlag(UART_Type *pUART, UART_FlagType FlagType)
{
    uint16_t u16StatusFlags = 0;

    u16StatusFlags = UART_GetFlags(pUART);

    return (u16StatusFlags & (1<<FlagType));
}


使用特权

评论回复
9
hanzhen654|  楼主 | 2020-2-24 13:42 | 只看该作者
用查询模式发送字符串
void UART_SendWait(UART_Type *pUART, uint8_t *pSendBuff, uint32_t u32Length)
{
    uint8_t u8TxChar;
    uint32_t  i;
   
    for (i = 0; i < u32Length; i++)
    {
        u8TxChar = pSendBuff[i];
        while (!UART_IsTxBuffEmpty(pUART))
        {
            #if defined(ENABLE_WDOG)
                WDOG_Feed();
            #endif        
        }
        UART_WriteDataReg(pUART, u8TxChar);        
    }
}


使用特权

评论回复
10
hanzhen654|  楼主 | 2020-2-24 13:42 | 只看该作者
用查询模式接收字符串
void UART_ReceiveWait(UART_Type *pUART, uint8_t *pReceiveBuff, uint32_t u32Length)
{
    uint8_t u8RxChar;
    uint32_t i;
   
    for (i = 0; i < u32Length; i++)
    {
        while (!UART_IsRxBuffFull(pUART))
        {
            #if defined(ENABLE_WDOG)
                WDOG_Feed();
            #endif      
        }   
        u8RxChar = UART_ReadDataReg(pUART);
        pReceiveBuff[i] = u8RxChar;
    }
}


使用特权

评论回复
11
hanzhen654|  楼主 | 2020-2-24 13:43 | 只看该作者
等待发送完成
void UART_WaitTxComplete(UART_Type *pUART)
{
    while (!UART_IsTxComplete(pUART));//一直等待直到发送完成
}


使用特权

评论回复
12
hanzhen654|  楼主 | 2020-2-24 13:43 | 只看该作者
设置UART模块的中断回调函数
void UART_SetCallback(UART_CallbackType pfnCallback)
{
    UART_Callback = pfnCallback;
}


使用特权

评论回复
13
hanzhen654|  楼主 | 2020-2-24 13:44 | 只看该作者
uart0 中断服务函数
void UART0_Isr(void)
{
    UART_Callback(UART0);
}


使用特权

评论回复
14
hanzhen654|  楼主 | 2020-2-24 13:45 | 只看该作者
uart1 中断服务函数
void UART1_Isr(void)
{
    UART_Callback(UART1);
}

使用特权

评论回复
15
hanzhen654|  楼主 | 2020-2-24 13:45 | 只看该作者
uart2 中断服务函数
void UART2_Isr(void)
{
    UART_Callback(UART2);
}

使用特权

评论回复
16
hanzhen654|  楼主 | 2020-2-24 13:46 | 只看该作者
UART 设置类型
typedef struct
{
    uint32_t bEnable      : 1;                /*!< 1: 使能, 0: 禁用 */
    uint32_t resvd        : 31;               /*!< 1: 保留位域 */
} UART_SettingType;

使用特权

评论回复
17
hanzhen654|  楼主 | 2020-2-24 13:46 | 只看该作者
UART 配置结构体
typedef struct
{
    UART_SettingType    sSettings;  /*!< UART 设置 */
    uint32_t                                    u32SysClkHz;        /*!< 系统时钟 */
    uint32_t                                    u32Baudrate;        /*!< UART 波特率 */
} UART_ConfigType;

使用特权

评论回复
18
hanzhen654|  楼主 | 2020-2-24 13:47 | 只看该作者
UART 波特率配置结构体
typedef struct
{
    uint32_t    u32SysClkHz;        /*!< 系统时钟 */
    uint32_t    u32Baudrate;        /*!< UART 波特率 */
} UART_ConfigBaudrateType;

使用特权

评论回复
19
hanzhen654|  楼主 | 2020-2-24 13:47 | 只看该作者
uart配置模式列表
typedef enum
{
    UART_Mode8Bit,                  /*!< 8位模式 */
    UART_Mode9Bit,                  /*!< 9位模式 */
    UART_ModeEnableLoopback,        /*!< 使能环回模式 */
    UART_ModeDisableLoopback,       /*!< 禁用环回模式*/
    UART_ModeEnableSingleWire,      /*!< 使能UART单线模式 */
    UART_ModeDisableSingleWire,     /*!< 禁用UART单线模式 */
} UART_ModeType;

使用特权

评论回复
20
hanzhen654|  楼主 | 2020-2-24 13:48 | 只看该作者
uart中断类型
typedef enum
{
    UART_TxBuffEmptyInt,            /*!< 发送中断 */
    UART_TxCompleteInt,             /*!< 传输完成中断 */
    UART_RxBuffFullInt,             /*!< 接收器中断 */

    UART_IdleLineInt,               /*!< 空闲线中断 */

    UART_RxOverrunInt,              /*!< 过载中断 */
    UART_NoiseErrorInt,             /*!< 噪声错误中断 */
    UART_FramingErrorInt,           /*!< /帧错误中断 */
    UART_ParityErrorInt,            /*!< 奇偶校验中断 */
} UART_InterruptType;

使用特权

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

本版积分规则

73

主题

1766

帖子

2

粉丝