打印
[活动]

【APM32M3514开发板测评】板载串口使用详细更改教程

[复制链接]
52|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liweibuct|  楼主 | 2025-2-21 00:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #有奖活动#
我年前发布的一个视频帖子里向大家展示了APM32M3514通过板载通讯接口反馈反馈数据的功能,这个帖子就将详细的教程展示出来。
一、硬件浅析
1、电源部分
电源部分比较简单,由于APM32M3514芯片自身具有3.3V LDO,因此整板只有一个二次电源电路,采用经典的LM5164芯片,降压到12V,为单片机、驱动电路等供电,这个应该是板子上为数不多的非国产芯片之一。而板子上的3.3V供电则由APM32M3514芯片提供,用于LED指示灯、霍尔传感器接口等电路


2、功率部分
功率部分采用典型的三个半桥拓扑架构,上下桥均采用Nmos驱动,采用的是无锡新洁能NCEP0178AK,这个片子性能还可以 VDS 可达100V,ID可以到78A,在咱们这个标称100W的DEMO里,降额也是足足的(这意思是这个板子还有很大空间,在自己实力可控的条件下,可以换更小的采样电阻,调下程序比例系数,输出功率可以做的更大)。

3、通讯部分
通讯部分设计就比较有意思了,板子虽然有基于ch340的串口通讯电路,但是这个电路的TTL电平引脚竟然和外部晶振共用,而且官方例程用的就是外部晶振,所以在这种情况下这个电路就成了摆设。手册给的外部晶振电路和通讯电路如下:


如果我们想用该串口进行通讯,只需要将R37和R38上的短接0欧电阻焊下,焊接到R44和R45位置上即可,其在板子上位置如下图红框所示

更改完成后,通过软件进行相应的配置就可以实现串口通讯了。
二、软件调整
官方文档对软件电机控制核心代码的描述还是比较详细的,而且也有一定的注释,所以我这里就不在详细分析官方的电机控制核心代码
主要对该开发板改串口通讯部分的代码进行详细说明。
1、工作时钟源
前面已经提到,官方的例程采用外部晶振作为时钟源,想使用板载串口就需要改成内部时钟源,通过查看芯片数据手册——时钟树部分,可以知道内部晶振也为8MHz,但和外部晶振不同的是,它的预分频系数是固定的2,而外部晶振的预分频系数是可配置的,结合时钟锁相环的最大倍频系数,可知采用内部晶振后,单片机最大的工作频率只能到64MHz,下面也将按照64MHz进行配置。

2、代码调整
在官方给出的例程中,时钟源配置所在文件为system_apm32m35xx.c,其具体路径如下图高亮显示的文件可以找到

打开该文件后,首先增加基于内部时钟源的64MHz定义,并屏蔽72MHz定义如下图所示

下一步增加时钟变量如下图所示

再下一步增加系统时钟配置函数如下图所示

最后增加基于内部时钟源的64MHz初始化函数如下

接着需要将parameter.h中时钟频率也配置到64000000,具体如下图,至此,时钟配置完毕。

接着修改串口功能,在drv_uart.c文件中,初始化串口1,配置为921600波特率,8N1格式,具体如下
void Pilot_uart_init(void)
{
    USART_Config_T USART_InitStructure;
    DMA_Config_T   DMA_InitStructure;

    RCM_ConfigUSARTCLK(RCM_USART1CLK_SYSCLK);
//    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);

    USART_InitStructure.baudRate   = 921600;//1945946;
    USART_InitStructure.mode       = USART_MODE_TX_RX;
    USART_InitStructure.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    USART_InitStructure.parity     = USART_PARITY_NONE;
    USART_InitStructure.stopBits   = USART_STOP_BIT_1;
    USART_InitStructure.wordLength = USART_WORD_LEN_8B;
    USART_Config(USART1,&USART_InitStructure);
    USART_DisableOverSampling8(USART1);
    USART_DisableOneBitMethod(USART1);
    USART1->CTRL3 &= (uint32_t)~0x400;
    /** Enable USART */
    USART_Enable(USART1);

}
在drv_io.c文件中,增加PF1和PF2引脚的配置如下,并在IO初始化函数中增加串口引脚初始化,具体如下
/*  uart1 io map    */
void IOinit_uart1(void)
{
    GPIO_Config_T   GPIO_InitStructure;
    /*  PF0 -> uart1_tx    */
    GPIO_InitStructure.pin      =   GPIO_PIN_0;
    GPIO_InitStructure.speed    =   GPIO_SPEED_50MHz;
    GPIO_InitStructure.mode     =   GPIO_MODE_AF;
    GPIO_InitStructure.pupd     =   GPIO_PUPD_NO;
    GPIO_InitStructure.outtype  = GPIO_OUT_TYPE_PP;
    GPIO_Config(GPIOF, &GPIO_InitStructure);
    GPIO_InitStructure.pin      =   GPIO_PIN_1;
    GPIO_Config(GPIOF, &GPIO_InitStructure);
    GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_0, GPIO_AF_PIN1);
    GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_1, GPIO_AF_PIN1);
}


/*********************************************************************************************************
** Func name:               IO_Init()
** Param:
**
** Return:
** Description:             IO初始化
*********************************************************************************************************/
void IO_Init(void)  
{  
    IOInit_LED();
    IOinit_uart1();
                IOinit_ADC();
    Other_Init();  //direction and lock
}

在main.c中增加如下函数
int fputc(int ch, FILE* f)
{
    /* send a byte of data to the serial port */
    USART_TxData(USART1, (uint8_t)ch);

    /* wait for the data to be send  */
    while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);

    return (ch);
}

至此,即可通过printf函数通过板载串口输出想要的打印结果,结合VOFA+软件的相关协议,实现参数实时显示和图表的实时绘制。

使用特权

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

本版积分规则

5

主题

28

帖子

0

粉丝