打印
[活动]

【APM32M3514开发板测评】+ 失败的呼吸灯

[复制链接]
98|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liloooo|  楼主 | 2025-2-16 18:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

收到开发板后, 一直在研究foc,本来就是foc纯小白又苦于电源没在身边 只能先看例程和测试等下周电源到后开始测试。 看下板载资源能有什么能测试的,之前论坛有使用开关控制D7(red led),下面有人评论为何不做呼吸灯,先做下foc呼吸灯测试,不料出师不利,pwm呼吸灯都给搞失败了,请各位大佬指教

1、APM32M3514芯片

Arm Cortex-M0+内核、主频72MHz;集成M0CP协处理器,集成电机驱动6N栅极驱动器、LDO;12bit的ADC、4个运放,以及各种通用接口外设都十分丰富;板子设计的非常漂亮,有ch340拉出的type-c串口,和swd接口;电机的相关家口都已使用端子留出接口:电源输入接口,uvb,霍尔检测接口对于电机控制相关测试非常方便;

2、搭建环境

首先去官网下载sdk和pack https://www.geehy.com/product/fifth/APM32M3514#design

在keil安装该芯片的pack,打开sdk中工程, 对比自己搭建了一个工程

屏幕截图2025-02-16-1.png

期间经历各种报错

.\\Objects\\00test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup\_apm32m35xx.o). 
.\\Objects\\00test.axf: Error: L6218E: Undefined symbol SystemCoreClock (referred from apm32m35xx\_rcm.o). 
.\\Objects\\00test.axf: Error: L6218E: Undefined symbol SystemCoreClockUpdate (referred from apm32m35xx\_rcm.o).

这个原因是下图中未定义 m3514宏

PixPin_2025-02-16_17-46-57.png

此时查原理图和数据手册得知,D7(RED led)是与PA12连接 且 PA12能复用AF3设置成tmr1的ch4,(有个疑问PA8\9\10端口的复用哪里去了)不过看foc历程 PA8\9\10是复用功能AF2下的 ch1\2\3

PixPin_2025-02-16_17-49-47.png

PixPin_2025-02-16_17-50-29.png

3、代码

立马开始写程序

pwm.c

#define PWM_PIN                         GPIO_PIN_12
#define PWM_GPIO_PORT                   GPIOA
#define PWM_GPIO_CLK                    RCM_AHB_PERIPH_GPIOA
#define PWM_TMR_CLK                     RCM_APB2_PERIPH_TMR1


void PWM1_Init(unsigned int Cycle,unsigned int HighTime)
{
    TMR_TimeBase_T TMR_BaseConfigStruct;
    TMR_OCConfig_T OCconfigStruct;
    GPIO_Config_T GPIO_InitStructure;                   //定义GPIO结构体
        /* Enable Clock*/
    RCM_EnableAHBPeriphClock(PWM_GPIO_CLK);
    RCM_EnableAPB2PeriphClock(PWM_TMR_CLK);         //开启定时器时钟
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);  //开启SYSCFG时钟        

     /* Connect TMR1 to CH4 */
    GPIO_ConfigPinAF(PWM_GPIO_PORT, GPIO_PIN_SOURCE_12, GPIO_AF_PIN3);/* 端口PA12复用为AF3  tmr1_ch4 */
    GPIO_InitStructure.mode  = GPIO_MODE_AF;
    GPIO_InitStructure.pin   = GPIO_PIN_12;
    GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
    GPIO_InitStructure.outtype = GPIO_OUT_TYPE_PP;
    GPIO_InitStructure.pupd  = GPIO_PUPD_PD;
    GPIO_Config(PWM_GPIO_PORT, &GPIO_InitStructure);

    TMR_BaseConfigStruct.div = 4800 -1 ;     /* 定时器主频 TMR1 clock_freq:48/(4799+1) MHZ = 10kHZ  1s计数10000    1s/10k =100us     */
    // TMR_BaseConfigStruct.div = 4800 -1 ;     /* 定时器主频 TMR1 clock_freq:48/(47+1) MHZ = 1MHZ  1s/1M=1us  */
    TMR_BaseConfigStruct.period = Cycle-1;   /* 自动重装载值Cycle=总计数/100  生成100hz  0~99  */
    TMR_BaseConfigStruct.counterMode = TMR_COUNTER_MODE_UP;    /* 向上计数 */
    TMR_BaseConfigStruct.clockDivision = TMR_CKD_DIV1;    /* 分频数为0 不分频 */
    TMR_BaseConfigStruct.repetitionCounter = 0;    /* 重复计数器为0 不开启 */
    TMR_ConfigTimeBase(TMR1, &TMR_BaseConfigStruct);        


    OCconfigStruct.OC_Mode = TMR_OC_MODE_PWM1;    /* PWM1模式 */
    OCconfigStruct.OC_Idlestate = TMR_OCIDLESTATE_RESET;    /* 空闲时CHx输出低电平 */
    OCconfigStruct.OC_NIdlestate = TMR_OCNIDLESTATE_RESET;    /* 空闲时CHxN输出低电平 */
    OCconfigStruct.OC_OutputNState = TMR_OUTPUT_NSTATE_DISABLE;    /* 禁止CHxN输出 */
    OCconfigStruct.OC_OutputState = TMR_OUTPUT_STATE_ENABLE;    /* 输出使能CHx输出 */
    OCconfigStruct.OC_Polarity = TMR_OC_POLARITY_HIGH;    /* 设置CHx高电平为有效电平 */
    OCconfigStruct.OC_NPolarity = TMR_OC_NPOLARITY_HIGH;    /* 设置CHxN高电平为有效电平h */
    OCconfigStruct.Pulse = HighTime;    /* 设置CCx比较值 即高电平时间 */
    TMR_OC4Config(TMR1, &OCconfigStruct);
    TMR_OC4PreloadConfig(TMR1, TMR_OC_PRELOAD_ENABLE);/*使能CCx寄存器的自动装载功能*/

    TMR_EnablePWMOutputs(TMR1); /* 使能PWM输出 */
    TMR_Enable(TMR1);    /* 使能定时器TMR1  */
}

