打印
[其它]

合泰单片机时基中断和计时器中断

[复制链接]
436|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原来是wjc|  楼主 | 2023-2-28 01:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
原来是wjc|  楼主 | 2023-2-28 01:04 | 只看该作者


使用特权

评论回复
板凳
原来是wjc|  楼主 | 2023-2-28 01:04 | 只看该作者
这里有2个timebase–timebase0和timebase1,选择fsub(低频时钟)作为timebase的时钟源ftb (我的fsub=32.768khz)
timebase1的产生一次中断周期是2^15/ftb (1)秒
timebase0的产生一次中断周期是2^10/ftb (1024/32768)秒

 
_tb1e=1;
_emi=1;
//上面两个bit是用来控制时基中断的中的标志位,可以去datasheet里查询,简单一点就到下面的中断结构图中去查找

使用特权

评论回复
地板
原来是wjc|  楼主 | 2023-2-28 01:05 | 只看该作者
写时基中断函数


版权声明:本文为CSDN博主「Armind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Armind/article/details/106239188

使用特权

评论回复
5
原来是wjc|  楼主 | 2023-2-28 01:05 | 只看该作者

void        __attribute((interrupt(0x18)))        isr_time_base1(void)//這裡要參考“中斷結構”---時基1中斷的地址是0x18
{
                _tb1f=0;  //进入中断函数后,这个请求位要置0

        if(off_tmr!=0)
        {
                off_tmr--;
                if(off_tmr==0)
                {
                        sleep_flag=1;//这个功能是在别的地方给off_tmr赋值,如果off_tmr不为=0,就开始倒计时,倒计时到0的时候,sleep_flag置1
                }
        }

}

使用特权

评论回复
6
原来是wjc|  楼主 | 2023-2-28 01:05 | 只看该作者
到这里不算完,因为合泰单片机自动初始化了看门狗,一定要注意看门狗的喂狗时间,会不会影响到time_base中断。这里给出喂狗函数GCC_CLRWDT();

使用特权

评论回复
7
原来是wjc|  楼主 | 2023-2-28 01:05 | 只看该作者
计时器中断及初始化
计时器中断初始化
同样的道理,根据datasheet给寄存器赋值
详情参考他的博文 讲的非常好

引用文本
https://blog.csdn.net/weixin_44783974/article/details/89278887

使用特权

评论回复
8
原来是wjc|  楼主 | 2023-2-28 01:06 | 只看该作者
void time_init()
{  //我这里的系统频率是4.9152MHz,我要求10ms进入一次计时器中断
_stm3c0=0b00110000;  //频率Fh/64= 4.9152Mhz/64=76KHZ=13us即计数器加一次就要13us
_stm3c1=0b11000001;
//从0加到10ms 需要进入769次(近似)
_stm3al=769%256;         //这里要除以256(规定) =1      ccra比较器的低8位
_stm3ah=769/256;  //这里要除以256(规定就要除256)=3  ccra比较器的高2位
//高2位和低8位合起来就是0b11 00000001
_t3on=1;
//计数器加1次要13us 加769次就是10ms   进入中断
   _emi=1;
  _t3ae=1;//標準計時器3的中断控制位,根據中斷結構看到的
  _mf3e=1;//多功能中斷控制位,根據中斷結構看到的       
}

使用特权

评论回复
9
原来是wjc|  楼主 | 2023-2-28 01:06 | 只看该作者
当然中断结构图也是要参考的

使用特权

评论回复
10
原来是wjc|  楼主 | 2023-2-28 01:06 | 只看该作者
写计时器中断
 void        __attribute((interrupt(0x24)))        isr_time0(void)
{        //10MS


        _t3af=0; //进入中断函数后,这个请求位要置0
        key_loop++;
        if(key_loop>9)
        {
                key_loop=0;
                key_scan_flag=1;
        }
        //-------------------------------

}

使用特权

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

本版积分规则

76

主题

978

帖子

0

粉丝