zoukankan      html  css  js  c++  java
  • STM32W108无线射频模块通用IO接口应用实例

    STM32W108无线射频模块通用IO接口应用实例

     

     

    本实例编写STM32W108GPIO測试程序,通过控制GPIO引脚,实现对LED灯的控制。

    开发环境与硬件说明

    硬件:STM32W108无线开发板,5V 1A电源。J-Link烧写器。PC机等。

    软件:IAR Embedded Workbench for ARM开发软件。

    硬件连接的原理图如图6.15所看到的:通过STM32W108无线模块的GPIO引脚PA3控制LED1GPIO引脚PC2控制LED2

     

    硬件规划:当中用到的控制管脚为GPIO_PA3GPIO_PC2,在控制LED灯的时候要把相应的管脚设置为输出。然后通过输出数据寄存器控制输出电平的高低,从而控制LED灯的亮灭。

    6.3.2 软件设计与规划

    本实例调用halSetLed()halClearLed()函数,实现对LED灯的控制,此驱动主要是考察编写者怎样实现GPIO引脚功能设置及应用。

    函数声明格式例如以下:

    void halSetLed(HalBoardLedled);

    voidhalClearLed(HalBoardLed led);

    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)

    {

    //LED1LED2配置引脚

        halGpioConfig(LED_D1,  GPIOCFG_OUT);

    halGpioConfig(LED_D2,  GPIOCFG_OUT);

     

        //关闭LED1LED2

        halClearLed(LED_D1);

    halClearLed(LED_D2);

    }

     

    /**************************************************************************

    功能描写叙述:完毕对LED相应port清零,使其亮

    输入參数:LED灯的标识。即相应的LED灯的port

    输出參数:无

    *************************************************************************/

    void halSetLed(HalBoardLed led)

    {

        if(led/8 < 3)

        {

            *((volatile int32u  *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(led/8))))

    = BIT(led&7);

        }

    }

     

    /**************************************************************************

    功能描写叙述:完毕对LED灯对应port寄存器值的置位。使其灭

    输入參数:LED灯的标识,即相应的LED灯的port

    输出參数:无

    *************************************************************************/

    void halClearLed(HalBoardLed led)

    {

        if(led/8 < 3)

        {

            *((volatile int32u  *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(led/8))))

    = BIT(led&7);

        }

    }

     

    /**************************************************************************

    功能描写叙述:完毕LED灯的设置。使其由亮变灭或由灭变亮

    输入參数:LED的标识。即相应LED相应的port

    输出參数:无

    *************************************************************************/

    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连接PA3LED_D2连接PC2

    主要函数描写叙述:main(  )函数通过实现对io的控制。

    *****************************************************************/

     

    /**************************************************************************

    功能描写叙述:完毕通过ioLED灯的測试

    输入參数:无

    输出參数:无

    *************************************************************************/

    int  main(void)

    {

        halInit(); //初始化硬件电路

        uartInit(115200, 8, PARITY_NONE, 1); //初始化UART串口

     

        //配置PA4PA5为模拟输出功能,用于数据包的跟踪

         halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT);

    halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);

        GPIO_IRQDSEL = PORTB_PIN(2);  //IRQDPB2/SC1RXD连接

        GPIO_INTCFGD =  (3<<GPIO_INTMOD_BIT);  //同意IRQD中断

        INT_GPIOFLAG = INT_IRQDFLAG;

        INT_PENDCLR = INT_IRQD;

        halInitLed(); //初始化LED

     

    while(TRUE) //无限循环,使LED1LED2灯以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灯的亮灭验证,

    測试程序运行之后。能够观察到LED1LED21s为时间间隔进行间隔闪烁。验证了实例程序的正确性。

     

     

    本文出自《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社。20145

  • 相关阅读:
    apache开源项目 -- Wicket
    读书笔记--《机器人时代》
    apache开源项目--dbutils
    apache开源项目--mina
    apache开源项目--OpenMeetings
    apache开源项目--lume
    apache开源项目--Sirona
    shared_ptr的简单实现
    高并发网络编程之epoll详解
    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7077040.html
Copyright © 2011-2022 走看看