LoRaWAN_stack移植笔记 (二)_GPIO
stm32相关的配置
由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。另外例程中对STM32库函数的再一次封装的方法也非常值得学习。
GPIO 的配置
GpioInit( &obj->Tx, tx, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF0_USART1 );
例程中可以看到,对IO口的初始化只有这一句,是因为例程中对GPIO的操作进行了封装,方便了上层的使用。
/*!
* Board GPIO pin names
*/
typedef enum
{
MCU_PINS,
IOE_PINS,
// Not connected
NC = (int)0xFFFFFFFF
}PinNames;
/*!
* STM32 Pin Names
*/
#define MCU_PINS \
PA_0 = 0, PA_1, PA_2, PA_3, PA_4, PA_5, PA_6, PA_7, PA_8, PA_9, PA_10, PA_11, PA_12, PA_13, PA_14, PA_15, \
PB_0, PB_1, PB_2, PB_3, PB_4, PB_5, PB_6, PB_7, PB_8, PB_9, PB_10, PB_11, PB_12, PB_13, PB_14, PB_15, \
PC_0, PC_1, PC_2, PC_3, PC_4, PC_5, PC_6, PC_7, PC_8, PC_9, PC_10, PC_11, PC_12, PC_13, PC_14, PC_15, \
PD_0, PD_1, PD_2, PD_3, PD_4, PD_5, PD_6, PD_7, PD_8, PD_9, PD_10, PD_11, PD_12, PD_13, PD_14, PD_15, \
PE_0, PE_1, PE_2, PE_3, PE_4, PE_5, PE_6, PE_7, PE_8, PE_9, PE_10, PE_11, PE_12, PE_13, PE_14, PE_15, \
PF_0, PF_1, PF_2, PF_3, PF_4, PF_5, PF_6, PF_7, PF_8, PF_9, PF_10, PF_11, PF_12, PF_13, PF_14, PF_15, \
PH_0, PH_1, PH_2, PH_3, PH_4, PH_5, PH_6, PH_7, PH_8, PH_9, PH_10, PH_11, PH_12, PH_13, PH_14, PH_15
例程中使用Enum定义了64个IO口,其中
- 0-15 表示PA0-15
- 16-31表示PB0-15
- 32-47表示PC0-15
- 48-63表示PD0-15
- 64-79表示PE0-15
- 80-95表示PF0-15
- 96-111表示PH0-15
这样,在定义引脚的时候直接是用Enum变量就可以表示出IO的PIN以及PORT,在完成驱动程序之后,操作引脚非常的方便。
例如 使用了一个LED灯,连接的是PB_5,这样我们#define LED PB_5,在程序里面就可以得知使用的是PB口,以及PIN_5,方法如下:
由于PB_5 = 16+5 = 21;
21/16 = 1,得知使用的是PB口,21%16 = 5,得知使用的是PIN_5。
其中C语言的时下代码如下,使用(&0xff)以及<<的操作,效率比做除法及取模的效率更高
void GpioMcuInit( Gpio_t *obj, PinNames pin, PinModes mode, PinConfigs config, PinTypes type, uint32_t value )
{
GPIO_InitTypeDef GPIO_InitStructure;
if( pin == NC )
{
return;
}
obj->pin = pin;
obj->pinIndex = ( 0x01 << ( obj->pin & 0x0F ) );
if( ( obj->pin & 0xF0 ) == 0x00 )
{
obj->port = GPIOA;
__HAL_RCC_GPIOA_CLK_ENABLE( );
}
else if( ( obj->pin & 0xF0 ) == 0x10 )
{
obj->port = GPIOB;
__HAL_RCC_GPIOB_CLK_ENABLE( );
}
else if( ( obj->pin & 0xF0 ) == 0x20 )
{
obj->port = GPIOC;
__HAL_RCC_GPIOC_CLK_ENABLE( );
}
else if( ( obj->pin & 0xF0 ) == 0x30 )
{
obj->port = GPIOD;
__HAL_RCC_GPIOD_CLK_ENABLE( );
}
else
{
obj->port = GPIOH;
__HAL_RCC_GPIOH_CLK_ENABLE( );
}
GPIO_InitStructure.Pin = obj->pinIndex ;
GPIO_InitStructure.Pull = type;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
if( mode == PIN_INPUT )
{
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
}
else if( mode == PIN_ANALOGIC )
{
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
}
else if( mode == PIN_ALTERNATE_FCT )
{
if( config == PIN_OPEN_DRAIN )
{
GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
}
else
{
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
}
GPIO_InitStructure.Alternate = value;
}
else // mode ouptut
{
if( config == PIN_OPEN_DRAIN )
{
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
}
else
{
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
}
}
HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
// Sets initial output value
if( mode == PIN_OUTPUT )
{
GpioMcuWrite( obj, value );
}
}
LoRaWAN_stack移植笔记 (二)_GPIO的更多相关文章
- LoRaWAN_stack移植笔记(三)__SPI
stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...
- LoRaWAN_stack移植笔记(一)--RF硬件相关
和硬件相关的问题 TCXO 的使用 根据SX1276数据手册, 如果使用TCXO,则需要配置RegTcxo寄存器为0x19,代码如下 ``` c void SX1276SetTcxoConfig(vo ...
- LoRaWAN_stack移植笔记(七)_数据包的接收发送
以下的代码适用于LoRa sx1276点对点的通讯,纯粹的考虑在非发射模式下即为接收模式 配置sx1276的射频参数,并且切换到接收模式 //bandwidth [0:125 1:250 2:500] ...
- LoRaWAN_stack移植笔记(四)__RTC
stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
随机推荐
- Keil debug command SAVE 命令保存文件的解析
简介 使用 Keil debug 很方便,把内存中的一段区域 dump 出来也很方便,例如使用命令 SAVE filepath startAddr, endAddr, typeCode .但是要查看 ...
- 什么是WebP以及如何在WordPress中使用WebP图像
图像通常是缓慢加载网页的最大原因之一.它们不仅减慢了加载时间,而且还可以占用服务器上的大量空间和资源.仔细选择文件类型并压缩它们有助于降低加载速度,但它们只能在图像质量受损之前进行优化.另一种选择是使 ...
- 织梦(dede)底层模板概念、常用底层模板字段
织梦(dede)底层模板概念.常用底层模板字段 一.底层模板的概念以及调用方式: 1. 什么是底层模板? 底层模板不是一个模板! 他就是在实际页面当中所要显示的具体内容: 2. 底层模板的应用: 调用 ...
- golang从context源码领悟接口的设计
注:写帖子时go的版本是1.12.7 go语言中实现一个interface不用像其他语言一样需要显示的声明实现接口.go语言只要实现了某interface的方法就可以做类型转换.go语言没有继承的概念 ...
- IO流总结2
2.字节流 |-- InputStream(读) |-- OutputStream(写) 由于字节是二进制数据,所以字节流可以操作任何类型的数据,值得注意的是字符流使用的是字符数组char[]而字节流 ...
- Appium自动化测试环境搭建
前言 Appium是一个开源的自动化测试框架,支持跨平台,支持多种编程语言,可用于原生,混合和移动web应用程序,使用webdriver驱动ios,android应用程序.那么为了学习app自动化测试 ...
- 实用小工具推荐 OpenWrite
[实用小工具推荐]给技术同学们推荐一款比较好用的工具,可以实现一稿多发,主流的技术渠道基本涵盖了:https://www.openwrite.cn/ 因为工作的关系,认识了很多做技术公众号的小伙伴,同 ...
- Linux中更新firefox
从官网下载Firefox压缩包放在/usr/lib/目录下(应用程序一般都在这个文件夹下) tar jxfv [压缩包名] 解压得到文件夹firefox在解压得到的firefox文件夹中有一个fir ...
- TCP重置报文段及RST常见场景分析
RST表示连接重置,用于关闭那些已经没有必要继续存在的连接.一般情况下表示异常关闭连接,区别与四次分手正常关闭连接. 产生RST的三个条件是: 目的地为某端口的SYN到达,然而在该端口上并没有正在监听 ...
- React进阶之路书籍笔记
React进阶之路: "于复合类型的变量,变量名不指向数据,而是指向数据所在的地址.const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心 ...