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 目录下是常用的工具软件:
- MDK:常用编译器;
- 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状态,同时我们通过串口调试工具验证串口回传功能;