我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介绍X-CTR100控制器基础板载资源的使用,包括LED、蜂鸣器、拨码开关、USB串口、软件定时、位带操作等。

原理

针对X-CTR100控制器的基础操作,均包含在X工程模板的ax_basis文件中,后续例程都包含该文件,方便使用X-CTR100控制器基础资源。

本文包含过个例程,原理详见下文例程。

软件生态

X-SOFT软件生态,X-API文件如下。

ax_basis.c——X-CTR100板载基础资源操作源文件

ax_basis.h——X-CTR100板载基础资源操作头文件

下文例程接口函数均包含在上述文件中,接口函数如下:

void AX_Init(uint32_t baud); //X-CTR100初始化

                                //X-CTR100 LED操作函数宏定义

#define
AX_LEDG_Off()      GPIO_SetBits(GPIOD, GPIO_Pin_11) //LEDG绿色熄灭

#define
AX_LEDG_On()        GPIO_ResetBits(GPIOD, GPIO_Pin_11) //LEDG绿色点亮

#define
AX_LEDG_Toggle() GPIO_WriteBit(GPIOD, GPIO_Pin_11, (BitAction) (1 - GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11)))    //LEDG绿色状态翻转

#define
AX_LEDR_Off() GPIO_SetBits(GPIOD, GPIO_Pin_10) //LEDR红色熄灭

#define
AX_LEDR_On()      GPIO_ResetBits(GPIOD, GPIO_Pin_10) //LEDR红色点亮

#define
AX_LEDR_Toggle() GPIO_WriteBit(GPIOD, GPIO_Pin_10, (BitAction) (1 - GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_10)))    //LEDR红色状态翻转

 

                                //X-CTR100 蜂鸣器操作函数宏定义

#define
AX_BEEP_Off() GPIO_SetBits(GPIOE, GPIO_Pin_6) //蜂鸣器不鸣

#define
AX_BEEP_On()        GPIO_ResetBits(GPIOE, GPIO_Pin_6) //蜂鸣器鸣叫

#define
AX_BEEP_Toggle() GPIO_WriteBit(GPIOE, GPIO_Pin_6, (BitAction) (1 - GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6))) //蜂鸣器状态翻转

 

//X-CTR100 获取拨码开关状态函数

uint8_t AX_SW_GetSW12Status(void); //SW获得选择状态

uint8_t AX_SW_GetSW1Status(void); //SW1获得选择状态

uint8_t AX_SW_GetSW2Status(void); //SW2获得选择状态

 

//X-CTR100 软件延时函数

void AX_Delayus(__IO uint16_t us); //软件微妙延时

void AX_Delayms(__IO uint16_t ms); //软件毫秒延时

 

其中AX_Init()函数完成LED、蜂鸣器、串口1、拨码开关、滴答时钟的初始化。

例程 l Printf&Scanf例程

printf()和scanf()函数是C语音重要的格式化输入输出函数,一般用于信息数据的输入输出,同样X-CTR100也使用两个函数进行信息和数据的输入输出操作,方便进行功能调试和验证。

本例程实现printf()和scanf()输入输出操作。

硬件说明

硬件资源:

  • 串口UART1

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

printf()和scanf()是C语言标准库函数,定义在stdio.h文件中。例程使用MDK软件提供微库,使用时需要勾选MDK工程选项"Use MicroLIB",参考下图。

为了实现通过UART1进行信息输入输出,在ax_basis.c文件重定义fputc()和fgetc()函数,具体参考程序源码,printf()和scanf()输入输出格式说明请参考C语言相关书籍。

    

主程序,首先调用AX_Init()函数初始化X-CTR100控制器,AX_Init()函数包含UART1初始化,波特率设置为115200。进入while循环,首先打印提示信息,通过scanf()输入数值到x变量,并通过printf()函数输出x变量内容。

int main(void)

{

    int32_t tmp;

 

    /* X-CTR100初始化 */

    AX_Init(115200);

 

    printf("***X-CTR100 Printf & Scanf例程***\r\n\r\n");

 

    //X-API测试:Printf & Scanf测试

    printf("*Printf & Scanf测试\r\n");

 

    while (1)

    {

        printf("请输入范围0~1000的正整数X=");

        scanf("%d", &tmp);

        printf(" %d\r\n", tmp);

    }

}

实现效果

打开X-Assistant软件,选择对应串口,并保持默认串口参数设置(后续例程操作相同,不再重复描述)。根据提示,在发送窗口输入0~1000范围的数值,并按"发送"按钮,接收窗口显示对应的数值。以上操作循环执行,运行效果如下图所示。

    

例程 l LED例程

X-CTR100具有两个可编程LED灯,一个红色、一个绿色,通过控制LED灯亮灭可用于功能及程序状态指示。

本例程控制2个LED点亮、熄灭、翻转操作。

硬件说明

硬件资源:

  • 串口UART1
  • 板载LEDR、LEDG

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

主程序。

int main(void)

