打印
[活动]

【APM32M3514开发板测评】+串口通讯的实现

[复制链接]
30|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2025-2-1 20:31 编辑

在前面曾介绍过,例程中对串口的配置是无效的,因此要实现串口通讯必须自行配置。
鉴于引脚资源的出借情况,这里选取PC4和PC5来供串口1所用。

图1 所用引脚
对串口进行配置的函数为:
void APM_MINI_COMInit(COM_T COM)
{
    GPIO_Config_T gpioConfig;
    USART_Config_T usartConfigStruct;
    RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);
    if (COM == COM1)
    {
        RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
    }
    else
    {
        RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
    }
    GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);
    GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);
    gpioConfig.mode = GPIO_MODE_AF;
    gpioConfig.pin = COM_TX_PIN[COM];
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(COM_TX_PORT[COM], &gpioConfig);
    gpioConfig.pin = COM_RX_PIN[COM];
    GPIO_Config(COM_RX_PORT[COM], &gpioConfig);
    usartConfigStruct.baudRate = 115200;
    usartConfigStruct.mode     = USART_MODE_TX_RX;
    usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    usartConfigStruct.parity   = USART_PARITY_NONE;
    usartConfigStruct.stopBits =  USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    USART_Config(COM_USART[COM], &usartConfigStruct);
    USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);
    if (COM_USART[COM] == USART1)
    {
        NVIC_EnableIRQRequest(USART1_IRQn, 2);
    }
    else if (COM_USART[COM] == USART2)
    {
        NVIC_EnableIRQRequest(USART2_IRQn, 3);
    }
    USART_Enable(COM_USART[COM]);
}

以中断方式接收数据的函数为:
void  USART_Receive_Isr(void)
{
    uint8_t dat;
    if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_RXBNE) == SET)
    {
        dat = (uint8_t)USART_RxData(MINI_COM1);
        printf("%c", dat);
    }
}

以中断方式发送信息的函数为:
void USART_Send_Isr(void)
{
    while (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_TXBE) == RESET);
    if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_TXC))
    {
        printf("APM MINI BOARD SEND FINISHED\r\n\r\n");
        USART_ClearStatusFlag(MINI_COM1, USART_FLAG_TXC);
    }
}

进行串口测试的主程序为:
int main(void)
{
    GPIO_Config_T gpioConfig;
    USART_Config_T usartConfig;
    APM_MINI_COMInit(COM1);
    RCM_EnableAHBPeriphClock(MINI_COM1_TX_GPIO_CLK | MINI_COM2_TX_GPIO_CLK);
    RCM_EnableAPB2PeriphClock(MINI_COM1_CLK);
    GPIO_ConfigPinAF(MINI_COM1_TX_GPIO_PORT, MINI_COM1_TX_SOURCE, MINI_COM1_TX_AF);
    GPIO_ConfigPinAF(MINI_COM1_RX_GPIO_PORT, MINI_COM1_RX_SOURCE, MINI_COM1_RX_AF);
    gpioConfig.mode = GPIO_MODE_AF;
    gpioConfig.pin = MINI_COM1_TX_PIN;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(MINI_COM1_TX_GPIO_PORT, &gpioConfig);
    gpioConfig.pin  = MINI_COM1_RX_PIN;
    GPIO_Config(MINI_COM1_RX_GPIO_PORT, &gpioConfig);
    usartConfig.baudRate = 115200;
    usartConfig.mode = USART_MODE_TX_RX;
    usartConfig.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    usartConfig.parity = USART_PARITY_NONE;
    usartConfig.stopBits = USART_STOP_BIT_1;
    usartConfig.wordLength = USART_WORD_LEN_8B;
    USART_Config(MINI_COM1, &usartConfig);
    USART_EnableInterrupt(MINI_COM1, USART_INT_RXBNEIE);
    NVIC_EnableIRQRequest(MINI_COM1_IRQn, 2);
    USART_Enable(MINI_COM1);
    USART_Write(MINI_COM1, (uint8_t*)"HELLO APM MINI BOARD\r\n");
    while (1)
    {
    }
}

经程序的 编译与下载,其运行结果如图2所示。

图2 测试效果



使用特权

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

本版积分规则

472

主题

2812

帖子

38

粉丝