stm32代码_stm32应用-1:led控制的代码优化

大家好,我是鼎!

628f1ace34b23cff49574d5fc6098584.png

前言

点亮LED对于任何控制来说,都是基础中的基础,就像编程中的HELLO WORLD,但是从便于移植,逻辑清晰的角度来讲,写好它还是需要一定的功力的。这一篇也是借鉴硬石的代码,进行剖析,转化!

.h文件编写与分析

1.首先进行IO部分宏定义,方便以后移植与更换IO(为避免不必要的重复,只放了LED1部分,LED2和LED3类似)

#define LED1_RCC_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE()

#define LED1_GPIO_PIN GPIO_PIN_9

#define LED1_GPIO GPIOH

#define LED1_ON HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_SET)

// 输出高电平

#define LED1_OFF HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_RESET)

// 输出低电平

#define LED1_TOGGLE HAL_GPIO_TogglePin(LED1_GPIO,LED1_GPIO_PIN)

// 输出反转

2.定义一个枚举类型,定义控制LED变化状态,这里我们只定义了LED开(1),LED关(0),LED翻转(2)三种形态

typedef enum//定义LED状态

{

LED_OFF = 0,

LED_ON = 1,

LED_TOGGLE = 2,

}LEDState_TypeDef;

3.加入一个宏定义,作为LED状态的合法检测,应用了带参数的宏定义

#define IS_LED_STATE(STATE) (((STATE) == LED_OFF) || ((STATE) == LED_ON) || ((STATE) == LED_TOGGLE))

4.定义一个uint8_t,置1代表LED配置标志(作用看后续说明)

#define LED1 (uint8_t)0x01 // 00000001

#define LED2 (uint8_t)0x02//00000010

#define LED3 (uint8_t)0x04//00000100

5.加入一个宏定义,作为LED的合法检测,应用了带参数的宏定义

#define IS_LED_TYPEDEF(LED) (((LED) == LED1) || ((LED) == LED2) || ((LED) == LED3))

.c文件编写与分析

1.此处代码是对LED对应IO的配置(为避免不必要的重复,此处只放了LED1)

void LED_GPIO_Init(void)

{

/* 定义IO硬件初始化结构体变量 */

GPIO_InitTypeDef GPIO_InitStruct;

/* 使能(开启)LED引脚对应IO端口时钟 */

LED1_RCC_CLK_ENABLE();

LED2_RCC_CLK_ENABLE();

LED3_RCC_CLK_ENABLE();

/* 配置LED1引脚输出电压 */

HAL_GPIO_WritePin(LED1_GPIO, LED1_GPIO_PIN, GPIO_PIN_RESET);

/* 配置LED2引脚输出电压 */

HAL_GPIO_WritePin(LED2_GPIO, LED2_GPIO_PIN, GPIO_PIN_RESET);

/* 配置LED3引脚输出电压 */

HAL_GPIO_WritePin(LED2_GPIO, LED3_GPIO_PIN, GPIO_PIN_RESET);

/* 设定LED1对应引脚IO编号 */

GPIO_InitStruct.Pin = LED1_GPIO_PIN;

/* 设定LED1对应引脚IO为输出模式 */

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

/* 设定LED1对应引脚IO操作速度 */

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

/* 初始化LED1对应引脚IO */

HAL_GPIO_Init(LED1_GPIO, &GPIO_InitStruct);

}

2.此处代码为设置LED的代码,里面的思想很重要

函数功能: 设置板载LED灯的状态

输入参数: LEDx:其中x可甚至为(1,2,3)用来选择对应的LED灯

state:设置LED灯的输出状态。

可选值: LED_OFF:LED灯灭

LED_ON:LED灯亮

LED_TOGGLE:反转LED

void LEDx_StateSet(uint8_t LEDx,LEDState_TypeDef state)

{

/* 检查输入参数是否合法 */

assert_param(IS_LED_TYPEDEF(LEDx));

assert_param(IS_LED_STATE(state));

/* 判断设置的LED灯状态,如果设置为LED灯灭 */

if(state==LED_OFF)

{

if(LEDx & LED1)

LED1_OFF;/* LED1灭 */

if(LEDx & LED2)

LED2_OFF;/* LED2灭 */

if(LEDx & LED3)

LED3_OFF;/* LED3灭 */

}

else if(state==LED_ON) /* 设置LED灯为亮 */

{

if(LEDx & LED1)

LED1_ON;/* LED1亮 */

if(LEDx & LED2)

LED2_ON;/* LED2亮 */

if(LEDx & LED3)

LED3_ON;/* LED3亮 */

}

else

{

if(LEDx & LED1)

LED1_TOGGLE;/* 设置引脚输出反转 */

if(LEDx & LED2)

LED2_TOGGLE;/* 设置引脚输出反转 */

if(LEDx & LED3)

LED3_TOGGLE;/* 设置引脚输出反转 */

}

}

