查看: 4098|回复: 3

[已解决] KEA64外部时钟问题

[复制链接]

该用户从未签到

14

主题

26

帖子

0

注册会员

Rank: 2

积分
184
最后登录
2017-12-17
发表于 2016-11-8 21:10:49 | 显示全部楼层 |阅读模式
使用KEA64遇到如下问题:自己做了一块PCB,外接8M晶振+22pf电容+1M电阻;调试硬件时,发现配置内部晶振
void Clk_Init()
{
        ICS_C1|=ICS_C1_CLKS_MASK;                 /* Enable the internal reference clock*/
        ICS_C3= 0x90;                                                /* Reference clock frequency = 31.25 KHz*/               
        while(!(ICS_S & ICS_S_LOCK_MASK));   /* Wait for PLL lock, now running at 40 MHz (1280 * 31.25Khz) */               
    ICS_C2|=ICS_C2_BDIV(1)  ;                         /*BDIV=2, Bus clock = 20 MHz*/
        ICS_S |= ICS_S_LOCK_MASK ;                         /* Clear Loss of lock sticky bit */       
}
这个可以使用,串口9600。
配置外部晶振时
void SystemCoreClockUpdate (void) {

  uint32_t ICSOUTClock;                                                        /* Variable to store output clock frequency of the ICS module */
  uint8_t Divider;

  if ((ICS->C1 & ICS_C1_CLKS_MASK) == 0x0u) {
    /* Output of FLL is selected */
    if ((ICS->C1 & ICS_C1_IREFS_MASK) == 0x0u) {
      /* External reference clock is selected */
      ICSOUTClock = CPU_XTAL_CLK_HZ;                                         /* System oscillator drives ICS clock */
      Divider = (uint8_t)(1u << ((ICS->C1 & ICS_C1_RDIV_MASK) >> ICS_C1_RDIV_SHIFT));
      ICSOUTClock = (ICSOUTClock / Divider);  /* Calculate the divided FLL reference clock */
      if ((OSC->CR & OSC_CR_RANGE_MASK) != 0x0u) {
        ICSOUTClock /= 32u;                                                  /* If high range is enabled, additional 32 divider is active */
      }
    } else {
      ICSOUTClock = CPU_INT_CLK_HZ;                                          /* The internal reference clock is selected */
    }
    ICSOUTClock *= 1280u;                                                    /* Apply 1280 FLL multiplier */
  } else if ((ICS->C1 & ICS_C1_CLKS_MASK) == 0x40u) {
    /* Internal reference clock is selected */
    ICSOUTClock = CPU_INT_CLK_HZ;
  } else if ((ICS->C1 & ICS_C1_CLKS_MASK) == 0x80u) {
    /* External reference clock is selected */
    ICSOUTClock = CPU_XTAL_CLK_HZ;
  } else {
    /* Reserved value */
    return;
  }
  ICSOUTClock = ICSOUTClock >> ((ICS->C2 & ICS_C2_BDIV_MASK) >> ICS_C2_BDIV_SHIFT);
  SystemCoreClock = (ICSOUTClock / (1u + ((SIM->CLKDIV & SIM_CLKDIV_OUTDIV1_MASK) >> SIM_CLKDIV_OUTDIV1_SHIFT)));

}

发现KEA64的倍频是1024,不是1280.做了如下测试
倍频 1024  串口波特率设置寄存器 BRU =0,BRL =128,发出的数据不正常
倍频 1024  串口波特率设置寄存器 BRU =0,BRL =109,发出的数据不正常
倍频 1280  串口波特率设置寄存器 BRU =0,BRL =128,发出的数据不正常
倍频 1280  串口波特率设置寄存器 BRU =0,BRL =109,发出的数据不正常

程序的void SystemInit (void) 中的#define DISABLE_WDOG    1,#define CLOCK_SETUP     0
KEIL5环境开发,不知道这个外部时钟到底怎么设置?


另外 KEA64  的CANTX 接收发器的TXD还是RXD,这个我在有的中文翻译手册看到对CANTXD的解释是接收数据。。。


最佳答案

只要你不把该口的ALT 选在NMI功能就可以了
回复

使用道具 举报

该用户从未签到

719

主题

6378

帖子

0

超级版主

Rank: 8Rank: 8

积分
25350
最后登录
2025-8-29
发表于 2016-11-9 16:01:54 | 显示全部楼层
是1024 2016-11-09_15-59-23.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

26

帖子

0

注册会员

Rank: 2

积分
184
最后登录
2017-12-17
 楼主| 发表于 2016-11-10 11:16:47 | 显示全部楼层

如何禁止PTB4/NMI,外部不可屏蔽中断,现在这个脚接到SPI线了
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

9

帖子

0

新手上路

Rank: 1

积分
27
最后登录
1970-1-1
发表于 2016-11-10 16:24:37 | 显示全部楼层
只要你不把该口的ALT 选在NMI功能就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-31 05:11 , Processed in 0.096879 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表