MiniEBKBoard 入门指南


第一部分、硬件概述

1.1 MiniEBKBoard实物概图

  • 图1.1MiniEBKBoard实物概图
  • 如图1.1所示MiniEBKBoard配置了3个6*6轻触按键,两个LED;引出了DC005和micro-usb;

1.2 MiniEBKBoard原理图

  • 图1.2MiniEBKBoard实物概图
  • MiniEBKBoard原理图如图1.2所示,如看不清可打开Doc目录下的PDF文档查阅

第二部分、软件工具

2.1 软件概述

在 /Software 目录下是常用的工具软件:

  1. MDK:常用编译器;
  2. STM32CubeMX:代码生成工具;

第三部分、实战训练

3.1 实例Eg1_LED

目标是实现跑马灯;

3.1.1硬件设计

  • 图1.3 LED原理图
  • 如图1.3是LED原理图,其中LED1与LED2分别连接到MCU的PB0和PB1;

3.1.2 软件设计

  • 首先是初始化代码,我们通过STM32cubeMX软件去生成代码,具体配置请打开Eg1_LED.ioc查阅,这里不再赘述; 我们的工程使用的是Keil-MDK编译器,生成的工程目录如图1.5
  • 图1.5 工程目录

其中

  • Application/MDK-ARM 存放的是启动代码;
  • Application/User/Core: main函数,中断Handler,MSP相关代码;
  • Drivers/STM32F1xx_HAL_Driver: HAL库驱动代码
  • Drivers/CMSIS: CMSIS相关代码
  • My_Device: 这是我们自定义的代码;

工程目录这里只做一次介绍,后面的样例目录大同小异。
我们打开LED.h

#define   LED1_OFF()   GPIOB->BSRR = GPIO_PIN_0
#define   LED1_ON()    GPIOB->BRR = GPIO_PIN_0

#define   LED2_OFF()   GPIOB->BSRR = GPIO_PIN_1
#define   LED2_ON()    GPIOB->BRR = GPIO_PIN_1

我们看到的是操作GPIO的BSRR和BRR寄存器;我们打开参考手册GPIO章节,可以看到


BSSR寄存器是置位寄存器, 写0无效,GPIOB->BSRR = GPIO_PIN_0就是把BS0置1,也就是PB0输出高电平;同理BRR是清除寄存器,GPIOB->BRR = GPIO_PIN_0就是PB0输出低电平;结合原理图看,高电平LED灯熄灭,低电平LED打开;
最后,跳转到Blink函数;

void Blink(void)
{
	LED1_ON();
	LED2_OFF();
	HAL_Delay(300);
	LED1_OFF();
	LED2_ON();
	HAL_Delay(300);	
}

最后我们在main函数的while循环中调用即可实现跑马灯;
至此,软件设计完成。(对于没有基础的同学,还是建议多看代码)

3.1.3 下载验证

我们把烧录器的SWDIO接PA13,SWCLK接PA14,GND接GND,3.3V接3.3V,固件程序下载进去可以,可以看到led1和led2轮流亮灭;

3.2 实例Eg2_KEY

目标是实现按键控制LED;

3.2.1硬件设计

  • 图1.4 KEY原理图
  • 如图1.4是KEY原理图,其中SW2与SW3分别连接到MCU的PA0和PA1;

3.2.2 软件设计

首先是初始化代码,我们通过STM32cubeMX软件去生成代码,具体配置请打开Eg2_KEY.ioc查阅;
我们打开KEY.c

void Key_Scan(void)
{
	static uint8_t bounce=0,bounce1=0;
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
	{
		bounce=1;
	}else{
		if(bounce)
		{
			bounce=0;
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
		}
	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
	{
		bounce1=1;
	}else{
		if(bounce1)
		{
			bounce1=0;
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
		}
	}
	HAL_Delay(10);
}

bounce和bounce1记录按键按下了标志,当按键弹起时候清零并响应,做出切换LED翻转的动作;
HAL_GPIO_ReadPin函数是读取GPIO的状态, HAL_GPIO_TogglePin是翻转GPIO的电平;
最后在main函数while循环中调用即可;

3.2.3 下载验证

我们固件程序下载进去可以,按下SW2翻转LED2;按下SW3翻转LED1;

3.3 实例Eg3_UART

目标是实现UART串口回传功能,即通过串口调试工具发送数据到mcu,mcu原封不动回传;

3.3.1硬件设计

  • 图1.5 UART原理图
  • 如图1.5是UART原理图,MCU的PA9和PA10分别是MCU串口的TX和RX;

3.3.2 软件设计

首先是初始化代码,我们通过STM32cubeMX软件去生成代码,具体配置请打开Eg3_UART.ioc查阅;
我们打开Application/User/Core目录下的usart.c,加入以下代码,支持 printf 函数,而不需要选择 use MicroLIB

#if 1
#pragma import(__use_no_semihosting)                             
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;          
void _sys_exit(int x) 
{ 
	x = x; 
} 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0); 
    USART1->DR = (uint8_t) ch;      
	return ch;
}
#endif

并在HAL_UART_RxCpltCallback和MX_USART1_UART_Init中加入HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer, RXBUFFERSIZE)以使能接收中断;
同时修改按键扫描函数如下,HAL_GPIO_ReadPin用以监控LED状态并打印;

void Key_Scan(void)
{
	static uint8_t bounce=0,bounce1=0;
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
	{
		bounce=1;
	}else{
		if(bounce)
		{
			bounce=0;
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))
			{
				printf("LED2 OFF!\r\n");
			}else{
				printf("LED2 ON!\r\n");
			}		
		}
	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
	{
		bounce1=1;
	}else{
		if(bounce1)
		{
			bounce1=0;
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))
			{
				printf("LED1 OFF!\r\n");
			}else{
				printf("LED1 ON!\r\n");
			}	
		}
	}
	HAL_Delay(10);
}

3.3.3 下载验证

我们固件程序下载进去可以,按下SW2翻转LED2;按下SW3翻转LED1,并通过串口打印led状态,同时我们通过串口调试工具验证串口回传功能;