查看: 1358|回复: 1

[SAMG53] [体验篇六] ATSAMG53 Xplained Pro UART串口功能

[复制链接]

80

主题

0

好友

4785

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 512 天

    [LV.9]以坛为家II

    发表于 2014-6-9 11:28:19 |显示全部楼层
    SAMG53-XPRO 由于初接触学习,一步一步记录下自己的过程,以方便与大家一起分享,希望大家能多拍砖,共同进展。
    [体验篇一]ATSAMG53 Xplained Pro 开箱验货
    http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=31347&fromuid=23447
    [体验篇二] ATSAMG53 Xplained Pro 获取资料
    http://blog.sina.com.cn/s/blog_7e7fa4c80101k5v9.html
    [体验篇三] ATSAMG53 Xplained Pro LED控制
    http://blog.sina.com.cn/s/blog_7e7fa4c80101k6kw.html
    [体验篇四] ATSAMG53 Xplained Pro 分析LED控制
    http://blog.sina.com.cn/s/blog_7e7fa4c80101k9ef.html
    [体验篇五] ATSAMG53 Xplained Pro LED为我用
    http://blog.sina.com.cn/s/blog_7e7fa4c80101kbu1.html
    这次很多调试情况下都用的到功能串口功能 UART 或 USART
    (1) UART 与USART的含意区别
    UART
    The Universal Asynchronous Receiver Transmitter features a two-pin UART that can be used for communication and trace purposes and offers an ideal medium for in-situ programming solutions.
    通用异步接收发送器有一个two-pin UART可以用于沟通和跟踪和现场编程解决方案提供了一个理想的媒介。
    USART
    The Universal Synchronous Asynchronous Receiver Transceiver (USART) provides one full duplex universal synchronous asynchronous serial link. Data frame format is widely programmable (data length, parity, number of stop bits) to support a maximum of standards. The receiver implements parity error, framing error and overrun error detection.
    The receiver time-out enables handling variable-length frames and the transmitter timeguard facilitates communications with slow remote devices. Multidrop communications are also supported through address bit handling in reception and transmission.
    通用同步异步接收机收发器(,)提供了一个全双工通用同步异步串行连接。数据帧格式广泛可编程(数据长度,奇偶校验,停止位的数量)来支持最高的标准。接收机实现奇偶校验错误,框架误差和溢出错误检测。
    接收方暂停使处理变长帧和发射机时钟分频促进与缓慢的远程设备通信。多分通信也支持通过在接收和传输地址位处理。
    由上可以看出USART是在UART基础上增加同步功能,即USART是UART的增强型,但同时支持更高级的应用如RS485、SPI buses、 infrared transceivers(红外传输)等功能。而UART 通过电平转信,实现RS232通信,也就是我们通常调试相用的与电脑通信。
    (2)UART 与USART 的方框图



    而SAMG53 有两个UART 一个USART,如下图所示

    引脚资源


    这里不明白? USART  的RTS  为PA15  而USART 的SCK 为PA15 难道是共用引脚吗?不太明白,留着以后解决。
    问题解决在,board_init.c 中的初始化代码,找到答案,是复用引脚,RTS 为PA15的复用第一功能,SCK为PA15复用第二功能
    #ifdef CONF_BOARD_USART_SCK
    ioport_set_pin_peripheral_mode(EXT3_PIN_10,
    IOPORT_MODE_MUX_B);
    #endif
    (3) UART 实验
    先导入官网的例程:
    文件->新建->Example project

    分析代码:
    UART的初始化代码:
    (1)引脚的初始化在board_init();
    #if defined (CONF_BOARD_UART_CONSOLE)
    ioport_set_port_peripheral_mode(PINS_UART0_PORT, PINS_UART0,
    PINS_UART0_MASK);
    #endif
    通过conf_board.h中的宏定义使能,注意与上一个LED的程序比较,就能发现
    #define CONF_BOARD_UART_CONSOLE
    (2)波特率的设置,在configure_console(); 实现
    static void configure_console(void)
    {
    const usart_serial_options_t uart_serial_options = {
    .baudrate = CONF_UART_BAUDRATE,
    .paritytype = CONF_UART_PARITY
    };
    sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
    stdio_serial_init(CONF_UART, &uart_serial_options);
    }
    通过以上两个步骤,芯片的UART 功能就可以正常使用,所以案例中
    puts(STRING_HEADER);
    如果一般正常的UART的正常的使用,以上设置就可以了。
    还可以通过CONF_UART 调用 ,进行操作
    如以下等stdio.h 标准输出输入库函数
    puts(str)str是一个字符串,定义成char数组,表示输出一个字符串,puts()函数的作用与语句printf("%s\n",s);的作用形同
    gets(str),str跟上面一样,表示输入一个字符串 ,gets()可以获取空格,scanf不行
    printf("输出格式",参数)
    scanf("输入格式",变量名)
    (3) 重定义的关键代码
    stdio_serial_init(CONF_UART, &uart_serial_options); 其中关键代码如下
    stdio_base = (void *)usart;
    ptr_put = (int (*)(void volatile*,char))&usart_serial_putchar;
    ptr_get = (void (*)(void volatile*,char*))&usart_serial_getchar;
    关键的代码实现是在 read.c 与write.c中
    (4)Test the uart sleepwalking in active mode
    测试在UART的 sleepwalk模式下载的active mode,如果初接触Atmel 的芯片,可能不明白什么意思,开始时我也是这样,但做实验,可以明白,我把原来的代码,修改如下:
    static void uart_sleepwalking_test_active(void)
    {
    puts("Test in active mode, press 's' to continue.\r");
    delay_ms(50);
    uart_enable_interrupt(CONSOLE_UART, UART_IER_CMP);
    NVIC_EnableIRQ(CONSOLE_UART_IRQn);
    uart_set_sleepwalking(CONSOLE_UART, 's', true, true, 's');
    pmc_enable_sleepwalking(CONSOLE_UART_ID);
    while (!cmp_flag) {
    ioport_toggle_pin_level(LED_0_PIN);
    delay_ms(500);
    }
    puts("'s' character is received.\r\n\r");
    puts("Test in active mode, press from 'a' to 's' to continue.\r");
    cmp_flag = 0;
    uart_disable_interrupt(CONSOLE_UART, UART_IDR_CMP);
    uart_set_sleepwalking(CONSOLE_UART, 'a', true, true, 's');
    uart_enable_interrupt(CONSOLE_UART, UART_IDR_CMP);
    pmc_enable_sleepwalking(CONSOLE_UART_ID);
    while (!cmp_flag) {
    ioport_toggle_pin_level(LED_0_PIN);
    delay_ms(500);
    }
    puts("'s' character is received.\r\n\r");
    uart_disable_interrupt(CONSOLE_UART, UART_IDR_CMP);
    }
    通过观察,可知,在UART的 sleepwalk active mode 模式下,UART通信接口禁止,至接收到符合条件的才会唤醒UART通信,没有唤醒之前,芯片还能继续其他工作(LED灯在闪),当接收字符匹配时响应中断,中断函数如下:
    void console_uart_irq_handler(void)
    {
    //uint8_t data;
    if (uart_get_status(CONSOLE_UART) & UART_SR_CMP) {
    cmp_flag = 1;
    //uart_disable_interrupt(CONSOLE_UART, UART_IDR_CMP);
    CONSOLE_UART->UART_CR = UART_CR_RSTSTA;// clear UART_SR_CMP 要清楚标志位
    }
    }
    原来的官方的代码,有一些问题(我认为),直接关闭中断源uart_disable_interrupt(CONSOLE_UART, UART_IDR_CMP);
    确实能实现效果,但当你再次开中断源时,马上调转到中断程序中,应该清除标志位,再关中断源。
    但我找遍了官网,即没有清除标志位,的操作函数,最后自已在datasheet 找到
    UART Control Register  UART_CR

    有这样的解析,自己用寄存器操作一下,
    (5)关于中断函数
    void console_uart_irq_handler(void) 但其实际上是UART0_Handler 这个函数名才会响应UART0的中断
    其是通过宏定义的,在conf_example.h中
    #define console_uart_irq_handler UART0_Handler
    通过startup_samg53.c 定义 中断向量表,如下所示
    __attribute__ ((section(".vectors")))
    IntFunc exception_table[] = {
    (IntFunc) (&_estack),
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    0, 0, 0, 0,
    SVC_Handler,
    DebugMon_Handler,
    0,
    PendSV_Handler,
    SysTick_Handler,
    SUPC_Handler,
    RSTC_Handler,
    RTC_Handler,
    RTT_Handler,
    WDT_Handler,
    PMC_Handler,
    EFC_Handler,
    Dummy_Handler,
    UART0_Handler,
    UART1_Handler,
    Dummy_Handler,
    PIOA_Handler,
    PIOB_Handler,
    PDMIC0_Handler,
    USART_Handler,
    MEM2MEM_Handler,
    I2SC0_Handler,
    I2SC1_Handler,
    PDMIC1_Handler,
    TWI0_Handler,
    TWI1_Handler,
    SPI_Handler,
    TWI2_Handler,
    TC0_Handler,
    TC1_Handler,
    TC2_Handler,
    TC3_Handler,
    TC4_Handler,
    TC5_Handler,
    ADC_Handler,
    ARM_Handler,
    WKUP0_Handler,
    WKUP1_Handler,
    WKUP2_Handler,
    WKUP3_Handler,
    WKUP4_Handler,
    WKUP5_Handler,
    WKUP6_Handler,
    WKUP7_Handler,
    WKUP8_Handler,
    WKUP9_Handler,
    WKUP10_Handler,
    WKUP11_Handler,
    WKUP12_Handler,
    WKUP13_Handler,
    WKUP14_Handler,
    WKUP15_Handler
    };
    (7)uart sleepwalking in wait mode
    在其模式下,芯片会wait mode 即进入低功耗,系统时钟,外设置时钟,存储等都会禁止

    还有两种模式,


    在datasheet 的Power Considerations 章节,自己体会吧!
    (8) 关于移植问题
    移植注意复制以下文件


    并在项目属性中添加 以上文件夹的位置,以便头文件的搜索

    ==============================================================================================
    可能转载的原因,有些图片打不开,如果有需要请移步以下地址,不想重新上传图片,时间有限不便之处请原谅!同时请大家多拍砖,可以到我博客去观看!
    http://blog.sina.com.cn/s/blog_7e7fa4c80101kj6a.html

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-3 14:52 , Processed in 0.132803 second(s), 8 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部