如何使用hal例程

有错欢迎指正!

一、常识

1、CMSIS:

ARM® Cortex™ 微控制器软件接口标准 (CMSIS) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。CMSIS 可实现与处理器和外设之间的一致且简单的软件接口,从而简化软件的重用,缩短微控制器开发人员新手的学习过程,并缩短新设备的上市时间。

2、BSP:

即板级支持包。通常BSP包是由开发板的公司提供的,它一般包含有一个底层的bootloader,如Das U-Boot,里面实现了少量的设备驱动,如串口,网络等等,用以在加载kernel时用到。它还包括给kernel用的所有的板上设备的驱动程序。有一些供应商BSP甚至还提供了root file system、一个完整的tool chain,用以开发程序、用于系统在运行时的系统配置程序

二、如何熟悉示例工程:

1、肯定要看看文件readme.text。

2、先研究下例程ADC_ContinousConversion_DMA的.c文件的注释

1)common (adj.共有的)
startup py32f00xx.s:进行一些设置和初始化, 再分支到C库中的main, 最终调用main0
system_py32f0xx.c:宏定义外部振荡器的频率值,时钟变量定义,时钟功能配置,初始化微控制器系统,重新定义主函数。

2)Application/User
main.c:主函数。
py32f0xx_hal_msp.c:在此文件编写MCU相关的初始化函数。MSP是指和MCU相关的初始化。
py32f0xx_it.c:中断服务例程,在此添加所用外设的中断处理程序。

3)BSP/py32f003xx_Start_Kit
py32f003xx_Start_Kit.C:包含LED、按钮的GPIO配置,开关操作,状态查询函数,uart串口调试初始化函数。

4)Drivers/PY32F0xx_HAL_Driver
即:驱动程序/普冉公司-32位MCU-普通型(内含003家族)_Hardware Abstraction Layer(抽象印象层)驱动程序。
py32f0xx_hal.c:普冉公司-32位MCU-普通型中各种芯片的可共用HAL API
py32f0xx_hal_rcc.c: 时钟HAL驱动程序。
py32f0xx_hal_rcc_ex.c:扩展时钟HAL驱动程序。
其他类似py32f0xx_hal
??.c的文件都是模/数转换器、比较器、高级控制定时器、实时时钟等模块的HAL驱动程序。

3、先研究下例程ADC_ContinousConversion_DMA的.h文件的注释

我们就不关注之前研究的.c文件所对应的.h文件了,把重点划到其他.h文件上。
cmsis_armcc.h:CMSIS Cortex-M核心函数/指令头文件。
- CMSIS核心寄存器访问函数;
- CMSIS核心指令接口访问专用指令;
- CMSIS SIMD本质访问专用SIMD指令。

core_cm0plus.h:CMSIS Cortex-M0+核心外围访问层头文件。
- CMSIS全局定义;
- CMSIS核心寄存器定义和核心寄存器类型定义;( 核心寄存器包含:核心寄存器;核心NVIC寄存器,核心SCB寄存器,核心SysTick寄存器,核心MPU寄存器。)
- CMSIS核心调试寄存器定义;
- CMSIS核心寄存器位字段宏;
- CMSIS核心基地址定义;
- CMSIS核心NVIC、核心SysTick、核心寄存器访问功能函数。

core_cmFunc.h:CMSIS Cortex-M核心功能访问头文件。
- CMSIS核心寄存器访问函数。(注意:CMSIS函数已在编译器中作为内部函数实现)

core_cmlnstr.h:CMSIS Cortex-M核心指令访问头文件。
- CMSIS核心指令接口访问专用指令。(注意:CMSIS函数已在编译器中作为内部函数实现)

py32f003x8.h:CMSIS Cortex-M0+设备外围访问层头文件。此文件包含PY32F0xx设备的所有外围寄存器定义、位定义和内存映射。
- 外部中断号宏定义;
- CRC、DMA、FLASH等外围设备的结构体定义;

py32f0xx.h:CMSIS PY32F0xx设备外围访问层头文件。

stdint.h:stdint.h是 C99 中引进的一个标准C 库的头文件。

stdio.h:是C语言的标准输入输出函数的头文件。

py32f0xx_ hal_ def. h:包含HAL通用数据类型定义和宏定义

py32f0xx_ hal_conf. h:选择使用hal驱动,就去去掉对应宏的注释

