新年比较忙,预计要到3月底,才能有大空,到时候会用M3514板子好好学一学电机驱控。
所以贴子发得少,有愧于Geehy负责评估工作的饭饭。
今天看到评估群里有群友好像是遇到了LED翻转或者串口通信的问题?没有仔细看。
心想反正到了电机调试的时候,我也会用到串口的,今晚先试一试串口吧。
如果能帮到群友更好。
刚拿到板子时,我就发现Geehy这块M3514板子,它的SWD调试口,其实2个通信引脚正好可以做串口,连排针都有了:
缺点是没有把RESET引出来,会有一点小问题,但有办法解决(JLink连接板子时会失败,后面会提到解决方法)。
在数据手册里找到引脚复用表,程序里要相应修改的:
再看一下板子上的LED,好像只有一个可编程的?够用了,就它了:
再检查一遍引脚:
OK,一切就绪,在官方SDK里找一个例程,就用GPIO_Toggle这个吧,
就用在原位置复制一个,名为GPIO_Toggle_USART2:
注意,一定要在同级文件夹下,不然还要修改工程里面的SDK库搜索路径,麻烦。
修改以下代码:
1、main.c
为了省事儿,我直接用库里的printf了,于是把调试用的USART1改为USART2:
/* printf using USART2 */
#define DEBUG_USART USART2
在APM_MINI_Init函数里,把USART1的初始化,改为USART2:
void APM_MINI_Init(void)
{
/* Init delay function */
APM_DelayInit();
APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_GPIO);
APM_DelayMs(200);//安全起见,加一个延时
APM_MINI_COMInit(COM2);//这里原为COM1,改用COM2
}
因为只有一个LED3,GPIO_Init函数改成这样:
void GPIO_Init(void)
{
GPIO_Config_T gpioConfig;
RCM_EnableAHBPeriphClock(LED3_GPIO_CLK);
/* LED3 GPIO configuration */
gpioConfig.pin = LED3_PIN;
gpioConfig.mode = GPIO_MODE_OUT;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(LED3_GPIO_PORT, &gpioConfig);
}
main()函数改成这样:
int main(void)
{
APM_MINI_Init();
GPIO_Init();
printf("This is an example of GPIO toggle \r\n");
while (1)
{
/* Turn LED3 off */
GPIO_SetBit(LED3_GPIO_PORT, LED3_PIN);
APM_DelayMs(200);
/* Turn LED3 on */
GPIO_ClearBit(LED3_GPIO_PORT, LED3_PIN);
APM_DelayMs(200);
printf("GPIO toggle \r\n");
}
}
2、board_apm32m35xx.h
原代码里有2个LED,改成这样,实际只用LED3:
#define LEDn 2
#define LED2_PIN GPIO_PIN_12
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_CLK RCM_AHB_PERIPH_GPIOA
#define LED3_PIN GPIO_PIN_12
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_CLK RCM_AHB_PERIPH_GPIOA
Button顺便也改一下,但没用到:
#define KEY1_BUTTON_PIN GPIO_PIN_12
#define KEY1_BUTTON_GPIO_PORT GPIOB
#define KEY1_BUTTON_GPIO_CLK RCM_AHB_PERIPH_GPIOB
#define KEY1_BUTTON_EXTI_LINE EINT_LINE12
#define KEY2_BUTTON_PIN GPIO_PIN_13
#define KEY2_BUTTON_GPIO_PORT GPIOC
#define KEY2_BUTTON_GPIO_CLK RCM_AHB_PERIPH_GPIOC
#define KEY2_BUTTON_EXTI_LINE EINT_LINE13
串口我们使用USART2,所以做如下修改(注意,用红色标出的位置,与前面复用表里对应):
#define MINI_COM2 USART2
#define MINI_COM2_CLK RCM_APB1_PERIPH_USART2
#define MINI_COM2_TX_PIN GPIO_PIN_14
#define MINI_COM2_TX_GPIO_PORT GPIOA
#define MINI_COM2_TX_GPIO_CLK RCM_AHB_PERIPH_GPIOA
#define MINI_COM2_TX_SOURCE GPIO_PIN_SOURCE_14
#define MINI_COM2_TX_AF GPIO_AF_PIN1
#define MINI_COM2_RX_PIN GPIO_PIN_13
#define MINI_COM2_RX_GPIO_PORT GPIOA
#define MINI_COM2_RX_GPIO_CLK RCM_AHB_PERIPH_GPIOA
#define MINI_COM2_RX_SOURCE GPIO_PIN_SOURCE_13
#define MINI_COM2_RX_AF GPIO_AF_PIN6
#define MINI_COM2_IRQn USART2_IRQn
编译,下载,然后JLink断开,连接串口小板,LED3开始翻转闪烁,并定时向串口发出字符串。就没时间试验MCU的接收功能。
再次下载固件时,IDE会找不到SWD设备,也就是找不到这个板子上的MCU。
原因是,JLink连接板子时,会发出硬件RESET信号,并通过SWD通信线,向板子发一个软复位指令。
因为板子的调试口只有VCC、GND、SWD、SWC这4根线,没有RESET,所以收不到硬件RESET信号;
又因为SWC和SWD配置成了串口,软复位指令也收不到了。
解决方法也简单:
一种方法是,在JLink连接前(比如点击下载、或配置JLink都会触发连接),按住板子上的RESET按钮,保持复位,
然后松开,JLink就会连接成功。
另一种方法是,拿一根公+母的杜邦线,一头接在JLink的RESET脚,一头怼在板子的RESET按钮这个位置,如图:
此时点击下载固件,就会自动通过RESET线硬件复位MCU,下载成功。
两种方法我都试过,对这个串口复用方案有效。
工程文件夹已打包作为贴子附件,有需要可下载,注意,头文件board_apm32m35xx.h在SDK的另一个文件夹里:
|