打印
[应用相关]

STM32W108无线射频模块IO接口测试应用实例解析

[复制链接]
1161|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fesxp|  楼主 | 2015-7-8 19:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fesxp 于 2015-7-8 19:33 编辑

STM32W108无线射频模块应用实例解析
本实例编写STM32W108的GPIO测试程序,通过控制GPIO引脚,实现对LED灯的控制。
开发环境与硬件说明
硬件:STM32W108无线开发板,5V 1A电源,J-Link烧写器,PC机等。
软件:IAR Embedded Workbench开发软件。
硬件连接的原理图如图所示:通过STM32W108无线模块的GPIO引脚PA3控制LED1,GPIO引脚PC2控制LED2。

硬件连接原理图

硬件规划:其中用到的控制管脚为GPIO_PA3、GPIO_PC2,在控制LED灯的时候要把对应的管脚设置为输出,然后通过输出数据寄存器控制输出电平的高低,从而控制LED灯的亮灭。
6.3.2 软件设计与规划
本实例调用halSetLed()和halClearLed()函数,实现对LED灯的控制,此驱动主要是考察编写者如何实现GPIO引脚功能设置及应用。函数声明格式如下:
void halSetLed(HalBoardLed led);
void halClearLed(HalBoardLed led);
其中halSetLed()完成对参数代表的GPIO引脚置低,halClearLed()完成对参数代表的GPIO引脚置高
6.3.3 LED控制程序设计
编写led 驱动源文件led.c如下:
/**********************************************************************
文件名:led.c
主要函数描述:halInitLed(void)函数实现LED初始化;halSetLed(HalBoardLed led)
函数实现设置LED,使其亮;halClearLed(HalBoardLed led)实现设置LED,使其灭;halToggleLed(HalBoardLed led)实现设置LED,使其闪烁。
**********************************************************************/
#include PLATFORM_HEADER
#include BOARD_HEADER
#include "hal/micro/led.h"
#include "hal/micro/micro-common.h"
#include "hal/micro/cortexm3/micro-common.h"

//宏定义,PA相关寄存器
#define GPIO_PxCLR_BASE (GPIO_PACLR_ADDR)
#define GPIO_PxSET_BASE (GPIO_PASET_ADDR)
#define GPIO_PxOUT_BASE (GPIO_PAOUT_ADDR)

//寄存器管脚偏移
#define GPIO_Px_OFFSET  (GPIO_PBCFGL_ADDR-GPIO_PACFGL_ADDR)

/**************************************************************************
功能描述:完成对LED的初始化
输入参数:无
输出参数:无
*************************************************************************/
void halInitLed(void)
{
//为LED1和LED2配置引脚
    halGpioConfig(LED_D1, GPIOCFG_OUT);
halGpioConfig(LED_D2, GPIOCFG_OUT);

    //关闭LED1、LED2
    halClearLed(LED_D1);
halClearLed(LED_D2);
}

/**************************************************************************
功能描述:完成对LED对应端口清零,使其亮
输入参数:LED灯的标识,即对应的LED灯的端口
输出参数:无
*************************************************************************/
void halSetLed(HalBoardLed led)
{
    if(led/8 < 3)
    {
        *((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(led/8))))
= BIT(led&7);
    }
}

/**************************************************************************
功能描述:完成对LED灯相应端口寄存器值的置位,使其灭
输入参数:LED灯的标识,即对应的LED灯的端口
输出参数:无
*************************************************************************/
void halClearLed(HalBoardLed led)
{
    if(led/8 < 3)
    {
        *((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(led/8))))
= BIT(led&7);
    }
}

/**************************************************************************
功能描述:完成LED灯的设置,使其由亮变灭或由灭变亮
输入参数:LED的标识,即对应LED对应的端口
输出参数:无
*************************************************************************/
void halToggleLed(HalBoardLed led)
{
//原子操作
    ATOMIC(
        if(led/8 < 3)
        {
            *((volatile int32u *)(GPIO_PxOUT_BASE+(GPIO_Px_OFFSET*(led/8))))
^= BIT(led&7);
        }
     )
}
6.3.4 测试程序编写
编写测试程序源文件main.c:
/*****************************************************************
文件名:solar-system.c
硬件描述:LED_D1连接PA3,LED_D2连接PC2
主要函数描述:main( )函数通过实现对io的控制。
*****************************************************************/

/**************************************************************************
功能描述:完成通过io对LED灯的测试
输入参数:无
输出参数:无
*************************************************************************/
int main(void)
{
    halInit(); //初始化硬件电路
    uartInit(115200, 8, PARITY_NONE, 1); //初始化UART串口
  
    //配置PA4和PA5为模拟输出功能,用于数据包的跟踪
    halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT);
halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);
    GPIO_IRQDSEL = PORTB_PIN(2);  //将IRQD与PB2/SC1RXD连接
    GPIO_INTCFGD = (3<<GPIO_INTMOD_BIT);  //允许IRQD中断
    INT_GPIOFLAG = INT_IRQDFLAG;
    INT_PENDCLR = INT_IRQD;
    halInitLed(); //初始化LED灯

while(TRUE) //无限循环,使LED1、LED2灯以1s为周期间隔闪烁
{        
        halSetLed(LED_D1); //点亮LED1
        halClearLed(LED_D2); //关闭LED2
        halCommonDelayMilliseconds(1000); //延迟1s
        halClearLed(LED_D1); //关闭LED1
        halSetLed(LED_D2); //点亮LED2
        halCommonDelayMilliseconds(1000); //延迟1s
}
}
6.3.5 测试结果及分析
程序编译完成之后,通过J-link烧写到STM32W108无线开发板,然后执行程序,测试程序执行结果主要通过观察LED灯的亮灭验证,测试结果如图所示。测试程序执行之后,可以观察到LED1、LED2以1s为时间间隔进行间隔闪烁,验证了实例程序的正确性。



沙发
lwsn| | 2015-7-8 19:33 | 只看该作者
楼主的软件是IAR的?是IAR for 什么的呀

使用特权

评论回复
板凳
mmuuss586| | 2015-7-8 19:44 | 只看该作者

线步的不是很好看;

使用特权

评论回复
地板
fesxp|  楼主 | 2015-7-8 20:30 | 只看该作者
IAR for ARM

使用特权

评论回复
5
dirtwillfly| | 2015-7-8 20:40 | 只看该作者
很详细

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

1

粉丝