总结:其实还是模仿了stm公司标准库的写法,条例清晰,便于扩展!

b1da6398f52b4674cc0ac2fbdde6d1cb.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F1_HAL库使用手册文件是STM32F1系列单片机的编程接口及其应用程序的软件开发包。该手册具有非常详细的介绍和说明,包括HAL库的功能、使用方法、配置及编译软件等多个方面。 首先,该手册详细讲解了STM32F1系列单片机的基本知识,如器件特性、体系结构和系统时钟等。其次,该手册介绍了HAL库的结构、API(应用程序接口)函数,文件和数据类型,并通过代码示例来演示如何使用HAL库进行应用程序的开发。此外,该手册还列出了各类功能实现的驱动库函数。 在使用HAL库进行开发时,手册中提供了充足的文献资料,可以帮助开发人员解决各种问题,例如在编写驱动程序时如何使用HAL中的定时计数器、串口转换器和DMA等。手册中还提供了各种应用示例,如PWM控制、定时器中断、SPI通讯和ADC采集等等,展示了HAL库在各种应用场景下的使用方法。 最后,该手册中还包含了硬件抽象层标准库的配置工具,如CubeMX和STM32工具箱,用于帮助开发人员更为快速地进行底层开发工作,降低了开发成本和时间成本。 综上所述,STM32F1系列单片机的HAL库使用手册文件是非常重要的开发工具。它深入浅出地解释了HAL库如何应用STM32F1系列单片机开发。对于开发人员来说,熟练掌握该手册的内容,可以促进开发过程,提高开发效率。 ### 回答2: stm32f1_hal库是ST公司提供的一种硬件抽象层的库文件,支持对于STM32F1系列的微控制器进行控制并输出操作。这个编程库文件非常适合初学者或者是想要快速地进行STM32F1系列微控制器开发的程序员,因为它提供一种抽象的、高级的、更易于理解的方式来写代码。同时,stm32f1_hal库的使用手册文件非常重要,因为它是学习和使用stm32f1_hal库的关键,提供了详细的操作指南和样例代码stm32f1_hal库使用手册文件包含五个章节:库的概述、库的安装、库的使用、库的例子和库中的附录。第一个章节介绍了stm32f1_hal库的主要特性,这些特性包括高级的外设驱动、支持中斷实时和低功耗模式、易于使用和理解的API等等。 第二个章节讲解了如何在STM32F1系列微控制器中安装该库,此处需要注意的是不同的开发环境安装该库的方法可能不同。 第三个章节是重点所在,讲解了常见的库API及其使用方法,例如初始化外设、读取和写入数据。此处需要注意的是,代码中所调用的API需要根据不同的外设进行调整。 第四个章节列出了一些常见的例子,展示了如何使用stm32f1_hal库来实现不同的功能,例如LED、串口通信、时钟控制等等。 最后一个章节中提供了附录中的内容,为在实际开发中对库API的使用提供支持。总之,stm32f1_hal库使用手册文件是使用STM32F1微控制器开发的重要参考书,值得认真参考。 ### 回答3: stm32f1_hal库是STM32F1系列的外设驱动库。使用手册文件提供了完整的、详细的说明,包含了使用方法、函数及其参数的解释、编程范例等,是程序员使用stm32f1_hal库的重要参考资料。 手册文件主要介绍了STM32F1系列芯片的存储器、时钟、GPIO、中断、USART、SPI、I2C、DMA、ADC、DAC等各种外设的使用方法。通过手册,用户可以了解到如何对寄存器进行初始化,使外设工作正常。手册还提供了各种编程范例,程序员可以根据自己的需求进行调整和优化,大大提高了开发效率。 需要特别提醒的一点是,由于HAL库是由ST官方提供的驱动库,所以不同芯片的HAL库会有一些差别,用户在选择芯片型号后,务必下载对应的版本的手册。另外,由于HAL库是基于底层库的封装,对于一些特殊的需求,或者需要更高的性能的场合,程序员也可以直接使用底层库进行编程。 总之,stm32f1_hal库使用手册文件是STM32F1系列的外设驱动库的重要参考资料。对于初学者来说,掌握使用手册,能够快速地编写STM32F1的应用程序;对于有经验的开发者,可以通过更深入的阅读和理解手册,更好地优化应用程序,提高应用程序的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值