[demo程序] NV32 F100 串口驱动

[复制链接]
 楼主| hanzhen654 发表于 2020-2-24 13:37 | 显示全部楼层 |阅读模式
初始化UART,关中断,无硬件流控制
  1. void UART_Init(UART_Type *pUART, UART_ConfigType *pConfig)
  2. {
  3.     uint16_t u16Sbr;
  4.     uint8_t u8Temp;
  5.     uint32_t u32SysClk = pConfig->u32SysClkHz;//定义系统时钟
  6.     uint32_t u32Baud = pConfig->u32Baudrate;//定义波特率

  7.     /* 合法性检查 */
  8.     ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));
  9.   
  10.         /* 设置时钟选通控制用来选择相应的 UART 口 */
  11.   if (pUART == UART0)
  12.         {
  13.                 SIM->SCGC |= SIM_SCGC_UART0_MASK;//使能相应功能位, 选通对应 UART
  14.         }
  15. #if defined(CPU_NV32)  
  16.         else if (pUART == UART1)
  17.         {
  18.         SIM->SCGC |= SIM_SCGC_UART1_MASK;
  19.         }
  20.     else
  21.         {
  22.         SIM->SCGC |= SIM_SCGC_UART2_MASK;
  23.         }
  24. #endif   
  25.     /*确保在我们进行配置时, 禁止发送和接收*/
  26.     pUART->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK );
  27.    
  28.     /* 配置 UART 为 8 位模式, 无奇偶校验位 */
  29.     pUART->C1 = 0;
  30.    
  31.     /* 波特率计算 */
  32.     u16Sbr = (((u32SysClk)>>4) + (u32Baud>>1))/u32Baud;
  33.    
  34.     /*把当前数据存放在串口波特率寄存器中, 且SBR位清0,即波特率发生器被禁止*/
  35.     u8Temp = pUART->BDH & ~(UART_BDH_SBR_MASK);
  36.    
  37.     pUART->BDH = u8Temp |  UART_BDH_SBR(u16Sbr >> 8);
  38.     pUART->BDL = (uint8_t)(u16Sbr & UART_BDL_SBR_MASK);

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


 楼主| hanzhen654 发表于 2020-2-24 13:38 | 显示全部楼层
