蓝桥杯物联网赛项的主控芯片是STM32L071KBU,这块板子外设不多,入门很快。赛项支持CubeMax进行初始化配置,搭配keil5进行编译,做出美味的程序。作为点灯工程师,我们先来点亮板子上的LD5。以此来熟悉CubeMax的配置和代码的编写。
CubeMax的配置
GPIO的配置
在官方给的资料中,我们可以查阅到,用户自定义LED和KEY对应的引脚是PC15,PC14。
当然也可以根据原理图来看对应的引脚配置
指示灯 LD5
按键 S1
由此我们就可以对PC14,PC15进行配置。
1.打开CubeMax新建工程
选择型号STM32L071KBU*(可能存在cubemax版本原因,芯片型号不一样,经过测试u3和u*是通用的)
选择PC15,选择GPIO_OutPut
选择PC14,选择GPIO_InPut
IO口的模式有上拉,开漏,推挽,此处输出口选择
输入口的选择
这样,IO口就配置好了。下面来配置系统时钟。
时钟配置
关于时钟配置,可以选择多种时钟源,分频,倍频后得到我们想要的系统时钟,此处介绍一种简单的时钟配置方式
1.选择Clock Configuration
2.在 HCLK(MHz) 中键入 32,回车
3.点击确定配置
这样时钟就配置好了
生成项目配置
配置好GPIO口和时钟后就可以生成代码了,在Project Manager这个选项中配置保存路径,项目名称,函数库选择,编译方式。
1.编辑项目名称,路径,IDE
2.勾选生成项目.c/.h文件,勾选重新生成时备份以前生成的文件
3.最后点击GENERATE CODE,生成项目代码,打开项目文件
Keil5中代码编写
用户代码编写在用户沙箱中,可以避免CubeMax重新配置导致代码覆盖
在gpio.h中底部的用户沙箱中编写代码
/* USER CODE BEGIN 2 */
uint8_t KEY_Read(void)
{
uint8_t ucVal = 0;
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == 0)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == 0)
ucVal = '0';
}
return ucVal;
}
void LED_Disp(uint8_t ucLed)
{
if((ucLed&1) == 1)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
}
/* USER CODE END 2 */
函数添加到头文件gpio.h的用户沙箱中
/* USER CODE BEGIN Prototypes */
uint8_t KEY_Read(void);
void LED_Disp(uint8_t ucLed);
/* USER CODE END Prototypes */
在主函数中定义变量
/* USER CODE BEGIN PV */
uint16_t usDly;
uint8_t ucState;
uint8_t ucKey;
uint8_t ucLed;
/* USER CODE END PV */
添加延时函数 ( 在函数SysTick_Handler()中的用户沙箱中添加usDly++; )
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
usDly++;
/* USER CODE END SysTick_IRQn 1 */
}
编写按键,led的功能代码(用户函数沙箱在最底部,注意记得声明函数)
/* USER CODE BEGIN 4 */
void KEY_Proc(void)
{
uint8_t ucVal = 0;
ucVal = KEY_Read();
if(ucVal != ucKey)
ucKey=ucVal;
else
ucVal = 0;
if(ucVal == '0')
ucState ^= 1;
}
void LED_Proc(void)
{
if(usDly < 500) //用户延时函数
return;
usDly = 0;
if(ucState == 0)
ucLed ^= 1;
else
ucLed |= 1;
LED_Disp(ucLed);
}
/* USER CODE END 4 */
编写主函数(在主函数中只需要调用led,key的功能代码)
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
KEY_Proc();
LED_Proc();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
实验现象
按下USER按键,改变LD5的工作状态