打印

使用STM32不相关的IO口,可以模拟一个总线吗?

[复制链接]
946|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2017-3-21 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
布拉格梦语| | 2017-3-26 10:56 | 只看该作者
组成24bit,不懂,你需要模拟什么总线呢?

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2017-3-29 14:02 | 只看该作者
就是 若干不相干的数据 合成一个 段

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2017-3-29 14:03 | 只看该作者
位操作是增对某寄存器的某一位进行操作,如sbit key=P0^0;key=1;

段操作是对寄存器操作。如P0=0xff。

使用特权

评论回复
5
god9987| | 2017-3-29 14:17 | 只看该作者
就是把多个独立的IO模拟成一个总线 然后整体操作是吗?

可读可写?

使用特权

评论回复
6
god9987| | 2017-3-29 14:17 | 只看该作者
首先创建并行总线接口,这个接口是在bus.c总线中实现的。一些IO相关的宏是在bus.h中定义的,这里仅仅是定义了数据端口,对于控制端口的定义是在DM9000的驱动程序中定义的。总线定义要跟DM9000的16位数据总线对应如下

使用特权

评论回复
7
god9987| | 2017-3-29 14:18 | 只看该作者
#define        BUS_BITS                16//定义了总线位宽
#define        BUS_IO15_PIN        GPIO_PIN_12
#define        BUS_IO15_PORT        GPIOE
#define        BUS_IO14_PIN        GPIO_PIN_6
#define        BUS_IO14_PORT        GPIOE
#define        BUS_IO13_PIN        GPIO_PIN_10
#define        BUS_IO13_PORT        GPIOE
#define        BUS_IO12_PIN        GPIO_PIN_5
#define        BUS_IO12_PORT        GPIOE
#define        BUS_IO11_PIN        GPIO_PIN_7
#define        BUS_IO11_PORT        GPIOE
#define        BUS_IO10_PIN        GPIO_PIN_4
#define        BUS_IO10_PORT        GPIOE
#define        BUS_IO9_PIN        GPIO_PIN_8
#define        BUS_IO9_PORT        GPIOE
#define        BUS_IO8_PIN        GPIO_PIN_2
#define        BUS_IO8_PORT        GPIOE

#define        BUS_IO7_PIN        GPIO_PIN_11
#define        BUS_IO7_PORT        GPIOB
#define        BUS_IO6_PIN        GPIO_PIN_9
#define        BUS_IO6_PORT        GPIOF
#define        BUS_IO5_PIN        GPIO_PIN_10
#define        BUS_IO5_PORT        GPIOB
#define        BUS_IO4_PIN        GPIO_PIN_7
#define        BUS_IO4_PORT        GPIOF
#define        BUS_IO3_PIN        GPIO_PIN_15
#define        BUS_IO3_PORT        GPIOE
#define        BUS_IO2_PIN        GPIO_PIN_8
#define        BUS_IO2_PORT        GPIOF
#define        BUS_IO1_PIN        GPIO_PIN_14
#define        BUS_IO1_PORT        GPIOE
#define        BUS_IO0_PIN        GPIO_PIN_3
#define        BUS_IO0_PORT        GPIOE

使用特权

评论回复
8
god9987| | 2017-3-29 14:19 | 只看该作者
GPIO_TypeDef * BUS_PORT[BUS_BITS]={BUS_IO0_PORT, BUS_IO1_PORT, BUS_IO2_PORT, BUS_IO3_PORT, BUS_IO4_PORT, BUS_IO5_PORT, BUS_IO6_PORT, BUS_IO7_PORT,
                                                                        BUS_IO8_PORT, BUS_IO9_PORT, BUS_IO10_PORT, BUS_IO11_PORT, BUS_IO12_PORT, BUS_IO13_PORT, BUS_IO14_PORT, BUS_IO15_PORT};
