OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3905|回复: 1

【请教】:位带操作编组/循环控制17个随即定义的GPIO方法

[复制链接]

9

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2020-5-19
在线时间
14 小时
发表于 2020-10-29 21:45:25 | 显示全部楼层 |阅读模式
1金钱
在做一个17芯线缆通断检测的程序,利用10个OUT口和10个IN口,依次控制OUT输出高低电平,希望把OUT口位带地址放进数组里面,请教应该怎么实现?对指针和位带操作的指针放入数组的操作不熟悉,请指教。

代码如下:
*****以下头文件:
#define LINE_NUM_SUM 17

#define OUT0         PAout(0)
#define OUT1         PBout(1)
#define OUT2         PBout(2)
#define OUT3         PBout(3)
#define OUT4         PBout(4)
#define OUT5         PAout(5)
#define OUT6         PBout(6)
#define OUT7         PBout(7)
#define OUT8         PBout(8)
#define OUT9         PBout(9)
#define OUT10         PBout(10)
#define OUT11         PBout(11)
#define OUT12         PBout(12)
#define OUT13         PBout(13)
#define OUT14         PBout(14)
#define OUT15         PBout(15)
#define OUT16         PAout(6)
#define OUT17         PAout(7)

**********以下C文件

void checkInit()
{
        u8 i = 0;
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOA_CLK_ENABLE();                   //开启GPIOB时钟
        __HAL_RCC_GPIOB_CLK_ENABLE();                   //开启GPIOE时钟
        __HAL_RCC_GPIOC_CLK_ENABLE();                   //开启GPIOE时钟
       
        //OUT 初始化
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;         //0 5 6 7
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;          //推挽输出
    GPIO_Initure.Pull=GPIO_PULLDOWN;                  //下拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);                        //GPIOA OUT

    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;         //1 2 3 4
    GPIO_Initure.Pin|=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;         //6 7 8 9
    GPIO_Initure.Pin|=GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;         //10 11 12 13
    GPIO_Initure.Pin|=GPIO_PIN_14|GPIO_PIN_15;                                                         //14 15
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);                        //GPIOB OUT
       
        //测试OUT能否循环输出
        while(i < LINE_NUM_SUM)
        {
                if(OUTThis[i])
                        OUTThis[i] = 0;
                else
                        OUTThis[i] = 1;
               
                delay_ms(1000);                       
        }
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2020-5-19
在线时间
14 小时
 楼主| 发表于 2020-10-30 18:10:40 | 显示全部楼层
最新进展:
OUT口可以通过数组方式循环访问,关键代码如下:       
        for(i = 0;i < LINE_NUM_SUM;i++)
        {
                info_err[i].line_num = i;                                //写入当前线号
                *OUTThis[i] = 1;                                        //设置线路高电平 ******注意此行!!!!!*******   *OUTThis[i] 就是 PCout(i),但是我还没有理解,这里的指针原理
               
                delay_us(1);
               
                //判断是否导通
                if(1 == *INThis[i])                                                //检测线路导通
                {
                        info_err[i].open_err |= 0;                        //导通,不报错
                }
                else
                {
                        info_err[i].open_err |= 1;                        //不通,报错
                }
               
                //判断与其他线路是否短路
                j = i+1;
                while(j < LINE_NUM_SUM)
                {
                        if(1 == *INThis[j])
                        {
                                info_err[i].short_err |= 1;
                                x = PBin(15);
                                break;
                        }
                        j++;
                }
               
                info_err[i].short_err |= 0;
                *OUTThis[i] = 0;                                                //设置线路低电平               
        }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 11:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表