1. 简介
由于自己平时在项目中经常使用 APM32 系列的 MCU,而且经常是和 RT-Thread 系统一起使用,慢慢的就对 APM32 系列 MCU 的 RT-Thread 外设驱动使用熟悉了起来。
目前,RTT-Studio 环境已经支持了 APM32F0/F1/F4/E1/S1 系列的 MCU,每个系列 MCU 的 RTT驱动使用方法基本相似。下面我就以 APM32F407 这款 MCU 为例,介绍下在 RTT-Studio 环境下如何使用 APM32 的外设驱动,希望能帮助到大家快速把 APM32 的 RT-Thread 驱动使用起来。
对于每个外设驱动的使用和测试,大家可以配合 RTT 的官方文档中心(https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README)的设备和驱动模块进行阅读,文档中心对于每一个驱动如何使用和测试都有详细的介绍。
2. 新建RTT-Studio工程
下面是以 APM32F407 进行介绍,所以需要先安装 APM32F4 最新的 RTT-Studio 软件支持包。
2.1 下载APM32F4软件支持包
打开 SDK 管理器,然后找到 APM32F4 的软件支持包,然后点击安装即可。
2.2 基于芯片新建一个 APM32F407 的工程
控制台串口默认是UART1,如果想要更改控制台串口号,下面会详细介绍,这里先默认UART1。然后点击完成即可创建一个 APM32F407 的工程。
3. apm32_msp.c 文件介绍
新建完工程之后,驱动目录结构如下:
可以看到,已经支持了大部分的外设驱动了,如 can/flash/eth/pwm/sdio 等等外设驱动。其中有一个文件是比较重要的, apm32_msp.c 文件,打开这个文件就可以了解到这个文件的作用就是初始化外设时钟和 GPIO 口。比如用到 spi 外设,那么我们就必须要在这个文件里面添加你自己板子所使用到的 spi 外设 GPIO 口的初始化。
我们在后面有很多用到的外设驱动,关于外设引脚的初始化代码,都可以编写放进这个文件中。官方也已经给出了这些外设的部分引脚的初始化代码了,如果我们所使用的硬件引脚和给出的代码是一致的,那么就不需要更改给出的示例代码,如果所使用的引脚不一样,就需要自己编写引脚的初始化代码了。
为什么编写驱动的时候,没有把外设 GPIO 口和对应外设的时钟初始化都编写到对应的驱动程序中呢?这样用户在使用时不就可以编写更少的代码了吗?
关于这一点,主要是因为每个人所使用的硬件是不一样的,比如说有的人可能使用的是 spi1 外设,也可能使用 spi2 外设,而且就算是 spi1 外设,所使用的引脚也可能不同,因为 spi1 外设的 GPIO 引脚很可能有多个引脚可选。简单来说就是关于这部分代码的不确定性太大了,如果在驱动程序中把所有的可能都写出来,会导致驱动程序太过复杂和冗余。所以人家在编写这部分驱动代码的时候,把 GPIO 引脚初始化的代码给剥离出来了,让使用者自己去编写这部分代码。
当然有一些简单的外设驱动,也可以把引脚的初始化相关的代码给写到驱动程序中去。APM32的外设驱动,如 adc/dac/hwtimer 这些驱动,底层引脚初始化和外设时钟的开启就是写到了驱动程序里面的。
4. UART设备
新建完工程之后,默认是已经打开了UART和PIN设备的,因为这两个外设是最常用的。只要编译下载,就可看到串口打印的输出信息。
对于这两个外设的 API 如何使用,可以参考RTT的官方文档,这里不再介绍。下面重点介绍的是如何修改控制台的输出串口,因为在实际的项目中,很多时候控制台所使用的串口并不是 UART1 。
4.1 确定串口引脚,修改串口GPIO初始化代码
我们根据原理图,确定自己所使用的串口调试具体是哪个串口,和对应的串口引脚。然后我们在 apm32_msp.c 文件中,添加串口引脚的初始化代码即可。比如,我的板子就用的UART6,那我们在这个文件添加UART6的引脚初始化代码。
官方所提供的示例代码中,已经提供了 UART1/UART2 的引脚初始化了,我们在 apm32_msp.c 文件中的apm32_usart_init 函数添加 UART6 的引脚初始化代码:
void apm32_usart_init(void)
{
GPIO_Config_T GPIO_ConfigStruct;
#ifdef BSP_USING_UART6
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART6);
GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_6, GPIO_AF_USART6);
GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_7, GPIO_AF_USART6);
GPIO_ConfigStruct.pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_ConfigStruct.mode = GPIO_MODE_AF;
GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOC, &GPIO_ConfigStruct);
#endif
}
4.2 在board.h中修改UART端口号
当然,如果我们在新建工程时,就已经选择了UART6作为控制台的串口,那么我们只需要做完第一步,把所需要的UART引脚进行初始化即可,下面的步骤就都不需要做了。
4.3 在 rtconfig.h 文件中修改控制台所需要的串口设备
修改完之后,重新编译下载,然后可以看到串口打印信息如下:
而且,也可以看到串口设备变为 uart6 了。
5. ADC设备
5.1 使能ADC外设驱动
打开 RT-Thread Setting 配置文件,然后找到 组件 -> 设备驱动程序 -> 使用ADC设备驱动程序,开启该驱动程序即可。
5.2 在board.h文件中定义ADC宏
board.h文件,都是定义和板级硬件所使用的宏定义,如下我们定义 BSP_USING_ADC1这个宏。
5.3 ADC设备测试方法
关于ADC设备的测试和使用示例,可以查阅RTT的文档。下面我简单介绍下,怎么测试我们的ADC外设驱动是否正常工作了。
在命令行终端,可以输入adc命令,然后有一下的使用方法:
adc probe <adc_name> - probe adc by name
adc read <channel> - read adc value on the channel
adc disable <channel> - disable adc channel
adc enable <channel> - enable adc channel
我们对照着输入上面的命令,即可获取ADC采样的电压值。
我们使用的是adc1外设,然后adc1外设通采样道对应的是哪个GPIO引脚,大家可以查看 APM32F407 的数据手册,当然也可称查看ADC外设的驱动代码,如下:
然后,我们在串口终端输入下面的命令,读取PA5(通道5)口的电压值。
可以看到,PA5引脚接3.3V和GND读取到的数值是不一样的,当然这个数据还需要根据12位的分辨率,然后进行电压值的转换。计算公式:vol = value * 3300 / (1<<12)
---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3297252-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。