hjian508 发表于 2010-5-29 22:21:31

ARM Cortex-M0 IO口不支持位操作

试用新唐 ,发现 ARM Cortex-M0IO口不支持位操作,还不如 M3 ?

hjian508 发表于 2010-5-29 22:24:47

SetIoOpenDrain(pe0);
        SetIoOpenDrain(pe9);
        SetIoOpenDrain(pe7);
        SetIoOpenDrain(pc5);
        SetIoOpenDrain(pd6);
        SetIoOpenDrain(pc15);

        SetIoQuasi(pe0);
        SetIoQuasi(pe9);
        SetIoQuasi(pe7);
        SetIoQuasi(pc5);
        SetIoQuasi(pd6);
        SetIoQuasi(pc15);

        SetIoHi(pe0);
        SetIoHi(pe9);
        SetIoHi(pe7);
        SetIoHi(pc5);
        SetIoHi(pd6);
        SetIoHi(pc15);

        SetIoLo(pe0);
        SetIoLo(pe9);
        SetIoLo(pe7);
        SetIoLo(pc5);
        SetIoLo(pd6);
        SetIoLo(pc15);

        SetIoOut(pe0);
        SetIoOut(pe9);
        SetIoOut(pe7);
        SetIoOut(pc5);
        SetIoOut(pd6);
        SetIoOut(pc15);

        SetIoHi(pe0);
        SetIoHi(pe9);
        SetIoHi(pe7);
        SetIoHi(pc5);
        SetIoHi(pd6);
        SetIoHi(pc15);

以上代码占用了300字节。

Program Size: Code=880 RO-data=224 RW-data=16 ZI-data=1120
注销再编译
Program Size: Code=580 RO-data=224 RW-data=16 ZI-data=1120

hjian508 发表于 2010-5-29 22:27:16

#define SetIoHi( x )                        outps((x ## _port)+0x008, (inps((x ## _port)+0x008) | (1 << x ))) #define SetIoLo( x )                        outps((x ## _port)+0x008, (inps((x ## _port)+0x008) & (~(1 << x ))))
#define SetIoQuasi( x )                     outps(x ## _port, (inps( x ## _port) | (3 << (x << 1))))
#define SetIoIn( x )                        outps(x ## _port, (inps( x ## _port) & (~(3 << (x << 1)))))
#define SetIoOut( x )                         outps(x ## _port, ((inps( x ## _port) & (~(3 << (x << 1))))) | (1 << (x<<1 )))                              
#define SetIoOpenDrain( x )                   outps(x ## _port, ((inps( x ## _port) & (~(3 << (x << 1))))) | (2 << (x<<1)))         

#define GetIo(x)                           ((inps((x ## _port)+0x010) >> x) & 1)                               




//------------------------------------------------------------------------------------------------   

#define pe0_port      PE
#define pe0         0

#define pe9_port      PE
#define pe9         9

#define pe7_port      PE
#define pe7         7

#define pc5_port      PC
#define pc5         5

#define pd6_port      PD
#define pd6         6

#define pc15_port   PC
#define pc15          15



//------------------------------------------------------------------------------------------------   

#define pe0_port      PE
#define pe0         0

#define pe9_port      PE
#define pe9         9

#define pe7_port      PE
#define pe7         7

#define pc5_port      PC
#define pc5         5

#define pd6_port      PD
#define pd6         6

#define pc15_port   PC
#define pc15          15

yuhui 发表于 2010-5-30 21:40:19

