昨天发现新唐的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
这是运行结果: