Re: [问题] 有关于MCU去改某颗IC暂存器之值

楼主: kikiqqp (喵食罐头)   2013-07-08 10:55:43
※ 引述《Acekirisame (达陆趁现在!)》之铭言:
: 各位先进
: 我在工作上遇到了一些瓶颈,希望有先进给我点起头
: 目前我正在想把MCU跟某个IC结合在一起,那IC有共有17个register
: 位址分别是0x01,0x02,0x03...0x0A等等,读写功能也不太一样
: 我目前想用C++ languge写,那我要怎么宣告那些register,
: 宣告之后并各别丢我要的bit进去.
: unsigned char portA @port 0x01;
: main()
: {
: portA |= 1 << 0 ;
: portA &= ~(1 << 2) ; /* 之类的等等
: }
: 不过第一行的语法应该是错的,不知道先进有何建议
两个部份
1. 宣告那些register
通常(懒人)的作法是透过前处理来做
#define PT1_PORT (*(unsigned int *)0x20400)
#define PT1_UP (*(unsigned int *)0x20404)
#define PT1_EN (*(unsigned int *)0x20408)
#define PT1_IE (*(unsigned int *)0x2040C)
这样程式中只要写
dac_00 = 0x7FFFFFFF;
就直接改变了整个暂存
至于宣告各暂存器名称呢?
照本宣科宣告
#define PT10 0 /* PT 1.0 */
#define PT11 1 /* PT 1.1 */
#define PT12 2 /* PT 1.2 */
#define PT13 3 /* PT 1.3 */
2. 怎么改
其实如果您使用高阶语言其实不建议这样处理,很多厂商都有写好最佳化的Lib可以用
但说真的单(或多)位元控制在周边操作上非常方便
我通常会做个宏如下
#define BSF(var, bit) ((var) |= (1LL << (bit))) // 设 1
#define BCF(var, bit) ((var) &= ~(1LL << (bit))) // 设 0
#define GETBIT(var, bit) (((var) & (1LL << (bit))) ? 1 : 0) // 查状态
控制暂存器某一位元就会写成
BSF(PT1_PORT, PT10);
最后,跟其他 IC连接就先搞懂通讯格时,充份利用可以使用的周边和Lib Code
(例如有的只要写 SPI_SEND(DATA); 就把 DATA丢出去了,连送多少Bit都不用管)
除非您是使用纯 ASM,不然现在 C语言开发环境大多很轻松愉快
作者: Acekirisame (达陆趁现在!)   2013-07-08 13:17:00
非常感谢回复,我会试着把各个版友说的整合并学起来!

Links booklink

Contact Us: admin [ a t ] ucptt.com