。。。这不是函数调用,看到#define 后面的"##"么?每调用一次SetIoOpenDrain(x)
就嵌入一行代码:outps(x ## _port, ((inps( x ## _port) & (~(3 << (x << 1))))) | (2 << (x<<1)))
代码当然大咯

hjian508 发表于 2010-5-31 22:13:25

自己顶一下。

hjian508 发表于 2010-6-1 00:23:42

找到另一种表示方法:
C:
GPIOE->PMD.PMD0 =0x01;       //输出模式
GPIOE->DOUT.DOUT0 =1;

GPIOE->PMD.PMD9 =0x01;          //输出模式
GPIOE->DOUT.DOUT9 =0;

ASM:
    79: GPIOE->PMD.PMD0 =0x01;   //输出模式
0x00000320 6801      LDR      r1,
0x00000322 0889      LSRS   r1,r1,#2
0x00000324 0089      LSLS   r1,r1,#2
0x00000326 1C49      ADDS   r1,r1,#1
0x00000328 6001      STR      r1,
    80: GPIOE->DOUT.DOUT0 =1;
    81:
0x0000032A 6881      LDR      r1,
0x0000032C 2301      MOVS   r3,#0x01
0x0000032E 4319      ORRS   r1,r1,r3
0x00000330 6081      STR      r1,
    82: GPIOE->PMD.PMD9 =0x01;    //输出模式
0x00000332 6801      LDR      r1,
0x00000334 2303      MOVS   r3,#0x03
0x00000336 049B      LSLS   r3,r3,#18
0x00000338 4399      BICS   r1,r1,r3
0x0000033A 00E3      LSLS   r3,r4,#3
0x0000033C 18C9      ADDS   r1,r1,r3
0x0000033E 6001      STR      r1,
    83: GPIOE->DOUT.DOUT9 =0;

0x00000340 6881      LDR      r1,
0x00000342 43A9      BICS   r1,r1,r5
0x00000344 6081      STR      r1,

hjian508 发表于 2010-6-1 00:27:30

0x00000340 6881      LDR      r1,-->读
0x00000342 43A9      BICS   r1,r1,r5   -->改
0x00000344 6081      STR      r1,-->写
最少也得三条指令。

hjian508 发表于 2010-6-1 00:31:08

第二种方式得在 NUC1xx.h中的typedef __IO uint32_t GPIO_DOUT_T; 更换为
typedef struct
{
    __IO uint32_t DOUT0:1;
    __IO uint32_t DOUT1:1;
    __IO uint32_t DOUT2:1;
    __IO uint32_t DOUT3:1;
    __IO uint32_t DOUT4:1;
    __IO uint32_t DOUT5:1;
    __IO uint32_t DOUT6:1;
    __IO uint32_t DOUT7:1;
    __IO uint32_t DOUT8:1;
    __IO uint32_t DOUT9:1;
    __IO uint32_t DOUT10:1;
    __IO uint32_t DOUT11:1;
    __IO uint32_t DOUT12:1;
    __IO uint32_t DOUT13:1;
    __IO uint32_t DOUT14:1;
    __IO uint32_t DOUT15:1;
} GPIO_DOUT_T;
方可实现

plc_avr 发表于 2011-11-3 21:09:40

标记一下,正在玩M0,也为这个IO操作头痛,效率太低了,还不如AVR快,明天试一下。多谢共享!

Excellence 发表于 2011-11-3 21:29:21

呵呵。顶。

19001579 发表于 2011-11-4 14:28:55

哥,是你不理解对好不好,AVR也没有,不可以位操作好不好,就没有位指令。
本来操作的时候就需要定义来拼位操作让编译器去搞定这个事。然后在写入寄存器

Achin 发表于 2011-11-5 02:33:36

位操作,还是51的最直接,嘿嘿

用M3的位带映射还是可以的,不过这个“原子操作”的效率也算不上高

125008301 发表于 2012-2-25 09:46:23

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5414463&bbs_page_no=1&bbs_id=1032

看看这个帖子

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_722028POA2RT.jpg
(原文件名:未命名.jpg)



书籍名称:ARM Cortex-M0原理与应用实践

版本:V1.1

目录:

版权声明 1
版本管理 2
开发板预览 3
前言 5
绪论 13
初步认知篇 15
1 微控制器发展趋势 16
1.1 概述 16
1.2 ARM Cortex-M微控制器优势 17
1.3 ARM Cortex-M微控制器程序迁移 24
2 ARM概述 34
2.1 ARM 34
2.2 RISC 35
2.2.1简介 35
2.2.2 概念分析 36
2.2.3 特点 36
2.2.4 区别 37
2.2.5 种类 38
2.2.6 CPU发展 38
2.2.7 CPU的制造过程 39
3 ARM Cortex-M0 40
3.1总线架构 40
3.1.1 什么是AMBA 41
3.1.2 什么是AHB-Lite 41
3.1.3 什么是CoreSight 43
3.2 Cortex-M0的结构特点 44
3.2.1 编程模型 44
3.2.2 存储模型 46
3.2.3 异常处理 46
3.2.4 功耗管理 47
3.2.5 指令集 47
3.3 开发工具 47
4 ARM微微控制器的指令集 50
4.1 ARM微微控制器的指令的分类与格式 50
4.2 ARM指令的条件域 51
4.3 ARM指令的寻址方式 52
4.4 ARM指令集 55
5 ARM C语言编程 76
5.1 C语言简史 76
5.2 C语言特点 77
5.3数据类型 78
5.4常量和变量 79
5.5 操作符 81
5.6 控制结构 82
5.7结构体 83
5.8编译指令 83
5.9标准C库的应用 84
基础入门篇 87
6 NuMicro M051系列单片机 88
6.1 概述 88
6.2 系统管理器 89
6.3 系统存储映射 90
6.4 系统管理器控制寄存器映射 91
6.5 嵌套向量中断控制器 (NVIC) 97
6.5.1 异常模式和系统中断映射 98
6.5.2 操作描述 99
7 平台搭建与下载工具 102
7.1 平台搭建 102
7.1.1 启动程序 102
7.1.2 创建工程 103
7.1.3 编译代码 106
7.1.4 安装Nu-Link for Keil 驱动 107
7.1.5 设置Nu-Link 114
7.1.6 下载代码 119
7.1.7 调试代码 119
7.2 ISP下载 120
7.2.1 ISP下载工具概述 120
7.2.2 ISP下载步骤 121
7.3 ICP下载 124
7.3.1 ICP下载工具概述 124
7.3.2 ICP下载步骤 124
7.4 JTAG与串行调试(SWD) 128
7.4.1 JTAG简介 128
7.4.2 SWD简介 129
8 通用输入输出口 132
8.1 通用I/O模式的设置 132
8.2 相关寄存器 134
8.3 实验 135
9 定时器控制器与系统定时器 142
9.1 定时器控制器 142
9.1.1 概述 142
9.1.2 特征 142
9.1.3 定时器操作模式 142
9.1.4 相关寄存器 144
9.1.5 实验 145
9.2 系统定时器 150
9.2.1 概述 150
9.2.2 相关寄存器 150
9.2.3 示例代码 151
10 PWM发生器和捕捉定时器 152
10.1 概述 152
10.2 特征 153
10.3 功能描述 153
10.4 相关寄存器 158
10.5 实验 167
11串口控制器 173
11.1 概述 174
11.2 特性 175
11.3 相关寄存器 176
11.4 串口发送实验 185
11.5 串口收发实验 189
11.6模拟串口实验 194
12外部中断 201
12.1 外部中断简介 201
12.2 相关寄存器 201
12.3 实验 203
13看门狗 207
13.1 概述 207
13.2 特征 208
13.3 相关寄存器 208
13.4 实验 210
14 Flash内存控制器(FMC) 215
14.1 概述 215
14.2 特性 215
14.3 FMC组织结构 215
14.4 在系统编程(ISP) 218
14.5 相关寄存器 219
14.6 ISP实验 222
15 I2C总线控制器 229
15.1 概述 229
15.2 特征 229
15.3 功能描述 230
13.4 操作模式 233
15.5 相关寄存器 234
15.6 AT24C02 236
15.7 实验 238
16串行外围设备接口(SPI)控制器 248
16.1 概述 248
16.2 特性 248
16.3 功能 249
16.4 时序波形图 253
16.5 相关寄存器 255
16.6 实验 259
17模拟数字转换 268
17.1 概述 268
17.2 特征 270
17.3 操作步骤 270
17.4 相关寄存器 275
17.5 实验 281
18 RTX Kernel实时系统 286
18.1实时系统与前后台系统 286
18.2 RTX Kernel技术参数 288
18.3 RTX Kernel配置 291
18.4 RTX Kernel组成部分 293
18.5实验 299
19杂项补遗 309
19.1 详解启动文件 309
19.2 LIB的生成与使用 315
19.2.1 LIB文件的创建 315
19.2.2 LIB文件的使用 317
19.3 Hex文件 319
19.3.1 Hex的结构 319
19.3.2 Hex的数据记录 320
19.4功耗控制 322
19.4.1 相关寄存器 322
19.4.2 空闲模式唤醒实验 324
19.4.3 睡眠模式唤醒实验 327
19.5系统复位 331
19.5.1 相关寄存器 331
19.5.2 实验 332
19.6 scatter文件 334
19.6.1 scatter文件简介 335
19.6.2 实验 336
19.7 USER配置 345
19.7.1 相关寄存器 345
19.7.2 实验 346
19.8欠压电压值设定(BOD) 352
19.8.1 相关寄存器 353
19.8.2 实验 354
19.9 CMSIS编程标准 358
19.9.1 CMSIS标准的软件架构 359
19.8.2 CMSIS规范 360
19.9.3 CMSIS标准的代码实现 363
20串行输入并行输出 365
20.1 74LS164简介 365
20.2 74LS164结构 366
20.3 74LS164函数 368
21数码管 370
21.1 数码管简介 370
21.2 字型码 370
21.3 驱动方式 372
21.4 实验 373
22 LCD 381
22.1 液晶简介 381
22.2 1602液晶 381
22.2.1 LCD1602显示实验 384
22.3 12864液晶 391
22.3.1 LCD12864显示实验 396
高级通信接口开发篇 404
23 USB 405
23.1 USB简介 405
23.2 USB的电气特性与传输方式 407
23.2.1 电气特性 407
23.2.2 传输方式 407
23.2.3 总线协议 408
23.3 USB总线接口芯片CH372 409
23.4 CH372内置固件模式 424
23.4.1 内置固件模式实验 424
23.4.2 驱动安装与识别 439
23.5 CH372外部固件模式 442
23.5.1 外部固件 442
23.5.2 外部固件模式实验 444
23.5.3 USB协议 448
23.5.4 驱动安装与识别 488
24网络 491
24.1网络简介 491
24.2网络芯片ENC28J60 492
24.3 SPI指令集与命令序列 498
24.4 TCP/IP协议 500
24.5 网络实验 509
24.5.1 Ping实验 539
24.5.2 TCP实验 540
24.5.3 UDP实验 543
深入篇 546
25 深入接口 547
25.1 简介 547
25.2 校验介绍 547
25.2.1 奇偶校验 547
25.2.2 校验和 549
25.2.3 循环冗余码校验 550
25.3 数据校验实战 552
25.3.1 数据帧格式定义 553
25.3.2 实验 556
26深入编程 569
26.1 编程规范 569
26.1.1 排版 569
26.1.2 注释 571
26.1.3 标识符 573
26.1.4 函数 575
26.2 代码架构 577
26.2.1 功能模块构建 577
26.2.2 简易前后台系统构建 578
26.2.3 简易定时系统构建 591
26.3 高级应用集锦 602
26.3.1 宏 602
26.3.2 函数指针 604
26.3.3 结构体、共用体 606
26.3.4 程序优化 607
26.3.5 软件抗干扰 623
26.3.6 软件低功耗设计 625
番外篇 627
27界面开发 628
27.1 VC++2008 628
27.2 HelloWorld小程序 629
27.3实现串口通信 634
27.3.1 创建界面 634
27.3.2 添加CSerial类 634
27.3.3 编写程序 635
27.3.4 运行程序 637
附录A 开发板原理图 638
A.1 原理图 638
A.2 实物图 643
参考文献 645





点击此处下载 ourdev_722029T46WVA.pdf(文件大小:13.25M) (原文件名:ARM Cortex-M0原理与应用实践V1.2.pdf)

raja21 发表于 2012-7-4 15:52:11

学习了,谢谢!!!

yuyu87 发表于 2012-7-5 14:22:31

支持位操作的 ,有位操作的寄存器~

songzm 发表于 2012-7-13 09:34:15

学习了!!谢谢!

rejoice818 发表于 2012-7-14 09:46:40

支持I/O位操作的。

yanming 发表于 2012-7-14 11:32:50

学习了!呵呵!

njchenmin 发表于 2012-7-15 10:18:45

IO口好像可以的。

orange-208 发表于 2012-7-23 14:22:38

raja21 发表于 2012-7-4 15:52 static/image/common/back.gif
学习了,谢谢!!!

你的图像很犀利、、、{:lol:}

coobot 发表于 2012-7-25 13:53:48

本帖最后由 coobot 于 2012-7-25 13:56 编辑

io口应该是支持位操作的

rejoice818 发表于 2013-8-17 23:44:53

可以,经常位操作。
页: [1]
查看完整版本: ARM Cortex-M0 IO口不支持位操作