打印
[活动专区]

【AT-START-F423测评】3.串口的使用

[复制链接]
566|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuyy1989|  楼主 | 2023-10-24 20:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# @21小跑堂  

串口在开发调试和设备通讯中会经常用到,开发板上引出了USART1连接到了ATLINK上,PA9可以通过跳线帽选择是作为串口的TX还是usb的VBUS,默认是作为串口TX
在AT32 Work Bench中开启USART1,在这里可以直接配置串口的各项参数

开启串口中断

需要注意的是生成的代码需要自己写上开启中断的代码


简单写个收发测试
#define UART_BUFFER_LEN 20
uint8_t uart_buffer[UART_BUFFER_LEN] = {0};
uint8_t uart_rxindex = 0;
uint8_t uart_rxlen = 0;
uint8_t uart_txindex = 0;
uint8_t uart_txlen = 0;

void starttx()
{
    uart_txlen += uart_rxlen;
    uart_rxlen = 0;
    usart_interrupt_enable(USART1, USART_TDBE_INT, TRUE);
}

void usart1_irq()
{
    if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
    {
        usart_flag_clear(USART1, USART_RDBF_FLAG);
        uart_buffer[uart_rxindex++] = usart_data_receive(USART1);
        if(uart_rxindex == UART_BUFFER_LEN)
            uart_rxindex = 0;
        uart_rxlen++;
    }
    if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET || uart_rxlen == UART_BUFFER_LEN/2)
    {
        usart_flag_clear(USART1, USART_IDLEF_FLAG);
        starttx();
    }
    if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
    {
        usart_flag_clear(USART1, USART_TDBE_FLAG);
        if(uart_txlen > 0)
        {
            usart_data_transmit(USART1, uart_buffer[uart_txindex++]);
            if(uart_txindex == UART_BUFFER_LEN)
                uart_txindex = 0;
            uart_txlen--;
        }
        else
        {
            usart_interrupt_enable(USART1, USART_TDBE_INT, FALSE);
        }
    }
}
void USART1_IRQHandler(void)
{
  /* add user code begin USART1_IRQ 0 */
    extern void usart1_irq();
    usart1_irq();

  /* add user code end USART1_IRQ 0 */
  /* add user code begin USART1_IRQ 1 */

  /* add user code end USART1_IRQ 1 */
}
运行效果

接下来重定向printf输出到串口,实现之后输出调试信息会很方便,在工程设置中勾选Use MicroLib

在代码中添加
int fputc(int ch, FILE *f)
{
    while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
    usart_data_transmit(USART1,ch&0xFF);
    return ch;
}
简单测试,按下按键打印
uint8_t num = 0;
void userkey_int()
{
    if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
    {
        printf("printf test %d",num);
        num += 1;
    }
}
运行效果

在固件包提供的at32f423_board中已经实现了printf重定向,如果使用这个文件就不用自己再实现了


使用特权

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

本版积分规则

85

主题

450

帖子

4

粉丝