论STM32标准库程序修改为HAL库

标准库占绝大多数,自己买的板子跟的资料也一般是标准库,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结构体定义相同。

待续.........

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容