当前位置: 首页 > news >正文

蓝桥杯嵌入式(STM32G431RBT6)入门第二天——建立自己的初始化文件|CSDN创作打卡

接前一天,将所有工程拷贝到建立的另外一个文件夹LED中,在Inc文件夹中建立led.h文件,在Src文件夹中建立led.c。

用keil打开工程,点击下图中的图标,新建一个USER分类,将刚刚创建的led.c添加进入。

打开led.c,将gpio.c中初始化部分复制粘贴到led.c,并稍作修改,修改完后led.c中的代码如下

#include "led.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); /*Configure GPIO pins : PC13 PC14 PC15 PC8 PC9 PC10 PC11 PC12 */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pin : PD2 */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); }

led.h中代码如下,需要在最后多加几个空格行,不然编译会有警告。

#include "main.h" void LED_Init(void);

然后将Inc文件夹中gpio.h文件和Src文件夹中gpio.c两个文件删除,main.c中原来的MX_GPIO_Init();修改为LED_Init();头文件包含修改为#include "main.h"

#include "led.h"代码如下(已做部分删减,删除了一些不需要的注释)

#include "main.h" #include "led.h" void SystemClock_Config(void); 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 */ LED_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); HAL_Delay(500); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3; RCC_OscInitStruct.PLL.PLLN = 20; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

编译后无错误无警告,下面开始在led.c中编写led的控制函数,方便快速点亮需要的灯。函数内容如下,第一行将需要点亮的led对应的IO口置为低电平,第二行将不需要点亮的led对应的IO口置为高电平,然后三四两行进行锁存。

void led_display(unsigned char led) { HAL_GPIO_WritePin(GPIOC, led<<8, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOC, (~led)<<8, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); }

在led.h中添加void led_display(unsigned char led);

#include "main.h" void LED_Init(void); void led_display(unsigned char led);

最后在main.c的while(1)中使用刚刚编写好的函数,实现点灯的效果。

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 */ LED_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ led_display(0x88); HAL_Delay(500); led_display(0x44); HAL_Delay(500); led_display(0x00); HAL_Delay(500); } /* USER CODE END 3 */ }
http://www.jsqmd.com/news/446812/

相关文章:

  • 服务端之NestJS中获取完整请求Host的四种封装方式及应用场景、Service与拦截器对比、工具函数、装饰器
  • SAP HANA SQLScript 性能定位的起手式:用支持性工具锁定主导语句与主导算子
  • Cadence
  • 蓝桥杯嵌入式(STM32G431RBT6)入门第一天——点亮LED|CSDN创作打卡
  • Web前端之监听元素的重叠度、设置所有元素的滚动条宽度都为0、节点布局的交叉状态、生成随机图片、阮一峰、标签、IntersectionObserver
  • 【解决】Ping 不是内部或外部命令,也不是可运行的程序或批处理文件
  • Python相关问题
  • 算法---LeetCode 剑指 Offer 26. 树的子结构
  • Web前端之上传文件夹、webkitdirectory
  • 通俗易懂解释知识图谱(Knowledge Graph)
  • Web前端之实现酷炫的仪表进度条、JavaScript动态设置Css属性值、标签元素属性选择器、hsl样式函数
  • 优先队列(priority_queue)总结
  • Web前端之实现累计功能、原生与UniApp版微信小程序两种方式实现、计算、累加、getElementById、innerHTML、Number
  • 在 SAP Kyma 上使用 Redis 服务
  • Web前端之鼠标悬浮,鼠标移入和鼠标移出、getElementById、onmouseover、onmouseout、mouseenter、mouseleave、hover
  • 读懂 Cost-Based Optimization:SAP HANA SQL 优化器如何用成本模型选出更快的执行计划
  • 这才是未来的“openclaw”
  • git 命令总结
  • postpresql 表结构修改、添加字段、外键、主键自增逻辑设置
  • 从扫描到索引:SAP HANA 查询处理路径与优化技巧的落地实战
  • 把运行在 Docker 容器内的 Microsoft SQL 服务器部署到 SAP Kyma 中
  • Python—1、基础篇
  • 读懂 SAP HANA 的 Optimized Logical Plan 与 Optimized Physical Plan:把优化器的思路“看见”
  • 在 SAP BTP Kyma Runtime 上使用 Redis 读取和存储数据
  • [从0开始学Java|第十二天]学生管理系统升级 - 详解
  • 服务端之nestJS常用异常类及封装自定义响应模块
  • ROS 摄像头参数标定
  • OBLITERATUS:解锁大模型无限潜力
  • 会穿搭才是真的美,聪明女人必学的搭配技巧,优雅高级又有气质
  • 为macOS Finder提供直观的剪切粘贴体验 - 实践