OpenEdv-开源电子网

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

想接收上位机的96个指令,然后在96个case里面去执行相应动作?

[复制链接]

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2022-3-28
在线时间
24 小时
发表于 2022-3-30 22:33:04 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 kaka001 于 2022-3-30 22:43 编辑

准备通过SPI2中断接收上位机的96个指令,然后在主函数96个case里面去执行相应动作。比如接收指令“1”,执行动作PA1,2,3,4设置为HLLH;接收指令“2”,执行动作PA1,2,3,4设置为LHHL,接收指令“5”,执行动作PA5,6,7,8设置为LLLL,这方式可行性高吗,还是有啥更优的方法,求教各位大佬了。
一共需要控制64个不同IO,4个一组,每组6种组合,一共96个指令。还有就是如果接收到数据“16”,转去SPI1去操作其他模块。目前准备就是SPI中断接受,然后在case里面比较。这样的话效率会不会很低,求大神帮帮忙。
本来想用原子哥的那个串口调用函数的模块,直接上位机调函数方便点。但是变成SPI通信了,改改原子哥的代码也能用?发帖的时候整理思路想出这个办法,可行吗?还是得求各位大神得方案,谢谢啦,就这些金币

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

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8465
金钱
8465
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-3-31 10:17:52 | 显示全部楼层
case太多的话,可以想办法做成查表,你看看需要控制IO口的哪些寄存器,每个寄存器做一个96元素的表,收到指令就只需去表中相应位置取值赋给寄存器即可。usmart也挺好啊。
专治疑难杂症
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-3-31 23:31:43 | 显示全部楼层
对啊,96个case,也是个人才。 查表吧。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2022-4-1 07:41:33 来自手机 | 显示全部楼层
用消息地图吧
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4716
金钱
4716
注册时间
2017-7-6
在线时间
710 小时
发表于 2022-4-1 14:43:30 | 显示全部楼层
用数组把你操作的IO口动作存起来(也就是高低电平变化),然后收到命令就去把这个数组赋值给你的IO口就行了。这个小算法你自己可以想想,不难的。
我是小白,很白很白的小白!!!
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2022-3-28
在线时间
24 小时
 楼主| 发表于 2022-4-1 14:49:28 | 显示全部楼层
正点原子 发表于 2022-3-31 23:31
对啊,96个case,也是个人才。 查表吧。

查表是指结构体数组吗
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2022-3-28
在线时间
24 小时
 楼主| 发表于 2022-4-1 14:50:59 | 显示全部楼层
程功之道 发表于 2022-4-1 14:43
用数组把你操作的IO口动作存起来(也就是高低电平变化),然后收到命令就去把这个数组赋值给你的IO口就行了。 ...

谢谢 我先好好想想
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-4-2 09:03:52 | 显示全部楼层
kaka001 发表于 2022-4-1 14:50
谢谢 我先好好想想

8段数码管原理就行
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3515
金钱
3515
注册时间
2016-3-19
在线时间
847 小时
发表于 2022-4-2 11:10:03 | 显示全部楼层
以STM32F103xxx为例

临时编写一个程序   没有硬件  所以没有进行实物验证
Command.png
/*
    说明:
    0x40010810, 0x0012000C
    寄存器地址, 管脚电平
    管脚电平分为高十六位和低十六位
    高十六位对应位为 1 代表输出高电平
    低十六位对应位为 1 代表输出低电平
*/
uint32_t CommandList[96][2] = {
    0x40010810, 0x0012000C,         // 接收指令“1”,执行动作PA1,2,3,4设置为HLLH
    0x40010810, 0x000C0012,         // 接收指令“2”,执行动作PA1,2,3,4设置为LHHL
//    ......                        // 根据项目需求,编写命令列表
};

/*
    说明:
    CommandIndex     0 -- 95
    返回 0 命令执行成功
    返回 1 命令执行失败
*/
uint8_t ExecuteCommand(uint8_t CommandIndex)
{
    if (CommandIndex >= 96)
    {
        return (1);
    }
    * (volatile uint32_t *)(CommandList[CommandIndex][0] + 0) = (uint16_t)(CommandList[CommandIndex][1] >> 0x0010);
    * (volatile uint32_t *)(CommandList[CommandIndex][0] + 4) = (uint16_t)(CommandList[CommandIndex][1] &  0xffff);
    return (0);
}
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3515
金钱
3515
注册时间
2016-3-19
在线时间
847 小时
发表于 2022-4-2 11:18:07 | 显示全部楼层
使用限制是   

同一条命令不能同时控制不同的GPIO     比如同时控制GPIOA  和 GPIOB 是不支持的

能够做到的是GPIOn 的 0 - 15 任意控制

期待更加完善的设计思路
Nothing is impossible
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2022-3-28
在线时间
24 小时
 楼主| 发表于 2022-4-20 17:20:48 | 显示全部楼层
nashui_sx 发表于 2022-4-2 09:03
8段数码管原理就行

好 这个明白了 哈哈
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2022-3-28
在线时间
24 小时
 楼主| 发表于 2022-4-21 11:26:01 | 显示全部楼层
unnormal 发表于 2022-4-2 11:10
以STM32F103xxx为例

临时编写一个程序   没有硬件  所以没有进行实物验证

准备就用这个方案 寄存器地址不能直接赋值吗 好像需要强制转换成上面你写的指针 然后在取指针的内容 ?
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3515
金钱
3515
注册时间
2016-3-19
在线时间
847 小时
发表于 2022-4-21 11:53:21 | 显示全部楼层
kaka001 发表于 2022-4-21 11:26
准备就用这个方案 寄存器地址不能直接赋值吗 好像需要强制转换成上面你写的指针 然后在取指针的内容 ?

是的   

需要通过指针方式操作  个人习惯指针操作  所以这样写的

也可以通过结构体 + 指针 的操作方式    类似官方库的写法

不过我觉得  最终都是指针操作   还不如直接使用指针来得方便

这也是因人而异吧   习惯哪种方式就用哪种方式  只要能够解决问题就好了
Nothing is impossible
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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