const UINT16_T BUS_PIN[BUS_BITS]={BUS_IO0_PIN, BUS_IO1_PIN, BUS_IO2_PIN, BUS_IO3_PIN, BUS_IO4_PIN, BUS_IO5_PIN, BUS_IO6_PIN, BUS_IO7_PIN,
                                                                BUS_IO8_PIN, BUS_IO9_PIN, BUS_IO10_PIN, BUS_IO11_PIN, BUS_IO12_PIN, BUS_IO13_PIN, BUS_IO14_PIN, BUS_IO15_PIN};

使用特权

评论回复
9
god9987| | 2017-3-29 14:19 | 只看该作者
void bus_init(void){
        GPIO_InitTypeDef GPIO_InitStructure;
        __GPIOB_CLK_ENABLE();
        __GPIOE_CLK_ENABLE();
        __GPIOF_CLK_ENABLE();

        GPIO_InitStructure.Pin = BUS_IO5_PIN|BUS_IO7_PIN;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStructure.Pull = GPIO_PULLUP;
        GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.Pin = BUS_IO0_PIN|BUS_IO1_PIN|BUS_IO3_PIN|BUS_IO8_PIN|BUS_IO9_PIN|BUS_IO10_PIN|BUS_IO11_PIN|BUS_IO12_PIN|BUS_IO13_PIN|BUS_IO14_PIN|BUS_IO15_PIN;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.Pin = BUS_IO2_PIN|BUS_IO4_PIN|BUS_IO6_PIN;
        HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
}

使用特权

评论回复
10
god9987| | 2017-3-29 14:20 | 只看该作者
void bus_outputmode(void){
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_InitStructure.Pin = BUS_IO5_PIN|BUS_IO7_PIN;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStructure.Pull = GPIO_PULLUP;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.Pin = BUS_IO0_PIN|BUS_IO1_PIN|BUS_IO3_PIN|BUS_IO8_PIN|BUS_IO9_PIN|BUS_IO10_PIN|BUS_IO11_PIN|BUS_IO12_PIN|BUS_IO13_PIN|BUS_IO14_PIN|BUS_IO15_PIN;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.Pin = BUS_IO2_PIN|BUS_IO4_PIN|BUS_IO6_PIN;
        HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
        bus_write16bits(0xffff);
}

使用特权

评论回复
11
god9987| | 2017-3-29 14:20 | 只看该作者
void bus_write16bits(UINT16_T val){
        UINT8_T i;

        for(i=16;i>0;i--){
                if(val&0x8000)
                        HAL_GPIO_WritePin(BUS_PORT[i-1], BUS_PIN[i-1], GPIO_PIN_SET);
                        //SET_BITS(BUS_PORT[i-1]->ODR, BUS_PIN[i-1]);
                else
                        HAL_GPIO_WritePin(BUS_PORT[i-1], BUS_PIN[i-1], GPIO_PIN_RESET);
                        //CLEAR_BITS(BUS_PORT[i-1]->ODR, BUS_PIN[i-1]);
                        
                val=val<<1;
        }
}

使用特权

评论回复
12
god9987| | 2017-3-29 14:22 | 只看该作者
UINT16_T bus_read16bits(void){
        UINT8_T i;
        UINT16_T res=0x00;
        for(i=0;i<16;i++){
                if(READ_BITS(BUS_PORT[i]->IDR, BUS_PIN[i])){
                        res =res|(1<<i);
                }
        }
        return res;
}

使用特权

评论回复
13
god9987| | 2017-3-29 14:24 | 只看该作者
这些 基本操作 就组成了最基本的 BUS 读写了
不知道是不是你想要的这种?

但是这样的速度会很慢的
也可以

使用特权

评论回复
14
god9987| | 2017-3-29 14:25 | 只看该作者
使用 mcu 驱动一个TIL9341 屏 还是非常方便的

使用特权

评论回复
15
stm32lover| | 2017-3-29 14:37 | 只看该作者
这个帖子很好!

学习了!

这个也是一直困扰我的问题!

使用特权

评论回复
16
ADZ2016| | 2017-3-29 14:38 | 只看该作者
速度 能差距多大呢?

使用特权

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

本版积分规则

473

主题

7517

帖子

30

粉丝