三、移植

知道文件的用途后,我们就知道大概要改和编写些什么了。
就可以使用模板工程,从例程ADC_ContinousConversion_DMA移植所需要的模块。

当然移植需要了解芯片了解例程,如下文件有不同的侧重点,除此之外还有很多芯片公司给出的注意事项:
《PY32F003 datasheet 105℃ Rev.1.0》
《PY32F003 datasheet Rev.1.8》
《PY32F003 Reference manual v1.1》
《PY32F003_HAL样例说明》
实际上,开发包里面的所有文件都要仔细看一边,有的文件甚至要反复熟悉。

四、经验方法

1)特定寄存器的英文缩写

如何看懂手册中平凡出现的关于一些特定寄存器的英文缩写。在目录中找到寄存器描述一项:
在这里插入图片描述
整理一下出现的英文缩写和它对应的含义:
巧了就是寄存器描述一级目录的下一级目录:
16.4.1.TIM1控制寄存器1(TIM1_CR1)
16.4.2.TIM1控制寄存器2(TIM1_CR2)
16.4.3.TIM1从模式控制寄存器(TIM1_SMCR)
16.4.4.TIM1 DMA/中断使能寄存器(TIM1_DIER)
16.4.5.TIM1状态寄存器(TIM1_SR)
16.4.6.TIM1事件产生寄存器(TIM1_EGR)
16.4.7.TIM1捕获/比较模式寄存器1(TIM1_CCMR1)
16.4.8.TIM1捕获/比较模式寄存器
16.4.9.TIM1捕获/比较使能寄存器(TIM1_CCER)
16.4.10.TIM1计算器(TIM1_CNT)
16.4.11.TIM1预分频器(TIM1_PSC)
16.4.12.TIM1自动重新加载寄存器(TIM1_ARR)
16.4.13.TIM1重复计数器寄存器(TIM1_RCR)
16.4.14.TIM1捕获/比较寄存器1(TIM1_CCR1)
16.4.15.TIM1捕捉/比较寄存器2(TIM1_CCR2)
16.4.16.TIM1捕获/比较寄存器3(TIM1_CCR3)
16.4.17.TIM1捕捉/比较寄存器4(TIM1_CCR4)
16.4.18.TIM1刹车和死区寄存器(TIM1_BDTR)
16.4.19.TIM1 DMA控制寄存器(TIM1_DCR)
16.4.20.TIM1连续模式的DMA地址(TIM1_DMAR)
16.4.21.TIM1寄存器映像

2)没有很好移植的例程

可以找到对应的.h文件,在此文件的最下面有.c文件定义好的所以函数的声明。可以知道有些什么可以调用的函数。去对应的.c文件看看每个函数的用法,函数声明一般是一类一类的,只用差用得到的那些类函数,有时候一类里官方还给分了组,总之最后需要查询的函数没有几个,前提是你找到时候一定要有一个准确的目标,这就需要熟悉数据手册。
另外,注意宏定义函数也是有用的,不要忽略了这类函数,不然可能你找不到合适的函数调用。
只要对数据手册熟悉,再将一个功能最为相近的例程的几个常修改的文件看懂,就肯定会移植了。

一般找不到合适的例程移植,是因为例程包含了你想要的功能,你要去拆解。例如删除或添加某个功能。

3)中断

在这里插入图片描述

  • 首先进入中断函数 void TIM3_IRQHandler(void)
  • 之后进入定时器中断处理函数HAL_TIM_IRQHandler(&htim2);
    定时器中断处理函数:
    我们只设置句柄里面的各个参数,然后就等着HAL库把它安排好的代码送到我们手中。
    可以根据各种XX_HandleTypeDef结构体的成员,猜测HAL库会帮我们准备些什么代码。
  • void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数

更多内容点链接

4)普然的py32f030的手册中的option

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
手册告诉我们只能读,怎么办?用ISP

5)涉及到编写驱动

尽量先看懂至少一个任意芯片的成功的案例,在根据自己使用的主控芯片进行移植,这样会跳过许多坑。知道的方法越多,选择其中最合适的,也会提高代码的质量。

6)工程架构上的错

出现在例程里编写的驱动可以使用,在自己创建的工程里同样的代码不行,就直接用例程的工程,放弃自己的工程。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值