自己动手写的UART2驱动

    昨天发现新唐的BSP中没有提供UART2的定义 即其操作,只定义了UART0和UART1及其驱动操作。但是涉及的板子中又弄了3路串口,当然UART2在其中。
      第一反应就是查阅新唐的资料,NUC1**的前期设计文档中,有些说可以支持UART2,但是又有很多定义的地方都Reserve了,就是本该UART2相关的位却为保留位。心里没谱。
     没谱也没办法,咬咬牙开始吧。
     查看BSP有关定义,在DrvUART.h和 DrvUART.c中只 #define了UART0 和UART1,以及DrvGPIO.c中的DRVGPIO_FUNC中也制定一乐FUNC_UART0, 和FUNC_UART1,根本不见FUNC_UART2的踪影。可是在新唐的网站上关于NUC100RE3AN又是有3路串口的(这一点是坚定我信心的!!)
     因此萌生自己写关于UART2的驱动的决心。项目只要求往外发,所以暂时只实现这部分功能,对于接收先不予以处理(接收要麻烦些)。
     1、在串口初始化中先要DrvGPIO_InitFunction()对象应的管脚使能,FUNC_UART2对应的管脚是和FUNC_CAN1管脚复用的(都是GPD14、15)。所以
       #define FUNC_UART2 FUNC_CAN1
      这样直接DrvGPIO_InitFunction(FUNC_UART2),就将相应UART2的PIN脚使能为RX2、TX2了。
      2、然后要对UART进行配置,UART0和1是调用DrvUART_Open(UART_PORT1,(STR_UART_T)¶m);
     开始编写自己的UART2驱动文件 my_uart2.h 和my_uart2.c。
    (1) 关键之处在于UART2的基地址,查看Datasheet, 
         
    #define MY_APB2_BASE           ((     uint32_t)0x40100000)
     #define MY_UART2_BASE                (MY_APB2_BASE + 0x54000)

      (2)将原先关于UART2的结构体中的保留位改写为UART2相关位。

typedef struct
{
    __IO uint32_t  WDG_EN:1;
    __IO uint32_t  RTC_EN:1;
    __IO uint32_t  TMR0_EN:1;
    __IO uint32_t  TMR1_EN:1;
    __IO uint32_t  TMR2_EN:1;
    __IO uint32_t  TMR3_EN:1;
    __I  uint32_t  RESERVE0:2;
    __IO uint32_t  I2C0_EN:1;
    __IO uint32_t  I2C1_EN:1;
    __I  uint32_t  RESERVE1:2;
    __IO uint32_t  SPI0_EN:1;
    __IO uint32_t  SPI1_EN:1;
    __IO uint32_t  SPI2_EN:1;
    __IO uint32_t  SPI3_EN:1;
    __IO uint32_t  UART0_EN:1;
    __IO uint32_t  UART1_EN:1;
//   __I  uint32_t  RESERVE2:2;
     __IO uint32_t  UART2_EN:1;
    __I     uint32_t  RESERVE2:1;
    __IO uint32_t  PWM01_EN:1;
    __IO uint32_t  PWM23_EN:1;
    __I  uint32_t  RESERVE3:2;
    __IO uint32_t  CAN0_EN:1;
    __IO uint32_t  CAN1_EN:1;
    __I  uint32_t  RESERVE4:1;
    __IO uint32_t  USBD_EN:1;
    __IO uint32_t  ADC_EN:1;
    __I  uint32_t  RESERVE5:1;
    __IO uint32_t  ACMP_EN:1;
    __IO uint32_t  PS2_EN:1;
} MY_SYSCLK_APBCLK_T;
typedef struct
{
    SYSCLK_PWRCON_T    PWRCON;
    SYSCLK_AHBCLK_T    AHBCLK;
    MY_SYSCLK_APBCLK_T    APBCLK;
    uint32_t           RESERVED0;
    SYSCLK_CLKSEL0_T   CLKSEL0;
    SYSCLK_CLKSEL1_T   CLKSEL1;
    SYSCLK_CLKDIV_T    CLKDIV;
    uint32_t           RESERVED1;
    SYSCLK_PLLCON_T    PLLCON;
} MY_SYSCLK_T;

#define MY_SYSCLK              ((MY_SYSCLK_T *) SYSCLK_BASE)

    (3)实现打开以及 发送字符串函数

int32_t My_DrvUART_Open(UART_PORT port, STR_UART_T *sParam);
void SendChar_To_UART2(int ch);
void Send_String_To_UART2(char * str);

 

以下是直接可用的代码:my_uart2.h

 

my_uart.c

 

这是运行结果:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值