当前位置:   article > 正文

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

cube max

蓝桥杯物联网赛项的主控芯片是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中底部的用户沙箱中编写代码

  1. /* USER CODE BEGIN 2 */
  2. uint8_t KEY_Read(void)
  3. {
  4. uint8_t ucVal = 0;
  5. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == 0)
  6. {
  7. HAL_Delay(10);
  8. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == 0)
  9. ucVal = '0';
  10. }
  11. return ucVal;
  12. }
  13. void LED_Disp(uint8_t ucLed)
  14. {
  15. if((ucLed&1) == 1)
  16. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
  17. else
  18. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
  19. }
  20. /* USER CODE END 2 */

函数添加到头文件gpio.h的用户沙箱中

  1. /* USER CODE BEGIN Prototypes */
  2. uint8_t KEY_Read(void);
  3. void LED_Disp(uint8_t ucLed);
  4. /* USER CODE END Prototypes */

在主函数中定义变量

  1. /* USER CODE BEGIN PV */
  2. uint16_t usDly;
  3. uint8_t ucState;
  4. uint8_t ucKey;
  5. uint8_t ucLed;
  6. /* USER CODE END PV */

添加延时函数 (  在函数SysTick_Handler()中的用户沙箱中添加usDly++;   )

  1. /**
  2. * @brief This function handles System tick timer.
  3. */
  4. void SysTick_Handler(void)
  5. {
  6. /* USER CODE BEGIN SysTick_IRQn 0 */
  7. /* USER CODE END SysTick_IRQn 0 */
  8. HAL_IncTick();
  9. /* USER CODE BEGIN SysTick_IRQn 1 */
  10. usDly++;
  11. /* USER CODE END SysTick_IRQn 1 */
  12. }

编写按键,led的功能代码(用户函数沙箱在最底部,注意记得声明函数)

  1. /* USER CODE BEGIN 4 */
  2. void KEY_Proc(void)
  3. {
  4. uint8_t ucVal = 0;
  5. ucVal = KEY_Read();
  6. if(ucVal != ucKey)
  7. ucKey=ucVal;
  8. else
  9. ucVal = 0;
  10. if(ucVal == '0')
  11. ucState ^= 1;
  12. }
  13. void LED_Proc(void)
  14. {
  15. if(usDly < 500) //用户延时函数
  16. return;
  17. usDly = 0;
  18. if(ucState == 0)
  19. ucLed ^= 1;
  20. else
  21. ucLed |= 1;
  22. LED_Disp(ucLed);
  23. }
  24. /* USER CODE END 4 */

编写主函数(在主函数中只需要调用led,key的功能代码)

  1. /**
  2. * @brief The application entry point.
  3. * @retval int
  4. */
  5. int main(void)
  6. {
  7. /* USER CODE BEGIN 1 */
  8. /* USER CODE END 1 */
  9. /* MCU Configuration--------------------------------------------------------*/
  10. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  11. HAL_Init();
  12. /* USER CODE BEGIN Init */
  13. /* USER CODE END Init */
  14. /* Configure the system clock */
  15. SystemClock_Config();
  16. /* USER CODE BEGIN SysInit */
  17. /* USER CODE END SysInit */
  18. /* Initialize all configured peripherals */
  19. MX_GPIO_Init();
  20. MX_RTC_Init();
  21. /* USER CODE BEGIN 2 */
  22. /* USER CODE END 2 */
  23. /* Infinite loop */
  24. /* USER CODE BEGIN WHILE */
  25. while (1)
  26. {
  27. /* USER CODE END WHILE */
  28. KEY_Proc();
  29. LED_Proc();
  30. /* USER CODE BEGIN 3 */
  31. }
  32. /* USER CODE END 3 */
  33. }

实验现象

按下USER按键,改变LD5的工作状态

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/637354
推荐阅读
相关标签
  

闽ICP备14008679号