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的更多相关文章

  1. LoRaWAN_stack移植笔记(三)__SPI

    stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...

  2. LoRaWAN_stack移植笔记(一)--RF硬件相关

    和硬件相关的问题 TCXO 的使用 根据SX1276数据手册, 如果使用TCXO,则需要配置RegTcxo寄存器为0x19,代码如下 ``` c void SX1276SetTcxoConfig(vo ...

  3. LoRaWAN_stack移植笔记(七)_数据包的接收发送

    以下的代码适用于LoRa sx1276点对点的通讯,纯粹的考虑在非发射模式下即为接收模式 配置sx1276的射频参数,并且切换到接收模式 //bandwidth [0:125 1:250 2:500] ...

  4. LoRaWAN_stack移植笔记(四)__RTC

    stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...

  5. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  6. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  7. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  8. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  9. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

随机推荐

  1. Docker+Maven+Jenkins在Devops中完整应用

    过去与现在 很早之前,当我们需要一个部署环境的时候,我们可能指的是一台PowerEdge R710 2U服务器,走一系列冗长的申请流程,然后上架到机房.调试网络.安装系统.调试环境.最终部署应用,就这 ...

  2. [USACO07FEB]银牛派对Silver Cow Party

    题目简叙: 寒假到了,N头牛都要去参加一场在编号为X(1≤X≤N)的牛的农场举行的派对(1≤N≤1000),农场之间有M(1≤M≤100000)条有向路,每条路长Ti(1≤Ti≤100). 每头牛参加 ...

  3. sql注入------基于时间延迟benchmark函数注入脚本

    #author:windy_2import requests urlx = 'http://127.0.0.1/?id= 1 and if((substr((select database()),' ...

  4. linux初学者-iscsi篇

     linux初学者-iscsi篇         之前介绍过网络文件共享系统NFS和CIFS.在系统中,设备也是可以共享的,这就是iSCSI,它可以用来建立和管理IP存储设备.主机和客户机等之间的相互 ...

  5. ElasticSearch全文搜索引擎

    一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic      从名字里我们可以知道,ES的特点就在于灵活的搜索,其实E ...

  6. Mysql 学校信息管理系统

    1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生表 CREATE TABLE `student`( `sid` I ...

  7. Gridea+GitHub搭建个人博客

    某日闲余时间看到一篇介绍Gridea博客平台的文章,大概看了一下觉得此平台还不错,随即自己进入Gridea官网瞅了瞅.哇,这搭建过程也太简单了吧,比Hexo博客搭建要容易很多,而且还有后台管理客户端, ...

  8. JAVA-Spring AOP五大通知类型

    一.前置通知 在目标方法执行之前执行的通知 在前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象和目标方法相 ...

  9. PHP编码风格规范

    由于PHP的灵活性,很多人写起代码来也不讲求一个好的代码规范,使得本就灵活的PHP代码看起来很乱,其实PSR规范中的PSR-1和PSR-2已经定义了在PHP编码中的一些规范,只要我们好好遵守这些规范, ...

  10. Linux系统下增加LV(逻辑卷)容量 、Linux系统下减少LV(逻辑卷)容量

    查看文件系统现有lv_test容量,总计4.9G,已使用3% 命令 df -h   查看现有磁盘情况,我们发现磁盘sdb共有1305个柱面,每个柱面大小是8225280 bytes (大约8M).有一 ...