打印
[活动]

【APM32F411V Tiny Board测评】3.串口测试

[复制链接]
219|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开发板引出了2路串口,默认接的是串口1

查看使用的引脚

配置串口,并开启中断
void uart_init()
{
    USART_Config_T usartConfigStruct;
    GPIO_Config_T GPIO_configStruct;
    GPIO_ConfigStructInit(&GPIO_configStruct);
   
    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
   
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_USART1);
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_USART1);
   
    GPIO_configStruct.mode = GPIO_MODE_AF;
    GPIO_configStruct.pin = GPIO_PIN_9 | GPIO_PIN_10;;
    GPIO_configStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &GPIO_configStruct);

    usartConfigStruct.baudRate = 115200;
    usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    usartConfigStruct.mode = USART_MODE_TX_RX;
    usartConfigStruct.parity = USART_PARITY_NONE;
    usartConfigStruct.stopBits = USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
   
    USART_Config(USART1, &usartConfigStruct);
    USART_Enable(USART1);
   
    USART_EnableInterrupt(USART1, USART_INT_RXBNE);
    USART_EnableInterrupt(USART1, USART_INT_IDLE);
    USART_ClearStatusFlag(USART1, USART_FLAG_RXBNE);
    NVIC_EnableIRQRequest(USART1_IRQn,0,0);
}
在中断中处理串口数据的收发
#define UART_BUFFER_LEN 30
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 readrxtotxbuffer()
{
    uart_txlen += uart_rxlen;
    uart_rxlen = 0;
    USART_EnableInterrupt(USART1, USART_INT_TXBE);
}

void USART1_IRQHandler(void)
{
    if(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == SET){
        uart_buffer[uart_rxindex++] = (uint8_t)USART_RxData(USART1);
        if(uart_rxindex == UART_BUFFER_LEN)
            uart_rxindex = 0;
        uart_rxlen++;
    }
    if(USART_ReadStatusFlag(USART1, USART_FLAG_IDLE) == SET|| uart_rxlen == 10) {
        USART_ClearStatusFlag(USART1, USART_FLAG_IDLE);
        readrxtotxbuffer();
    }
    if(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == SET){
        if(uart_txlen > 0)
        {
            USART_TxData(USART1,uart_buffer[uart_txindex++]);
            if(uart_txindex == UART_BUFFER_LEN)
                uart_txindex = 0;
            uart_txlen--;
        }
        else
        {
            USART_DisableInterrupt(USART1, USART_INT_TXBE);
        }
    }
}
运行效果

接下来实现printf重定向到串口,方便打印调试信息
在工程设置中勾选这个


代码中添加
int fputc(int ch, FILE *f)
{
    USART_TxData(USART1, ch);
    while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
    return ch;
}
测试
int main(void)
{
    uint8_t i = 0;
    ConfigSysClock();
    uart_init();
    while (1)
    {
        i += 1;
        printf("极海APM32F411串口Printf测试 by yuyy1989 当前数字是:%d\n",i);
    }
}
运行结果

最后用CoreMark测试下性能,仅供参考


使用特权

评论回复
沙发
chenqianqian| | 2024-5-8 20:50 | 只看该作者
cormark跑分还不错

使用特权

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

本版积分规则

94

主题

531

帖子

4

粉丝