STM32标准库改为HAL库的程序实现

发布时间:2023-09-27  

标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就是使用的HAL库了,而参考资料是标准库的,就没有办法用。


注意:

1. 标准库与HAL库不兼容,不要想着直接拿来用了,比如标准库使用#include "stm32f10x.h",HAL库使用#include "stm32f1xx_hal.h"

要让标准库程序使用HAL库时也可以正常运行得到想要的结果,有以下几种方法:

一、 将标准库程序中的每个函数内的代码修改为使用HAL库且同样效果的代码,

比如标准库中配置GPIO的代码直接就可以用STM32CubeMx配置为相同效果

二、根据标准库程序整个程序运行的原理使用HAL库中提供的函数实现,

比如使用IIC写入内存的代码可以使用HAL库中提供的函数HAL_I2C_Mem_Write
实现


先举例介绍第一种方法:

1. 外部中断

标准库:中断入口函数在stm32f10x_it.c中,修改void EXTI&_IRQHandler()

使用if(EXTI_GetITStatus(EXTI_Line2)==SET)判断是否产生中断

处理中断时,要清除中断线路挂起位(EXTI_ClearITPendingBit),以便下次使用

HAL库:在stm32f1xx_it.c中依然有中断入口函数void EXTI2_IRQHandler(void)

该函数调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);,当该引脚产生中断事件时会调用该函数

最后会由HAL_GPIO_EXTI_Callback(GPIO_Pin);回调函数执行中断,该函数是可以被重定义的,复制该函数添加到main.c中就可以进行特定引脚的中断事件处理

在HAL库的回调函数和标准库的中断入口函数中的中断事件执行是差不多的

2. 引脚操作

51、STM32的标准库和HAL库对引脚都有基本的读取引脚状态和设置引脚的操作

51:P0  = 0x00; //置P0口为低电平,P08个IO口全为低电平

P0  = 0xff; //置P0口为高电平

注意P0有8个IO口,即从P0.0到P0.7,而0x00二进制就是0000 0000,效果就是P0.0到P0.7都是0,即低电平。

P0 = 0xC8;

51可以实现直接将八位二进制直接传递给8个IO口,只需一次传值;也可以单独对某个IO口设置,但HAL库只能一次对一个引脚操作

标准库:GPIO_SetBits(GPIOC,GPIO_Pin_All);将引脚置1,可以将多个引脚一起设置使用GPIOx->BSRR = GPIO_Pin;

GPIO_ResetBits(GPIOC,GPIO_Pin_All);将引脚置0,使用GPIOx->BRR = GPIO_Pin;

GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)读取引脚状态

HAL库:所有GPIO的操作函数在stm32f1xx_hal_gpio.h中,也定义了一些GPIO设置用到的参数

具体函数见stm32f1xx_hal_gpio.h,功能和标准库大致相同,有一个引脚反转函数HAL_GPIO_TogglePin

问题:如何使用HAL库实现向多个引脚写入八位十六进制数据?

51:cmd = 0xc8;

PC = cmd;

HAL库:cmd = 0xc8;

if(cmd&0x01)

{

HAL_GPIO_WritePin(GPIOC,D0_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D0_Pin,GPIO_PIN_RESET);

}

if(cmd&0x02)

{

HAL_GPIO_WritePin(GPIOC,D1_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D1_Pin,GPIO_PIN_RESET);

}

if(cmd&0x04)

{

HAL_GPIO_WritePin(GPIOC,D2_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D2_Pin,GPIO_PIN_RESET);

}

if(cmd&0x08)

{

HAL_GPIO_WritePin(GPIOC,D3_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D3_Pin,GPIO_PIN_RESET);

}

if(cmd&0x10)

{

HAL_GPIO_WritePin(GPIOC,D4_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D4_Pin,GPIO_PIN_RESET);

}

if(cmd&0x20)

{

HAL_GPIO_WritePin(GPIOC,D5_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D5_Pin,GPIO_PIN_RESET);

}

if(cmd&0x40)

{

HAL_GPIO_WritePin(GPIOC,D6_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D6_Pin,GPIO_PIN_RESET);

}

if(cmd&0x80)

{

HAL_GPIO_WritePin(GPIOC,D7_Pin,GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOC,D7_Pin,GPIO_PIN_RESET);

}

这个方法比较笨,是使用与运算直接判断八位二进制数据的各位是0还是1,然后设置相应引脚即可。

3. 直接操作寄存器

这个在标准库和HAL库中的使用是一样的,

标准库:例如 #define IIC_SDA_IN()  {GPIOB->CRH &= 0XFFFF0FFF;GPIOB->CRH |= 8 << 12;GPIOB->BSRR = 1 << 11;}

其中GPIOB是在stm32f10x.h中定义的,其中BSRR、CRH等是GPIO结构体中的属性,结构体为:

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

HAL库:例如  #define LCD_RST_CLR GPIOC->BRR=1<<5

其中GPIOC是在stm32f103xe.h中定义的,BSRR,BRR等GPIO结构体的属性也是在该文件中定义的,具体结构体为:

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

与标准库的GPIO结构体定义相同。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    -8-1《晶硅光伏组件用导电胶测试程序-第一部分:材料性能测试》国际标准正式发布。这项标准的成功制定和发布,不仅彰显了阿特斯在光伏领域国际标准制定中的影响力和话语权,也为......
    —202X《用于第三象限续流的氮化镓高电子迁移率晶体管动态导通电阻测试方法》已形成委员会草案,两项标准委员会草案按照CASAS标准制定程序,反复斟酌、修改、编制而成。起草......
    式清洁能源制氢接入电网、规模化离网制氢等领域制定相关标准。氢储运方面,重点围绕高压气态、低温液态、固体材料等储氢领域制定相关标准,同步开展氢气安全运输、管道掺/运氢等领域的标准制定。氢加注方面,重点围绕加氢站(含制......
    安全、数据安全等其他领域的概念也作为重点被引入。 上文我们提到的若干强制性标准就是这种关切的一个体现。 最后是针对不同的技术路线角度,也有相应的标准制定计划,比如与车路协同相关的网联通信、卫星......
    机构。在过去50余年间,JEDEC所制定的标准为全行业所接受和采纳。作为一个全球性组织,JEDEC的会员构成是跨国性的。JEDEC不隶属于任何一个国家或政府实体。JEDEC的标准制定程序......
    的标准制定程序使生产商与供应商齐聚一堂,通过50个委员会和分委员会来完成制定标准的使命,以满足多样化的产业发展与技术需要。JEDEC拥有近300家会员公司,包括业内几乎所有前100家公司。在JEDEC......
    组织中的参与和领导地位。 规则指出,无论“实体清单”上的名单是否是标准制定的成员或参与成员,对“技术”是否适用于EAR的评估都是相同的。鉴于美国在标准......
    ,推动标准的实施应用。聚焦集成电路产业发展紧迫需求,加强统筹谋划,强化国内外标准协同发展,打造覆盖全产业链的标准化体系。广泛动员产业链各环节参与标准化工作,加快集成电路核心关键领域标准制定......
    、行业标准的技术管理,对外代表中国参与联合国及其他国际汽车标准的法规协调及制定。未来将聚焦10余项汽车前瞻技术的标准化研究,推动制定80余项新标准项目。与汽车产业发达国家及“一带一路”沿线国家开展的国际汽车标准制定......
    修订和外文版项目计划》下达任务,2019年5月启动,历时24个月。规定用于在线检测管道输送液体介质过程中产生的静电电荷的电荷密度检测方法,以实现易燃液体运输的安全关口前移。深度参与标准制定 助力......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>