收到开发板后, 一直在研究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中工程, 对比自己搭建了一个工程

期间经历各种报错
.\\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宏

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


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上


请教论坛中大佬解惑,实在不行周一请教芯片厂家支持,
我尝试用keil软件仿真 看pwm是否输出
仿真也出现错误
【Running with Code Size Limit: 32K】 这个是因为 keil未激活有限制
【 error 65: access violation at 0x40021000 : no 'read' permission】这个是这个空间没权限 在keil debug->merroy map 添加
不确定是不是芯片使用 m0plus内核 但又内部空间使用有变动导致的权限问题
