【蓝桥杯物联网赛项学习日志】Day1 点亮led

蓝桥杯物联网赛项的主控芯片是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的工作状态

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值