精华内容
参与话题
问答
  • 移植

    2014-12-01 16:10:47
    移植的基本概念:  移植是指将软件从一个平台迁移到另一个平台  * 从一个硬件平台移植到另一个硬件平台  * 从一个操作系统移植到另一个操作系统  * 从一种软件库环境移植到另一个软件库环境  软件进行移植...
    移植的基本概念:
      移植是指将软件从一个平台迁移到另一个平台
      * 从一个硬件平台移植到另一个硬件平台
      * 从一个操作系统移植到另一个操作系统
      * 从一种软件库环境移植到另一个软件库环境
      软件进行移植的容易程度即可移植性
      Linux硬件平台:
      在Linux内核里,每一个处理器指令集对应一个独立的体系结构architecture,比如alpha, arm,i386, mips, ppc
      每个体系结构可以有若干变种variant,或不同配置的硬件machine
      统称sub-architecture。以arm体系结构举例
      * variants 包括arm7tdmi, arm926ejs, strongarm,xscale
      * machine 包括edb7312, smdk2410, omap-h2
      硬件平台对C程序的影响:
      处理器字长,定义为处理器一次能处理的数据位数。
      字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断
      处理器字长会影响int, long等C类型的长度
      C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型u8, s8, u16, s16, u32, s32, u64, s64
      数据对齐:
      数据对齐是指数据块的地址是某个特定大小的整数倍
      * 32位处理器字对齐n*4
      * 页对齐n*PAGESIZE
      * Cache line对齐n*CLINESIZE
      数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子
      * char a[10];
      * unsigned long* pl = (unsigned long *)(a+1);
      * unsigned l = *pl;
      字节顺序:
      字节顺序byte order是指一个字中字节排列的顺序
      不同硬件可能采用不同byte order
      *  x86 little-endian
      *  ppc big-endian
      Linux内核将硬件的byte order放在<asm/byteorder.h> 里面定义,__BIG_ENDIAN或__LITTLE_ENDIAN
      在include/linux/byteorder /里面有几个头文件,定义了
      *  u23 __cpu_to_be32(u32);
      *  u32 __cpu_to_le32(u32);
      *  u32 __be32_to_cpu(u32);
      *  u32 __le32_to_cpus(u32);
      时间:
      软件中的与时间相关的代码也会影响移植
      采用平台无关的时间表达方法可以提高代码可移植性
      Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的
      *  HZ
      *  (2*HZ)
      *  (HZ/2)
      *  (HZ/100)
      *  (2*HZ/100)
    展开全文
  • 移植

    2016-06-19 23:18:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
    展开全文
  • qt 移植(arm-linux)

    千次阅读 2018-08-06 21:25:07
    学习嵌入式Linux也有一段时间了,最近在弄qt的移植,一个下午搞定(电脑编译太慢了 》==《 ),我来大概介绍下移植步骤: 一. 环境 linux主机:ubutun 16 开发板:mini2440 内核 : linux 3.4.2 busybox :...

    学习嵌入式Linux也有一段时间了,最近在弄qt的移植,一个下午搞定(电脑编译太慢了  》==《  ),我来大概介绍下移植步骤:

    一.  环境

    linux主机:ubutun 16

    开发板:mini2440

    内核    : linux 3.4.2

    busybox :1.20

    qt版本:4.8.5

    二.  移植步骤

    移植QT的前提,首先你的开发板带有lcd驱动,触摸屏驱动并把这两个驱动编译进内核,这两个驱动可以参考韦老师去自己写,然后移植tslib,最后移植qt系统。总结下:

    a.写lcd驱动(当然如果板子已经有就不用写了) 

    b. .写触摸屏驱动(当然如果板子已经有就不用写了) 

    c.移植tslib 

     d.移植QT

     

    1.写lcd驱动,这个可以参考韦老师的驱动,但是有一点注意要注意

    比如:lcd_regs->lcdcon3=(37<<19) | (239<<8) | (10<<0);     我刚开始设置不对,然后发现屏幕显示左移了。所以驱动要根据自己的显示屏去设置,看看手册,要调。

    2.触摸屏驱动,这一部分完全可以参考韦老师的驱动,了解输入子系统,以及ADC误差消除。

    3.tslib移植

    如果你的linux服务器是比较高的版本(我的是ubutun16)就得安装几个库,这样才能配置编译tslib

    # apt-get install autoconf(或autoconf2.13)
    # apt-get install automake
    # apt-get install libtool

    网上下载 tslib-1.4.tar.gz,拷贝到linux服务器,

    然后解压缩     tar xzf tslib-1.4.tar.gz   ,   进入解压后的目录 cd tslib   ,执行其内部脚本./autogen.sh  ,创建一个目录mkdir tmp,待会我们安装到这个目录tmp,  执行echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache 再执行./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp  。

    如果你用的编译版本和我一样,编译器要修改一点东西:把   /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h  里的   #define EV_VERSION       0x010000改为   #define EV_VERSION     0x010001。不然编译后的tslib不能用。

    现在make编译   然后make install  .安装结束后进入tmp目录  执行 cp * -rf   /开发板文件系统根目录(我的是/work/nfsroot/min_fs)。

    在开发板串口控制台,修改/etc/ts.conf  (去掉#和空格): 

    # module_raw input
    改为:
    module_raw input

    修改/etc/profile文件添加下面几句话:

    export TSLIB_ROOT=/                                  #刚刚我是把tmp的目录拷贝到开发板文件根目录 /
    export TSLIB_TSDEVICE=/dev/event0         #  这个是我触摸屏上报事件对于的设备文件节点,根据实际情况填您自己的。
    export QWS_MOUSE_PROTO=tslib:/dev/event0
    export TSLIB_CALIBFILE=/etc/pointercal   
    export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf    
    export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts  
    export TSLIB_FBDEVICE=/dev/fb0      #这个是我lcd驱动对应的设备文件节点,根据实际情况填您自己的
    export TSLIB_CONSOLEDEVICE=none   
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

    输入ts_calibrate  ,就会进入校准界面,此时tslib就移植完成。

    4.QT移植

    下载QT4.8.5源码  qt-everywhere-opensource-src-5.6.0.tar 

    把它放到linux服务器解压tar zxvf qt-everywhere-opensource-src-5.6.0.tar

    进入刚解压的qt-everywhere-opensource-src-5.6.0目录 ,vi mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf  修改编译参数,不然可能编译报错

    我的qmake.conf被修改为:

    include(../../common/linux.conf)
    include(../../common/gcc-base-unix.conf)
    include(../../common/g++-unix.conf)
    include(../../common/qws.conf)


    QMAKE_INCDIR=/work/tools/tslib/tmp/include
    QMAKE_LIBDIR=/work/tools/tslib/tmp/lib

    # modifications to g++.conf
    QMAKE_CC                = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -lts
    QMAKE_CXX               = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts
    QMAKE_LINK              = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts
    QMAKE_LINK_SHLIB        = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts

    # modifications to linux.conf
    QMAKE_AR                = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-objcopy
    QMAKE_STRIP             = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-strip
    QMAKE_CFLAGS           += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
    QMAKE_CXXFLAGS         += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t

    然后配置./configure -prefix /usr/local/QT4.8.5-ARM-mini2440/ -force-pkg-config -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -depths 16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -qt-mouse-tslib -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -I/opt/tslib/tmp/include -L/opt/tslib/tmp/lib

    其中/usr/local/QT4.8.5-ARM-mini2440/来表达编译linux服务器哪个目录下,

    其中-I/opt/tslib/tmp/include,您刚刚不是在linux服务器编译了tslib  ,并且生成tmp目录吗,这里就是用这个tmp目录的子目录include来头文件。

    其中-I/opt/tslib/tmp/lib,您刚刚不是在linux服务器编译了tslib  ,并且生成tmp目录吗,这里就是用这个tmp目录的子目录lib来编译。

    然后编译sudo  make -j3     开3个线程 ,我话了2个小时,是个人电脑配置而定

    安装  make install ,默认是按安装到  /usr/local/Trolltech/  ,进入目录  ,你会发现有以下文件:

    bin/    demos/     examples/     imports/      include/      lib/          mkspecs/      plugins/      translations/

    把plugins,imports,lib,mkspecs复制到开发板某个目录下,我是把它们拷贝到 /opt/qte目录,还要拷贝 demos目录到开发板根目录,这个目录有些QT例子,我们待会就用来测试

    在开发板串口控制台,修改/etc/ profile 文件,我最后的内容如下:

    #tslib

    export TSLIB_ROOT=/
    export TSLIB_TSDEVICE=/dev/event0
    export QWS_MOUSE_PROTO=tslib:/dev/event0
    export TSLIB_CALIBFILE=/etc/pointercal   
    export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf    
    export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts  
    export TSLIB_FBDEVICE=/dev/fb0   
    export TSLIB_CONSOLEDEVICE=none   
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

    #QT

    export QTDIR=/opt/qte                              #刚才我把plugins,imports,lib,mkspecs拷贝到这的
    export QPEDIR=/opt/qte                          
    export PATH=$QTDIR/bin:$PATH
    export QWS_DISPLAY=LinuxFb:/dev/fb0        #我显示屏对应的设备文件节点
    export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH

     

     

    最后我们就看看我们的成果了:

    进入demo目录,里面有很多测试程序  我就拿mainwindow程序来测试吧

    进入mainwindows   ,执行  ./mainwindow -qws

    就会看到结果了。

     

    sss

      

     

     

     

    QT就移植可以用了,喜欢我的博客,麻烦关注下,一起学习进步。我会把用到的资料发布出来。

     

     

         

     

     

     

     

     

     

     

     

     

    展开全文
  • STM32 之二 HAL库详解 及 手动移植

    万次阅读 多人点赞 2017-02-15 18:41:23
    2018.1.19 更新其中的错误部分 HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅...
    • 2018.1.19 更新其中的错误部分

    HAL库结构

      说到 STM32 的 HAL 库,就不得不提 STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX 就是以 HAL 库为基础的,且目前仅支持 HAL 库及 LL 库!首先看一下,官方给出的 HAL 库的包含结构:

    SouthEast
    • stm32f2xx.h 主要包含STM32同系列芯片的不同具体型号的定义,是否使用HAL库等的定义,接着,其会根据定义的芯片信号包含具体的芯片型号的头文件:
    #if defined(STM32F205xx)
      #include "stm32f205xx.h"
    #elif defined(STM32F215xx)
      #include "stm32f215xx.h"
    #elif defined(STM32F207xx)
      #include "stm32f207xx.h"
    #elif defined(STM32F217xx)
      #include "stm32f217xx.h"
    #else
     #error "Please select first the target STM32F2xx device used in your application (in stm32f2xx.h file)"
    #endif
    

    紧接着,其会包含 stm32f2xx_hal.h

    • stm32f2xx_hal.hstm32f2xx_hal.c/h 主要实现HAL库的初始化、系统滴答相关函数、及CPU的调试模式配置
    • stm32f2xx_hal_conf.h :该文件是一个用户级别的配置文件,用来实现对HAL库的裁剪,其位于用户文件目录,不要放在库目录中。

      接下来对于HAL库的源码文件进行一下说明,HAL库文件名均以stm32f2xx_hal开头,后面加上_外设或者模块名(如:stm32f2xx_hal_adc.c):

    库文件:
    	stm32f2xx_hal_ppp.c/.h			// 主要的外设或者模块的驱动源文件,包含了该外设的通用API
    	stm32f2xx_hal_ppp_ex.c/.h		// 外围设备或模块驱动程序的扩展文件。这组文件中包含特定型号或者系列的芯片的特殊API。以及如果该特定的芯片内部有不同的实现方式,则该文件中的特殊API将覆盖_ppp中的通用API。
    	stm32f2xx_hal.c/.h				// 此文件用于HAL初始化,并且包含DBGMCU、重映射和基于systick的时间延迟等相关的API
    	其他库文件
    用户级别文件:
    	stm32f2xx_hal_msp_template.c	// 只有.c没有.h。它包含用户应用程序中使用的外设的MSP初始化和反初始化(主程序和回调函数)。使用者复制到自己目录下使用模板。
    	stm32f2xx_hal_conf_template.h	// 用户级别的库配置文件模板。使用者复制到自己目录下使用
    	system_stm32f2xx.c				// 此文件主要包含SystemInit()函数,该函数在刚复位及跳到main之前的启动过程中被调用。 **它不在启动时配置系统时钟(与标准库相反)**。 时钟的配置在用户文件中使用HAL API来完成。
    	startup_stm32f2xx.s				// 芯片启动文件,主要包含堆栈定义,终端向量表等
    	stm32f2xx_it.c/.h				// 中断处理函数的相关实现
    	main.c/.h						//
    

      根据HAL库的命名规则,其API可以分为以下三大类:

    • 初始化/反初始化函数: HAL_PPP_Init(), HAL_PPP_DeInit()
    • IO 操作函数: HAL_PPP_Read(), HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive()
    • 控制函数: HAL_PPP_Set (), HAL_PPP_Get ().
    • 状态和错误: HAL_PPP_GetState (), HAL_PPP_GetError ().

    注意:

    1. 目前 LL 库是和 HAL 库捆绑发布的,所以在 HAL 库源码中,还有一些名为 stm32f2xx_ll_ppp 的源码文件,这些文件就是新增的LL库文件。
    2. 使用 CubeMX 生产项目时,可以选择LL库

    HAL 库最大的特点就是对底层进行了抽象。在此结构下,用户代码的处理主要分为三部分:

    • 处理外设句柄(实现用户功能)
    • 处理MSP
    • 处理各种回调函数

    外设句柄定义

      用户代码的第一大部分:对于外设句柄的处理。 HAL库在结构上,对每个外设抽象成了一个称为ppp_HandleTypeDef的结构体,其中ppp就是每个外设的名字。*所有的函数都是工作在ppp_HandleTypeDef指针之下。
      1. 多实例支持:每个外设/模块实例都有自己的句柄。 因此,实例资源是独立的
      2. 外围进程相互通信:该句柄用于管理进程例程之间的共享数据资源。
    下面,以 ADC 为例

    /** 
     * @brief  ADC handle Structure definition
     */ 
    typedef struct
    {
    	ADC_TypeDef                   *Instance;                   /*!< Register base address */
    	ADC_InitTypeDef               Init;                        /*!< ADC required parameters */
      __IO uint32_t                 NbrOfCurrentConversionRank;  /*!< ADC number of current conversion rank */
    	DMA_HandleTypeDef             *DMA_Handle;                 /*!< Pointer DMA Handler */
    	HAL_LockTypeDef               Lock;                        /*!< ADC locking object */
    	__IO uint32_t                 State;                       /*!< ADC communication state */
    	__IO uint32_t                 ErrorCode;                   /*!< ADC Error code */
    }ADC_HandleTypeDef;
    

      从上面的定义可以看出,ADC_HandleTypeDef中包含了ADC可能出现的所有定义,对于用户想要使用ADC只要定义一个ADC_HandleTypeDef的变量,给每个变量赋好值,对应的外设就抽象完了。接下来就是具体使用了。
      当然,对于那些共享型外设或者说系统外设来说,他们不需要进行以上这样的抽象,这些部分与原来的标准外设库函数基本一样。 例如以下外设:
      - GPIO
      - SYSTICK
      - NVIC
      - RCC
      - FLASH
    以 GPIO 为例,对于 HAL_GPIO_Init() 函数,其只需要 GPIO 地址以及其初始化参数即可。

    三种编程方式

      HAL库对所有的函数模型也进行了统一。在HAL库中,支持三种编程模式:轮询模式、中断模式、DMA模式(如果外设支持)。其分别对应如下三种类型的函数(以ADC为例):

    HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
    HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
    
    HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
    HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
    
    HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
    HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
    

      其中,带_IT的表示工作在中断模式下;带_DMA的工作在DMA模式下(注意:DMA模式下也是开中断的);什么都没带的就是轮询模式(没有开启中断的)。至于使用者使用何种方式,就看自己的选择了。
      此外,新的HAL库架构下统一采用宏的形式对各种中断等进行配置(原来标准外设库一般都是各种函数)。针对每种外设主要由以下宏:

    • __HAL_PPP_ENABLE_IT(__HANDLE__, __INTERRUPT__): 使能一个指定的外设中断
    • __HAL_PPP_DISABLE_IT(__HANDLE__, __INTERRUPT__):失能一个指定的外设中断
    • __HAL_PPP_GET_IT (__HANDLE__, __ INTERRUPT __):获得一个指定的外设中断状态
    • __HAL_PPP_CLEAR_IT (__HANDLE__, __ INTERRUPT __):清除一个指定的外设的中断状态
    • __HAL_PPP_GET_FLAG (__HANDLE__, __FLAG__):获取一个指定的外设的标志状态
    • __HAL_PPP_CLEAR_FLAG (__HANDLE__, __FLAG__):清除一个指定的外设的标志状态
    • __HAL_PPP_ENABLE(__HANDLE__) :使能外设
    • __HAL_PPP_DISABLE(__HANDLE__) :失能外设
    • __HAL_PPP_XXXX (__HANDLE__, __PARAM__) :指定外设的宏定义
    • __HAL_PPP_GET_ IT_SOURCE (__HANDLE__, __ INTERRUPT __):检查中断源

    三大回调函数

      在 HAL 库的源码中,到处可见一些以__weak开头的函数,而且这些函数,有些已经被实现了,比如:

    __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
    {
    	/*Configure the SysTick to have interrupt in 1ms time basis*/
    	HAL_SYSTICK_Config(SystemCoreClock/1000U);
    	/*Configure the SysTick IRQ priority */
    	HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);
    	/* Return function status */
    	return HAL_OK;
    }
    

    有些则没有被实现,例如:

    __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
    {
      /* Prevent unused argument(s) compilation warning */
      UNUSED(hspi);
      /* NOTE : This function should not be modified, when the callback is needed,the HAL_SPI_TxCpltCallback should be implemented in the user file
      */
    }
    

    所有带有__weak关键字的函数表示,就可以由用户自己来实现。如果出现了同名函数,且不带__weak关键字,那么连接器就会采用外部实现的同名函数。通常来说,HAL库负责整个处理和MCU外设的处理逻辑,并将必要部分以回调函数的形式给出到用户,用户只需要在对应的回调函数中做修改即可。 HAL 库包含如下三种用户级别回调函数(PPP为外设名):
      1. 外设系统级初始化/解除初始化回调函数(用户代码的第二大部分:对于MSP的处理):HAL_PPP_MspInit()HAL_PPP_MspDeInit** 例如:__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)。在HAL_PPP_Init() 函数中被调用,用来初始化底层相关的设备(GPIOs, clock, DMA, interrupt)

      2. 处理完成回调函数:HAL_PPP_ProcessCpltCallback*(Process指具体某种处理,如UART的Tx),例如:__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)。当外设或者DMA工作完成后时,触发中断,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用

      3. 错误处理回调函数:HAL_PPP_ErrorCallback例如:__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)**。当外设或者DMA出现错误时,触发终端,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用

    1. 绝大多数用户代码均在以上三大回调函数中实现。
    2. HAL库结构中,在每次初始化前(尤其是在多次调用初始化前),先调用对应的反初始化(DeInit)函数是非常有必要的。某些外设多次初始化时不调用返回会导致初始化失败。
    3. 完成回调函数有多中,例如串口的完成回调函数有HAL_UART_TxCpltCallback 和 HAL_UART_TxHalfCpltCallback
    4. (用户代码的第三大部分:对于上面第二点和第三点的各种回调函数的处理)
    5. 在实际使用中,发现HAL仍有不少问题,例如在使用USB时,其库配置存在问题

    HAL库移植使用

    基本步骤

    1. 复制stm32f2xx_hal_msp_template.c,参照该模板,依次实现用到的外设的HAL_PPP_MspInit()HAL_PPP_MspDeInit
    2. 复制stm32f2xx_hal_conf_template.h,用户可以在此文件中自由裁剪,配置HAL库。
    3. 在使用HAL库时,必须先调用函数:HAL_StatusTypeDef HAL_Init(void)(该函数在stm32f2xx_hal.c中定义,也就意味着第一点中,必须首先实现HAL_MspInit(void)HAL_MspDeInit(void)
    4. HAL库与STD库不同,HAL库使用RCC中的函数来配置系统时钟,用户需要单独写时钟配置函数(STD库默认在system_stm32f2xx.c中)
    5. 关于中断,HAL提供了中断处理函数,只需要调用HAL提供的中断处理函数。用户自己的代码,不建议先写到中断中,而应该写到HAL提供的回调函数中。
    6. 对于每一个外设,HAL都提供了回调函数,回调函数用来实现用户自己的代码。整个调用结构由HAL库自己完成。例如:Uart中,HAL提供了void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);函数,用户只需要触发中断后,用户只需要调用该函数即可,同时,自己的代码写在对应的回调函数中即可!如下:
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
    void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
    

    使用了哪种就用哪个回调函数即可!

    基本结构

      综上所述,使用HAL库编写程序(针对某个外设)的基本结构(以串口为例)如下:

    1. 配置外设句柄 例如,建立UartConfig.c,在其中定义串口句柄 UART_HandleTypeDef huart;,接着使用初始化句柄(HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart))
    2. 编写Msp 例如,建立UartMsp.c,在其中实现void HAL_UART_MspInit(UART_HandleTypeDef* huart) 和 void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
    3. 实现对应的回调函数 例如,建立UartCallBack.c,在其中实现上文所说明的三大回调函数中的完成回调函数错误回调函数

    至此,HAL库的总体结构就介绍完了!具体的每个文件的详细说明,官方源码注释很详细!

    参考文档

    • ST - Description of STM32F4 HAL and LL drivers.pdf
    • ST - en.stm32_embedded_software_offering.pdf
    展开全文
  • 目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtopia ,但是目前 Qt 已经发展到最新的 5.7 版本了,我个人也已经使用了很长一段时间的 qt5.6 for windows ,本文就来介绍一下QT在嵌入式环境的...
  • stm32f103rct6的代码移植到stm32f103c8t6

    万次阅读 2019-10-04 20:48:25
    目前市面上见的较多的STM32单片机一般都是开发板...同时这些STM32单片机的基础的库基本都是一样的,因此理论上来说,应该是可以进行移植的,博主今天来分享一下代码移植的方法。本次采用stm32f103rct6的代码移植到st...
  • 移植opencv到嵌入式arm详细过程

    万次阅读 多人点赞 2017-11-29 16:47:46
    所以,2017年末,记录了此次移植过程,移植版本比较新的可以看过来,可以让你少走弯路。 为了这东西,逃了两次云计算的课,都被抓到了。伤,,,,,,废话不多说,开搞: opencv,计算机视觉库。 openCV 2.2以后...
  • 就编程而言,可移植性意味着什么?

    万次阅读 2019-11-08 16:44:27
    要想了解可移植性必须要知道:1.什么是程序?2.什么是系统平台? 什么是程序 首先,我们得知道程序的本质是什么?程序的本质就是一连串能被CPU识别并执行的有0、1代码组成的指令即目标代码(0、1组成的代码)。...
  • linux系统移植步骤

    万次阅读 多人点赞 2018-07-13 22:52:08
    性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。 嵌入式Linux系统...
  • 【ARM】Linux驱动移植

    千次阅读 2017-06-06 21:59:09
    1驱动模块移植过程 1模块的第一种编译方法改kconfig 2模块的第二种编译方法Makefile 2Linux驱动原理 0从哪里切入 1什么是注册 2register_chrdev提交哪些数据 21设备号为什么是231 22设备名随便给 23文件...
  • wince 移植

    千次阅读 2011-08-22 20:47:03
    近期,公司让我负责一个嵌入式消费产品的开发项目。此产品原来的操作系统是WinCE 5.0,现在因应市场需求不但要增加功能更加强大的硬件,而且公司也要求把操作系统升级为WinCE 6.0。在接手此项目后,我立即开始进行...
  • FreeRTOS移植——基于stm32f1

    千次阅读 2019-01-30 13:59:10
    移植之前,我们首先要获取到FreeRTOS的官方的源码包。这里我们提供两个下载链接: 一个是官网:http://www.freertos.org/, 另外一个是代码托管网站:...
  • 嵌入式Linux系统移植的四大步骤

    千次阅读 多人点赞 2018-08-25 20:34:28
    最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的...
  • UCOS2_STM32F1移植详细过程(一)

    万次阅读 多人点赞 2016-06-26 09:14:48
    推荐 分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:https://www.strongerhuang.com ......
  • 每当我闲下来时不发Rom时,就会整理一下思路,发发教程啥的,我觉得能带动机油们自己打造、改造Rom,共同提升,才是Romer的追求。 ... ... ...好了,闲话少说,上教程。...注:可能你会觉得文字教程比较干枯,不够形象生动,...
  • 嵌入式Linux系统移植的四大步骤

    万次阅读 多人点赞 2017-06-05 10:30:25
    最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的...
  • FreeRTOS系列第3篇---FreeRTOS移植指南

    万次阅读 多人点赞 2015-11-21 08:51:29
    FreeRTOS下载包中已经包含很多演示例程- 每一个例程都是针对于: 特定的微控制器;特定的开发工具(编译器、调试器等等);特定的硬件平台(样机或评估板)。  可以在官方网站首页左侧的树形菜单 'Supported ...
  • 之前已经把uboot,内核,文件系统,都移植好了,今天开始我们把第二期写的Linux2.6.22.6内核的驱动程序全部移植到我们新3.4.2内核中去。首先移植网卡驱动程序吧,因为,我们后面需要用到网络文件系统来更简便的学习...
  • 代码移植

    千次阅读 2016-07-05 17:27:42
    准备工作: 首先是一些准备工作,在Windows平台上面安装上Cygwin的最新版本,在Cygwin中安装好GCC等开发工具。 同样也需要一个Windows开发环境。可以使用最新版本Visual Studio, Microsoft Visual ...
  • linux代码移植到windows

    千次阅读 2013-11-05 09:52:55
    如果想要使用完整的代码,就要做移植工作。因为C/C++ Library的不同和其他的一些原因,移植C/C++代码是一项困难的工作。本文将以一个实际的例子(Tar)来说明如何把Linux代码移植到Windows平台上。移植过程将尽量少...

空空如也

1 2 3 4 5 ... 20
收藏数 497,034
精华内容 198,813
关键字:

移植