{

    /* X-CTR100初始化 */

    AX_Init(115200);

 

    printf("***X-CTR100 LED例程***\r\n\r\n");

 

    //X-API测试:红色、绿色LED交替闪烁

    printf("*LED测试\r\n");

    printf("*红色、绿色LED交替闪烁\r\n");

 

    AX_LEDG_On(); //绿色LED点亮

    AX_LEDR_Off(); //红色LED熄灭

 

    while (1)

    {

        AX_Delayms(100); //延时100ms

        AX_LEDG_Toggle(); //绿色LED翻转

        AX_LEDR_Toggle(); //红色LED翻转

    }

}

实现效果

程序实现红绿LED交替闪烁效果。

例程 l 蜂鸣器例程

X-CTR100具有一个可编程有源蜂鸣器,通过GPIO高低电平控制,可用于声音提示、报警、音乐等功能。本例程控制蜂鸣器鸣叫、不叫和状态翻转。

硬件说明

硬件资源:

  • 串口UART1
  • 板载蜂鸣器

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

主程序。

int main(void)

{

    /* X-CTR100初始化 */

    AX_Init(115200);

 

    printf("***X-CTR100 蜂鸣器例程***\r\n\r\n");

 

    //X-API测试:蜂鸣器鸣叫

    printf("*蜂鸣器测试\r\n");

    printf("*蜂鸣器长响1S后间隔鸣叫\r\n");

    AX_BEEP_On();

    AX_Delayms(1000);

    AX_BEEP_Off();

    AX_Delayms(500);

 

    while (1)

    {

        AX_Delayms(100);

        AX_BEEP_Toggle();

    }

}

实现效果

实现了蜂鸣器长响1S后间隔鸣叫,鸣叫频率5Hz。

例程 l 拨码开关例程

X-CTR100具有一个两位拨码开关,通过GPIO输入采集拨码开关状态,可用于参数设置、状态转换、分支选择等功能。

本例程获取SW1、SW2编码器状态,并将获取的状态printf输出。

硬件说明

硬件资源:

  • 串口UART1
  • 板载拨码开关

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

程序首先分别获取拨码开关SW1、SW2状态,然后在while循环中进行拨码开关状态循环检测,如果拨码开关状态有更新,则通过串口输出拨码开关更新后的状态。

int main(void)

{

    int32_t tmp;

 

    /* X-CTR100初始化 */

    AX_Init(115200);

 

    printf("***X-CTR100 拨码开关例程***\r\n\r\n");

 

    //X-API测试:获取拨码开关SW1 SW2状态

    printf("*拨码开关测试\r\n");

 

    //获取拨码开关SW1状态

    if (AX_SW_GetSW1Status())

        printf("*拨码开关SW1=1,开关在ON侧\r\n");

    else

        printf("*拨码开关SW1=0,开关在ON对侧\r\n");

 

    //获取拨码开关SW2状态

    if (AX_SW_GetSW2Status())

        printf("*拨码开关SW2=1,开关在ON侧\r\n");

    else

        printf("*拨码开关SW2=0,开关在ON对侧\r\n");

 

    while (1)

    {

        //获取拨码开关总状态,并判断是否发生变换

        if (AX_SW_GetSW12Status() != tmp)

        {

            tmp = AX_SW_GetSW12Status();

            printf("*拨码开关当前状态%d \r\n", tmp);

        }

        AX_Delayms(100);

    }

}

实现效果

运行效果如下图所示,可手动调整拨码开关状态,观察程序输出显示情况。

    

例程 l GPIO位带操作例程

51单片机相信各位都用过,假设P1.1的IO口上挂了一个LED,那么你单独对LED的操作就是P1.1 = 0或P1.1 = 1,注意,是你可以单独的对P1端的第一个IO口进行操作,然而STM32是不允许这样做的,那么为了像51单片机一样能够单独的对某个端的某一个IO单独操作,就引入了位带操作这样的概念,简单说就是为了去单独操作32里面PA端的第1个IO口,所以才有了位带这样的操作机制。

位带操作就是把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说GPIO的ODR寄存器有32个位,那么可以映射到32个地址上,我们去问这32个地址就达到访问32个比特的目的。这样我们往某个地址写1 就达到往对应比特位写1 的目的,同样往某个地址写0 就达到往对应的比特位写0 的目的。

通过位带操作实现了GPIO的输入输出操作,利用SW拨码开关控制LED灯的开关。

硬件说明

硬件资源:

  • 串口UART1
  • 板载LEDR、LEDG
  • 板载拨码开关

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

位带相关操作宏定义,在ax_basis.h文件中。

//IO口操作宏定义

#define
BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

#define
MEM_ADDR(addr) *((volatile
unsigned
long *)(addr))

#define
BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

 

//IO口地址映射

#define
GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014

#define
GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414

#define
GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814

#define
GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14

#define
GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014

#define
GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414

#define
GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814

#define
GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14

#define
GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014

#define
GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010

#define
GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410

#define
GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810

#define
GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10

#define
GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010

#define
GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410

#define
GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810

#define
GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10

#define
GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010

 

//IO口操作

#define
PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出

#define
PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入

#define
PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出

#define
PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入

#define
PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出

#define
PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入

#define
PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出

#define
PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入

#define
PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出

#define
PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入

#define
PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出

#define
PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入

