zoukankan      html  css  js  c++  java
  • 如何使stm32程序更好移植, 结构体相当于define

    原创:转载请标注引用地址

    如何定义 led1对应于PA8  呢

    :对于我一开始学习的方法::

    #include "main.h"

     #define led1      GPIO_Pin_8        //管脚宏定义   PA8

    //=================================================================================================
    //函数名称: GPIO_Configuration    
    //输入参数: void
    //输出参数: void
    //函数功能: 所用到的GPIO的初始化
    //日    期: 2017-11-13
    //作    者: GXTon
    //=================================================================================================

    void GPIO_Configuration(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);     //使能PORTA时钟   
        
        //下面是用于测试的小灯的设置
        GPIO_InitStructure.GPIO_Pin = led1;                                     //PA8
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

    }

    在主函数中:

    void main(void)

    {

    //一系列的初始化

    .........

    .........
        GPIO_Configuration();

    while(1)

    {

            GPIO_SetBits(GPIOA,led1);            //点亮灯

            Delay_ms(1000);


            GPIO_ResetBits(GPIOA,led1);       //灭掉灯

            Delay_ms(1000);

    }

    }

    /////////////////////////////////////////////////////////////////////////////////////////////////

    上面的程序是经常用的,但是总感觉不太顺利,尤其是每次要换板子 

    ,也就是对应的小灯在新的板子上换了引脚:

    如把  led1==PA8  改成  led1==PB10 

    对应的引脚总要改三个地方::   点亮一个小灯也就需要下面三个函数,

    也就是说你要移植一个程序,就要改动用到函数的每一个部分,

    这根本就不是很好的程序

    1: #define led1      GPIO_Pin_8        //管脚宏定义   PA8    ---->改为GPIO_Pin_10

    2:void GPIO_Configuration(void)                                      ---->需要改时钟,改赋值处

    3:GPIO_SetBits(GPIOA,led1);            //点亮灯                  ---->需要改为GPIO_SetBits(GPIOB,led1);

    下面对这三部分进行改造,

    第一部分不用define,而用结构体,,,用结构体的好处是,,可以用一个变量 struct led1,来代表很多变量,,,,因为一个结构体里面有好多元素,,,可以认为结构体是define的升级版

    第二部GPIO_Configuration(void),,要改进它,,它不在是传入void,,而是传入结构体 这样就可以和第一部分关联起来了   

    也许不用传入变量,直接在里面引入结构体的元素就行

    第三部分GPIO_SetBits(GPIOA,led1),,也是把传入的参数:GPIOA,led1   这里是两个参数,我们就改成传入一个结构体的两个元素.

    经过这样的改编,第二部分和第三部分都和第一部分的结构体扯上了关系,那么我们以后一直程序的时候,就只需要改编第一部分的

    结构体就行了,,这样第二部分和第三部分就会有相应的变动传入,,大大简化了,,移植的步骤

    ///////////////////////////////////////////////////////////////////////////////////////////////////

    也许我们可以定义一个新的函数,让它来包含所有的函数,,然后把硬件小灯这里的led1设置成为一种

    结构体,,

    结构体里面包含了小灯的引脚组(A或者B...)

    结构体里也包含了小灯的引脚号(8引脚或者10引脚...)

    结构体里可以包含引脚连接的标号(led1或者TX,,RX..CLK,,DIO)

    结构体里可以包含小灯的各种动作,使用一个函数指针,指向对应函数实现的,不过没有试过(一直亮,一直灭,闪烁)

    结构体里可以包含小灯在这个状态的时间(闪烁时,,,处于关闭的时间变量   处于发光的时间是变量)

    ////////////////////////////////////////////////////////////////////////////////////////////////

    下面我试着实现以下

     

    下面是结构体,

     struct LED                                //为什么它只能在这里定义,在main.c中却是不能呢
    {
        GPIO_TypeDef* GPIOx;         //引脚分组, 如A管脚或B管脚
        uint16_t GPIO_Pin;               //引脚号,   PA8里的  8   或者 PB10里的  10

        uint32_t RCC_APB2Periph   //引脚挂接在哪个时钟下面
        int ON_T;
        int OFF_T;
        int TIME;
        u8 ZT;           //状态,off/on
        u8 led_enable;  //这个是防止重新进入的,因为led的处理没有必要每次都进入,只需要运行一次进入即可
        int cnt;         //这个是用来计数的,计算闪亮了多少次
        int cntt;         //这个是计数停止的界限
        u8 sjxd;         //需不需要限定时间
        
    };    这个是个模具,,用它来扣蛋糕,,蛋糕的名字叫led1,led2或者led3...

    GPIO_Configuration  函数的改造

    //=================================================================================================
    //函数名称: GPIO_Configuration    
    //输入参数: struct LED *led     //这个是一个结构体,里面包含了小灯的所有信息,,,我也在犹豫,,,要不要传进所有的信息,,,还是只传入结构体内的部分变量就好
    //输出参数: void
    //函数功能: 所用到的GPIO的初始化
    //日    期: 2017-11-13
    //作    者: GXTon
    //=================================================================================================

    void GPIO_Configuration(struct LED *led)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(led->RCC_APB2Periph   ,ENABLE);     //使能PORTA时钟   
        
        //下面是用于测试的小灯的设置
        GPIO_InitStructure.GPIO_Pin = led->GPIO_Pin;                                 //PA8
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(led->GPIOx,&GPIO_InitStructure);

    }

    对于点亮小灯的函数改造

    GPIO_SetBits(led->GPIOx, led->GPIO_Pin);  //亮

     当然这只是一部分,小灯不只会亮,还会灭,也能闪,,所以要改造涉及的所有函数

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    不一定要统一所有外设,,灯能亮,,但是马达还能亮吗?显然不能,,,,,外设也是分类的

    我们的程序不一定要把灯和马达都搞到一个结构体里,,,可以设置两个结构体嘛

    这样灯有灯的结构体,,马达有马达的结构体,,

    也许会分的更细,,红灯有红灯的结构体,绿灯有绿灯的结构体,,黄灯有黄灯的结构体

    编写程序前需要分类,,分好类之后按照类型创建结构体,过度的统一并不是好的事情

    void LED_CL(struct LED *led,u8 ztbh,u8 sjxd, int cnt);  //处理led用于改变led状态时才去调用
    void LED_ZT( struct LED *led);          //接收led结构体的状态,去执行

  • 相关阅读:
    redis概要学习
    http协议格式详解
    浅谈mysql
    linux常用命令
    Linux 程序管理
    认识与分析日志文件
    认识与学习bash
    例行任务管理
    软件安装的三大方法
    关于一些感慨
  • 原文地址:https://www.cnblogs.com/chulin/p/8658342.html
Copyright © 2011-2022 走看看