打印
[其他ST产品]

ST7系列单片机可以位寻址吗?

[复制链接]
3312|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
redchj|  楼主 | 2007-4-5 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如某个端口,例如PA3,可以直接PA3 = 0;或者if(PA3)这样操作吗?如果定义了某个位变量X,可以X = 0;这种操作吗?
沙发
浪淘沙| | 2007-4-5 17:43 | 只看该作者

ST7系列单片机有四种位操作指令

ST7系列单片机有四种位操作指令:
BSET - 指定位置1
BRES - 指定位清0
BTJT - 当指定位为1时转移
BTJF - 当指定位为0时转移

这四种位操作指令可以对地址为00H-FFH范围内的任意单元的任意位操作,功能十分强大。

C编译是否能产生这些位操作指令,依编译器而定,我们推荐的COSMIC编译器支持产生位操作指令。

使用特权

评论回复
板凳
redchj|  楼主 | 2007-4-5 21:02 | 只看该作者

那么是不是说可以通过判断某个脚为高或者低跳转

我用cosmic编译器,可以if(PA3),then 什么拉?

使用特权

评论回复
地板
MicroMMU| | 2007-4-5 23:11 | 只看该作者

能不能解下。

“这四种位操作指令可以对地址为00H-FFH范围内的任意单元的任意位操作,功能十分强大”

00H-FFH不是FLASH单元吗

使用特权

评论回复
5
浪淘沙| | 2007-4-6 08:13 | 只看该作者

ST7系列单片机的位寻址指令

ST7系列单片机中,一般80H-FFH共128个字节为RAM,从00H开始向高地址是所有片上外设的寄存器区,根据不同芯片的配置寄存器区有大有小,剩下的地址空间基本是空白(什么都没有)。

例如ST7Lite0系列的芯片:
  00H-3AH段是寄存器区,
  3BH-7FH段是保留区,
  80H-FFH段是RAM区。

再比如ST72324B:
  00H-72H段是寄存器区,
  73H-7FH段是保留区,
  80H-FFH段是RAM区。

根据上述说明,寄存器区处于位寻址指令的访问范围,所以3楼问题的答案是肯定的。

使用特权

评论回复
6
redchj|  楼主 | 2007-4-6 09:59 | 只看该作者

好!谢谢!

那我就试试了,谢谢!我看ST72324的定时器不能控制它运行和停止,系统复位后立即启动,而且初装值固定,这样不是很不方便?

使用特权

评论回复
7
jiangzz| | 2007-4-6 14:22 | 只看该作者

我也是刚开始用ST7

我想redchj的问题和我的一样,就是怎样方便的用C写出对每一位I/O口读写操作的语句。
ST的FAE建议是用define内嵌汇编。我个人更倾向于在C里用结构体,(我觉得这样写好了底层,方便同事一起用)但我搞不清楚和汇编的接口如何写。高人浪淘沙能否指点两句?多谢了!

使用特权

评论回复
8
浪淘沙| | 2007-4-6 15:52 | 只看该作者

打开编译器的优化选项,编译器自动使用ST7的位寻址指令


以我以前发过的一个帖子为例:ST7 16位通用定时器中的输出比较功能(Output Compare)详解

下面是部分源程序:
@interrupt void INT_TimerA(void)
{
    CSR = TACSR;  // 读CSR寄存器涉及到清除状态标志位,
    // 所以不适宜反复读,应将CSR的值读到一个变量中
    // 再对这个变量进行判断
    if (CSR & CSR_OCF1) { // 判断是否为输出比较1的中断
        TAOC1HR = Timer_Step >> 8;
        TAOC1LR = Timer_Step; // 重置输出比较寄存器
        Timer_Step += OC1_10us; // 为下次重置输出比较寄存器做好准备
        TimerTick++;
        return;
    }

    if (CSR & CSR_TOF) { // 若有计数器溢出标志
        TACLR;  // 清除该标志
        return;
    }
// 一个定时器中的两路输出比较中断不能单独使能
// 这里必须清除另一路输出比较的中断
    if (CSR & CSR_OCF2) { // 判断是否为输出比较2的中断
        TAOC2LR; // 读低八位清除输出比较2的标志
        return;
    }
}

下面是经编译后的汇编对照(带优化选项),箭头指示的指令就是位寻址指令:

使用特权

评论回复
9
redchj|  楼主 | 2007-4-9 09:51 | 只看该作者

定时器的中断不能单独使能?

我也仔细看了定时器部分,好像输出比较中断是一起使能的,其实是不设置输入捕获和其他功能,从而默认选择的输出比较中断功能,是不是?还有我用COSMIC编译器,我改了部分代码之后编译,总是出错,而且我怎么都找不到错误,于是关闭RIDE,从新打开,居然就好了,我很纳闷.现在怀疑是每次改过之后都要存盘才行,是不是?

使用特权

评论回复
10
浪淘沙| | 2007-4-9 11:07 | 只看该作者

不太明白你的意思。每个定时器有多个中断事件,但......

每个定时器有多个中断事件,这些中断事件相或共同产生一个中断触发源,对应一个中断向量,CPU在收到定时器的中断请求时,需读出控制/状态寄存器(CSR)以判断是哪个中断事件引起的中断。

在控制寄存器1中有多个中断屏蔽位,每个中断事件都可以被使能或被屏蔽。


至于你每次修改编译后出错,因为不知道你出的是什么错误,所以无法判断。

使用特权

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

本版积分规则

12

主题

57

帖子

0

粉丝