LED


#define LED1_AHB_GPIO       RCM_AHB_PERIPH_GPIOA
#define LED1_Pin            GPIO_PIN_12
#define LED1_GPIO           GPIOA

void LED1Init(void)
{
    GPIO_Config_T GPIO_InitStructure;                   //定义GPIO结构体
    RCM_EnableAHBPeriphClock(LED1_AHB_GPIO);            //开启GPIO模块的AHB时钟
    GPIO_InitStructure.pin=LED1_Pin;                    //配置端口pin
    GPIO_InitStructure.mode = GPIO_MODE_OUT;
    GPIO_InitStructure.outtype = GPIO_OUT_TYPE_PP;      //配置端口为推挽输出模式
    GPIO_InitStructure.pupd = GPIO_PUPD_NO; 
    GPIO_InitStructure.speed=GPIO_SPEED_50MHz;          //配置端口速度

    GPIO_Config(LED1_GPIO, &GPIO_InitStructure);        //对配置初始化
}
void LED1_ON(void)                      //LED点亮
{
    GPIO_ClearBit(LED1_GPIO, LED1_Pin);
}
void LED1_OFF(void)                     //LED熄灭
{
    GPIO_SetBit(LED1_GPIO, LED1_Pin);
}
void LED1_Reverse(void)                 //LED状态反转
{
    if(GPIO_ReadOutputBit(LED1_GPIO, LED1_Pin))
    GPIO_ClearBit(LED1_GPIO, LED1_Pin);
    else
    GPIO_SetBit(LED1_GPIO, LED1_Pin);
}

main

int main(void)
{
    unsigned char pwm_cnt = 0;
    unsigned char pwm_state = 0;
    LED1Init();
    APM_DelayInit();
    PWM1_Init(100,50);
    while(1) //渐变呼吸灯
    {
         switch(pwm_state){
            case 0:
                pwm_cnt++;
                if(pwm_cnt >= 100)
                    pwm_state = 1;
                break ;
            case 1:
                pwm_cnt--;
                if(pwm_cnt == 0)
                    pwm_state = 0;
                break ;
        }
        TMR_SetCompare4(TMR1, pwm_cnt);
        APM_DelayMs (500UL);
    }

一直在调整pwm的配置 和 gpioAF 但是 D7 没有变化

只是配置完复用下拉输出后 灯的亮度一直是亮的不过是亮度比较低 看了所有的例程,基本可以确定pwm的配置是ok的,感觉问题出在gpio_af_cinfig上

light.jpg

off.jpg

请教论坛中大佬解惑,实在不行周一请教芯片厂家支持,

我尝试用keil软件仿真 看pwm是否输出 仿真也出现错误

【Running with Code Size Limit: 32K】 这个是因为 keil未激活有限制

【 error 65: access violation at 0x40021000 : no 'read' permission】这个是这个空间没权限 在keil debug->merroy map 添加

不确定是不是芯片使用 m0plus内核 但又内部空间使用有变动导致的权限问题

PixPin_2025-02-16_18-10-23.png

使用特权

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

本版积分规则

1

主题

11

帖子

0

粉丝