#define
PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出

#define
PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入

#define
PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出

#define
PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //输入

#define
PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //输出

#define
PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //输入

软件通过主程序实现AX_Init()函数已完成IO口初始化,SW和LED灯接口位带定义如下。

//LED端口定义

#define
GPIO_LED_G
PDout(11)    // 绿色LED

#define
GPIO_LED_R
PDout(10)    // 红色LED    

 

//SW拨码开关端口定义

#define
GPIO_SW1         PEin(15)     //拨码开关1

#define
GPIO_SW2         PEin(10)    //拨码开关2

主程序代码。

int main(void)

{

    /* X-CTR100初始化 */

    AX_Init(115200);

 

    printf("***X-CTR100 位带操作GPIO例程***\r\n\r\n");

 

    //位带控制LED输出

    GPIO_LED_G = 0;

    GPIO_LED_R = 0;

    AX_Delayms(500);

    GPIO_LED_G = 1;

    GPIO_LED_R = 1;

    AX_Delayms(500);

 

    //循环检测,通过拨码开关控制LED

    while (1)

    {

        //获取拨码开关1状态,控制LED绿灯

        if (GPIO_SW1 == 1)

            GPIO_LED_G = 1;

        else

            GPIO_LED_G = 0;

 

        //获取拨码开关2状态,控制LED红灯        

        if (GPIO_SW2 == 1)

            GPIO_LED_R = 1;

        else

            GPIO_LED_R = 0;

 

        AX_Delayms(200);

    }

}

实现效果

拨动SW1控制绿色LED灯亮灭,拨动SW2控制红色LED灯。

总结

通过本文学习,可以轻松掌握X-CTR100控制器基础板载资源LED、蜂鸣器、拨码开关、USB串口、位带操作、定时器的使用。

后续生态及例程,将以ax_basis为基础,会频繁使用这些基础X-API,请大家务必了解。

玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作的更多相关文章

  1. 玩转X-CTR100 | STM32F4 l GPIO位带操作

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]       STM32F4位带概念,及位带的GPIO操作实践应用. 原理介 ...

  2. 玩转X-CTR100 l STM32F4 l X-CTR100与树莓派搭建机器人平台

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器与树莓派Linux系统 ...

  3. 玩转X-CTR100 l STM32F4 l FPU单精度浮点性能测试

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器如何开启ST ...

  4. 玩转X-CTR100 l STM32F4 l UCOS-III移植

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...

  5. 玩转X-CTR100 l STM32F4 l ESP8266串口WIFI模块

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]- ESP8266是一款非常火的WIFI模块,性价 ...

  6. 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 AD转换接 ...

  7. 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器控制步进电机 ...

  8. 玩转X-CTR100 l STM32F4 l MPU6050加速度陀螺仪传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载加速度 ...

  9. 玩转X-CTR100 l STM32F4 l 舵机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的舵机控制,X-CTR ...

随机推荐

  1. C#创建继承的窗体

    http://blog.csdn.net/chenyujing1234/article/details/7555369 关键技术 基窗体,实质上相当于面向对象编程中提到的基类,而继承窗体则是子类或派生 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca

    大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...

  3. 【转】Makefile 中:= ?= += =的区别

    最近接触使用C++项目,需要使用Makefile,因此需要好好学习下. [转自]:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257 ...

  4. NOI 7614 最低通行费(多段图最短路)

    http://noi.openjudge.cn/ch0206/7614/ 题意: 有一个N*N的正方形网格,商人从网格的左上角进,右下角出.每穿越中间1个小方格,都要花费1个单位时间.商人必须在(2N ...

  5. java编程内容之开始

    java应用程序开发应该掌握的各方面技术 1.初识java,熟悉Eclipse开发工具 2.java语言基础 3.流程控制,数组,字符串,类与对象 4.接口,继承与多态,类的高级特性 5.Java集合 ...

  6. python分享题目

    目前的分享题目:1 python在云计算虚拟教室领域的应用 2 python与虚拟货币(华三工程师) 3 python在移动游戏的实践(爪子) 4 python互联网敏捷运维实践(蓝雪) 5 pyth ...

  7. vue-echarts的使用及编译报错解决方法

    一. 使用 vue-cli 快速构建vue项目, 引入vue-echarts组件 安装:  > npm i vue-echarts --save 修改 webpack.config.js 配置: ...

  8. R-FCN论文理解

    一.R-FCN初探 1. R-FCN贡献 提出Position-sensitive score maps来解决目标检测的位置敏感性问题: 区域为基础的,全卷积网络的二阶段目标检测框架: 比Faster ...

  9. Codeforces 447D - DZY Loves Modification

    447D - DZY Loves Modification 思路:将行和列分开考虑.用优先队列,计算出行操作i次的幸福值r[i],再计算出列操作i次的幸福值c[i].然后将行取i次操作和列取k-i次操 ...

  10. php新手第一次安装mongo

    以下是我走位php新手第一次安装mongo模块的步骤: 1.首先从在网上选取适当版本的mongoDB扩展包下载; 2.解压扩展包,并且进入解压目录; tar -zxf mongo-1.4.1.tgz ...