[其它] 合泰单片机时基中断和计时器中断

[复制链接]
838|9
 楼主| 原来是wjc 发表于 2023-2-28 01:03 | 显示全部楼层 |阅读模式
合泰单片机时基中断和计时器中断

在工作中使用到了合泰单片机,以HT67F5660为例子

一、时基中断以及初始化时基中断初始化

  1. void time_base_init()
  2. {

  3.         _tbc=0b10110010;
  4.         _tb1e=1;//时基1的中断控制位,根據中斷結構看到的
  5.         _emi=1;
  6. }



 楼主| 原来是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)秒


  1. _tb1e=1;
  2. _emi=1;
  3. //上面两个bit是用来控制时基中断的中的标志位,可以去datasheet里查询,简单一点就到下面的中断结构图中去查找
 楼主| 原来是wjc 发表于 2023-2-28 01:05 | 显示全部楼层
写时基中断函数


版权声明:本文为CSDN博主「Armind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Armind/article/details/106239188
 楼主| 原来是wjc 发表于 2023-2-28 01:05 | 显示全部楼层

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

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

  12. }

 楼主| 原来是wjc 发表于 2023-2-28 01:05 | 显示全部楼层
到这里不算完,因为合泰单片机自动初始化了看门狗,一定要注意看门狗的喂狗时间,会不会影响到time_base中断。这里给出喂狗函数GCC_CLRWDT();
 楼主| 原来是wjc 发表于 2023-2-28 01:05 | 显示全部楼层
计时器中断及初始化
计时器中断初始化
同样的道理,根据datasheet给寄存器赋值
详情参考他的博文 讲的非常好

引用文本
https://blog.csdn.net/weixin_44783974/article/details/89278887
 楼主| 原来是wjc 发表于 2023-2-28 01:06 | 显示全部楼层
  1. void time_init()
  2. {  //我这里的系统频率是4.9152MHz,我要求10ms进入一次计时器中断
  3. _stm3c0=0b00110000;  //频率Fh/64= 4.9152Mhz/64=76KHZ=13us即计数器加一次就要13us
  4. _stm3c1=0b11000001;
  5. //从0加到10ms 需要进入769次(近似)
  6. _stm3al=769%256;         //这里要除以256(规定) =1      ccra比较器的低8位
  7. _stm3ah=769/256;  //这里要除以256(规定就要除256)=3  ccra比较器的高2位
  8. //高2位和低8位合起来就是0b11 00000001
  9. _t3on=1;
  10. //计数器加1次要13us 加769次就是10ms   进入中断
  11.    _emi=1;
  12.   _t3ae=1;//標準計時器3的中断控制位,根據中斷結構看到的
  13.   _mf3e=1;//多功能中斷控制位,根據中斷結構看到的       
  14. }
 楼主| 原来是wjc 发表于 2023-2-28 01:06 | 显示全部楼层
当然中断结构图也是要参考的

 楼主| 原来是wjc 发表于 2023-2-28 01:06 | 显示全部楼层
写计时器中断
  1. void        __attribute((interrupt(0x24)))        isr_time0(void)
  2. {        //10MS


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

  11. }

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

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部