接收一个字符
  1. uint8_t UART_GetChar(UART_Type *pUART)
  2. {

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

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


 楼主| hanzhen654 发表于 2020-2-24 13:38 | 显示全部楼层
发送一个字符
  1. void UART_PutChar(UART_Type *pUART, uint8_t u8Char)
  2. {   
  3.     /* 一直等待, 直到缓冲区为空 */
  4.     while (!(pUART->S1 & UART_S1_TDRE_MASK));
  5.    
  6.     /* 发送字符到数据寄存器 */
  7.     pUART->D = (uint8_t)u8Char;
  8. }


 楼主| hanzhen654 发表于 2020-2-24 13:39 | 显示全部楼层
波特率设置
  1. void UART_SetBaudrate(UART_Type *pUART, UART_ConfigBaudrateType *pConfig)
  2. {
  3.     uint8_t u8Temp;
  4.     uint16_t u16Sbr;
  5.     uint32_t u32SysClk    = pConfig->u32SysClkHz;
  6.     uint32_t u32baud       = pConfig->u32Baudrate;

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

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

  11.   
  12.     u8Temp = pUART->BDH & ~(UART_BDH_SBR_MASK);
  13.    
  14.     pUART->BDH = u8Temp |  UART_BDH_SBR(u16Sbr >> 8);
  15.     pUART->BDL = (uint8_t)(u16Sbr & UART_BDL_SBR_MASK);


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

  17. }


 楼主| hanzhen654 发表于 2020-2-24 13:39 | 显示全部楼层
使能UART中断
  1. void UART_EnableInterrupt(UART_Type *pUART, UART_InterruptType InterruptType)
  2. {

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

  5.     if (InterruptType == UART_TxBuffEmptyInt)      //发送中断使能
  6.     {
  7.         pUART->C2 |= UART_C2_TIE_MASK;
  8.     }
  9.     else if (InterruptType == UART_TxCompleteInt)  //传输完成中断使能
  10.     {
  11.         pUART->C2 |= UART_C2_TCIE_MASK;
  12.     }
  13.     else if (InterruptType == UART_RxBuffFullInt)  //接收器中断使能
  14.     {
  15.         pUART->C2 |= UART_C2_RIE_MASK;
  16.     }
  17.     else if (InterruptType == UART_IdleLineInt)    //空闲线中断使能
  18.     {
  19.         pUART->C2 |= UART_C2_ILIE_MASK;
  20.     }
  21.     else if (InterruptType == UART_RxOverrunInt)   //过载中断使能
  22.     {
  23.         pUART->C3 |= UART_C3_ORIE_MASK;
  24.     }
  25.     else if (InterruptType == UART_NoiseErrorInt)  //噪声错误中断使能
  26.     {
  27.         pUART->C3 |= UART_C3_NEIE_MASK;
  28.     }
  29.     else if (InterruptType == UART_FramingErrorInt) //帧错误中断使能
  30.     {
  31.         pUART->C3 |= UART_C3_FEIE_MASK;
  32.     }
  33.     else if (InterruptType == UART_ParityErrorInt)  //奇偶校验中断使能
  34.     {
  35.         pUART->C3 |= UART_C3_FEIE_MASK;
  36.     }
  37.     else
  38.     {
  39.         //其他暂不支持类型的中断
  40.     }  
  41. }


 楼主| hanzhen654 发表于 2020-2-24 13:40 | 显示全部楼层
禁用UART中断
  1. void UART_DisableInterrupt(UART_Type *pUART, UART_InterruptType InterruptType)
  2. {
  3.      /* 通道合法性检查 */
  4.     ASSERT((pUART == UART0) || (pUART == UART1) || (pUART == UART2));


  5.     if (InterruptType == UART_TxBuffEmptyInt)       //发送中断禁用
  6.     {
  7.         pUART->C2 &= (~UART_C2_TIE_MASK);
  8.     }
  9.     else if (InterruptType == UART_TxCompleteInt)  //传输完成中断禁用
  10.     {
  11.         pUART->C2 &= (~UART_C2_TCIE_MASK);
  12.     }
  13.     else if (InterruptType == UART_RxBuffFullInt)  //接收器中断禁用
  14.     {
  15.         pUART->C2 &= (~UART_C2_RIE_MASK);
  16.     }
  17.     else if (InterruptType == UART_IdleLineInt)    //空闲线中断禁用
  18.     {
  19.         pUART->C2 &= (~UART_C2_ILIE_MASK);
  20.     }
  21.     else if (InterruptType == UART_RxOverrunInt)    //过载中断禁用
  22.     {
  23.         pUART->C3 &= (~UART_C3_ORIE_MASK);
  24.     }
  25.     else if (InterruptType == UART_NoiseErrorInt)   //噪声错误中断禁用
  26.     {
  27.         pUART->C3 &= (~UART_C3_NEIE_MASK);
  28.     }
  29.     else if (InterruptType == UART_FramingErrorInt)  //帧错误中断禁用
  30.     {
  31.         pUART->C3 &= (~UART_C3_FEIE_MASK);
  32.     }
  33.     else if (InterruptType == UART_ParityErrorInt)   //奇偶校验中断禁用
  34.     {
  35.         pUART->C3 &= (~UART_C3_FEIE_MASK);
  36.     }
  37.     else
  38.     {
  39.        //其他暂不支持类型的中断
  40.     }  
  41. }


 楼主| hanzhen654 发表于 2020-2-24 13:40 | 显示全部楼层
从两个状态寄存器获取UART状态
  1. uint16_t UART_GetFlags(UART_Type *pUART)
  2. {
  3.     uint16_t u16StatusFlags = 0;//先清空标志位

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

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


 楼主| hanzhen654 发表于 2020-2-24 13:41 | 显示全部楼层
检查特定的位是否置位
  1. uint8_t UART_CheckFlag(UART_Type *pUART, UART_FlagType FlagType)
  2. {
  3.     uint16_t u16StatusFlags = 0;

  4.     u16StatusFlags = UART_GetFlags(pUART);

  5.     return (u16StatusFlags & (1<<FlagType));
  6. }


 楼主| hanzhen654 发表于 2020-2-24 13:42 | 显示全部楼层
用查询模式发送字符串
  1. void UART_SendWait(UART_Type *pUART, uint8_t *pSendBuff, uint32_t u32Length)
  2. {
  3.     uint8_t u8TxChar;
  4.     uint32_t  i;
  5.    
  6.     for (i = 0; i < u32Length; i++)
  7.     {
  8.         u8TxChar = pSendBuff[i];
  9.         while (!UART_IsTxBuffEmpty(pUART))
  10.         {
  11.             #if defined(ENABLE_WDOG)
  12.                 WDOG_Feed();
  13.             #endif        
  14.         }
  15.         UART_WriteDataReg(pUART, u8TxChar);        
  16.     }
  17. }


 楼主| hanzhen654 发表于 2020-2-24 13:42 | 显示全部楼层
用查询模式接收字符串
  1. void UART_ReceiveWait(UART_Type *pUART, uint8_t *pReceiveBuff, uint32_t u32Length)
  2. {
  3.     uint8_t u8RxChar;
  4.     uint32_t i;
  5.    
  6.     for (i = 0; i < u32Length; i++)
  7.     {
  8.         while (!UART_IsRxBuffFull(pUART))
  9.         {
  10.             #if defined(ENABLE_WDOG)
  11.                 WDOG_Feed();
  12.             #endif      
  13.         }   
  14.         u8RxChar = UART_ReadDataReg(pUART);
  15.         pReceiveBuff[i] = u8RxChar;
  16.     }
  17. }


 楼主| hanzhen654 发表于 2020-2-24 13:43 | 显示全部楼层
等待发送完成
  1. void UART_WaitTxComplete(UART_Type *pUART)
  2. {
  3.     while (!UART_IsTxComplete(pUART));//一直等待直到发送完成
  4. }


 楼主| hanzhen654 发表于 2020-2-24 13:43 | 显示全部楼层
设置UART模块的中断回调函数
  1. void UART_SetCallback(UART_CallbackType pfnCallback)
  2. {
  3.     UART_Callback = pfnCallback;
  4. }


 楼主| hanzhen654 发表于 2020-2-24 13:44 | 显示全部楼层
uart0 中断服务函数
  1. void UART0_Isr(void)
  2. {
  3.     UART_Callback(UART0);
  4. }


 楼主| hanzhen654 发表于 2020-2-24 13:45 | 显示全部楼层
uart1 中断服务函数
void UART1_Isr(void)
{
    UART_Callback(UART1);
}
 楼主| hanzhen654 发表于 2020-2-24 13:45 | 显示全部楼层
uart2 中断服务函数
void UART2_Isr(void)
{
    UART_Callback(UART2);
}
 楼主| hanzhen654 发表于 2020-2-24 13:46 | 显示全部楼层
UART 设置类型
typedef struct
{
    uint32_t bEnable      : 1;                /*!< 1: 使能, 0: 禁用 */
    uint32_t resvd        : 31;               /*!< 1: 保留位域 */
} UART_SettingType;
 楼主| hanzhen654 发表于 2020-2-24 13:46 | 显示全部楼层
UART 配置结构体
typedef struct
{
    UART_SettingType    sSettings;  /*!< UART 设置 */
    uint32_t                                    u32SysClkHz;        /*!< 系统时钟 */
    uint32_t                                    u32Baudrate;        /*!< UART 波特率 */
} UART_ConfigType;
 楼主| hanzhen654 发表于 2020-2-24 13:47 | 显示全部楼层
UART 波特率配置结构体
typedef struct
{
    uint32_t    u32SysClkHz;        /*!< 系统时钟 */
    uint32_t    u32Baudrate;        /*!< UART 波特率 */
} UART_ConfigBaudrateType;
 楼主| 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;
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部