打印
[开发工具]

【AT-START-F425测评】时钟配置代码自动生成

[复制链接]
3089|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhanzr21 于 2022-3-26 21:43 编辑

最近拿到了AT-START-F425 开发板, 比较喜欢, 写一点使用的心得体会.

虽说是作为大牌产品的替代, 看得出来雅特力做产品还是很用心的. 这个公司是联电下面的子公司, 办公室设在重庆.

使用过ST产品的开发者会对CubeMX这个产品爱不释手, 因为通过图形化和模块化配置大大降低了重复单调的工作. 其它厂家, 不管国外国内还没有见到望其项背的类似工具. 所以只要有机会, 我都会使用ST的产品来快速搭建原型, 因为确实快.

雅特力的工程师似乎也有此想法, 所以我看到下载网站上有不少提高工程师效率的自研工具. 坦白说, 这些工具没有形成一个中心的控制点, 内容比较杂散, 用起来肯定还是跟领先者有不小的差距, 不过总算是个好的开端. 可以预料厂商会持续在此方向发力.

本帖发一个简单的时钟配置的工具使用过程, 也算是板子的一个测评.

拿到板子后, 参考BSP的例子, 写了一个串口+LED的程序, 发现默认时钟竟然是8MHz. 于是想配置下PLL, 想使用到最高的96MHz. 没有CubeMX的时代, 工程师们就是一页页翻参考手册的寄存器, 看看哪个bit代表什么, 就算有了标准外设库, 其实也需要慢慢跟参考手册一起对着看.
自从用过CubeMX的自动时钟配置后, 我早就对这种耗时费力的外设初始化方法深恶痛绝, 所以第一想法就是翻一翻厂商的网站, 看有没有类似的工程给我copy一段时钟配置的代码来. 意外发现了这个东西:
https://www.arterytek.com/download/TOOL/AT32_New_Clock_Configuration.zip

打开一看确实是我需要的工具, 即 可以自动生成时钟配置代码.

试用了一把, 感觉很方便, 当然跟CubeMX的全套方案还是差太远了, 但是如果你只是想配置时钟, 那么体验差不多.

下载, 不用安装, 绿色版,解压就可以.

打开, 新建工程, 选择型号

再就是在界面上配置你硬件时钟多少, 需要PLL输出多少, 还包含USB, 外设等相关时钟配置. 这里我就想把系统时钟调到最高96MHz.

配置好了, 就点生成代码就可以了. 会生成.c和.h文件, 还会生成整个芯片的配置文件和一个main.c的框架. 给用户做参考.

看看生成的时钟配置代码实现:
/* includes ------------------------------------------------------------------*/
#include "at32f425_clock.h"

/**
  *  system clock config program
  *   the system clock is configured as follow:
  *         - system clock        = hext * pll_mult
  *         - system clock source = pll (hext)
  *         - hext                = 8000000
  *         - sclk                = 96000000
  *         - ahbdiv              = 1
  *         - ahbclk              = 96000000
  *         - apb1div             = 1
  *         - apb1clk             = 96000000
  *         - apb2div             = 1
  *         - apb2clk             = 96000000
  *         - pll_mult            = 12
  *         - flash_wtcyc         = 2 cycle
  * @param  none
  * @retval none
  */
void system_clock_config(void)
{
  /* config flash psr register */
  flash_psr_set(FLASH_WAIT_CYCLE_2);


  /* reset crm */
  crm_reset();

  /* enable hext */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

   /* wait till hext is ready */
  while(crm_hext_stable_wait() == ERROR)
  {
  }

  /* config pll clock resource */
  crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_12);

  /* enable pll */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  /* wait till pll is ready */
  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  {
  }

  /* config ahbclk */
  crm_ahb_div_set(CRM_AHB_DIV_1);

  /* config apb2clk */
  crm_apb2_div_set(CRM_APB2_DIV_1);

  /* config apb1clk */
  crm_apb1_div_set(CRM_APB1_DIV_1);

  /* select pll as system clock source */
  crm_sysclk_switch(CRM_SCLK_PLL);

  /* wait till pll is used as system clock source */
  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  {
  }

  /* update system_core_clock global variable */
  system_core_clock_update();
}
这个时钟配置函数需要用户在自己的代码中调用, 所以也同时生成了一个例子main.c的框架, 其实个人觉得这个没啥必要, 因为调用其实也简单. 说明书中说清楚即可.
#include "at32f425_clock.h"

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
  system_clock_config();

  while(1)
  {
  }
}
这是我的例子的main.c
#include "at32f425.h"
#include "custom_at32f425_board.h"
#include "at32f425_clock.h"

__IO uint32_t g_Ticks;

int main(void) {
  system_clock_config();

  uint32_t lockTick;
  uint32_t deltaTick;
  
  /* System timer configuration */
  SysTick_Config(system_core_clock / 1000);
  
        uart_print_init(115200);
        at32_board_init();
        
  printf("AT START F425 Board @%u MHz\n", system_core_clock/(1000000));
        printf("Boot Mem:%02X\n", scfg_mem_map_get());
  while (1) {
                printf("%u MHz, Ticks:%u\n", system_core_clock/(1000000), g_Ticks);
               
    lockTick = g_Ticks;
    while ((lockTick + 200) > g_Ticks) {
      __NOP();
      __WFI();
    }               
                at32_led_toggle(LED2);
               
    lockTick = g_Ticks;
    while ((lockTick + 400) > g_Ticks) {
      __NOP();
      __WFI();
    }
                at32_led_toggle(LED3);
               
                lockTick = g_Ticks;
    while ((lockTick + 800) > g_Ticks) {
      __NOP();
      __WFI();
    }
                at32_led_toggle(LED4);
  }
}
通过观察串口, 可以看到时钟已经配置到想要的96MHz.


使用的过程中, 发现这个工具也有点小毛病, 但是瑕不掩瑜, 不影响使用. 虽然希望官方工程师还是继续改进下.

1. 英文版本菜单那里, 单词拼写错了, Generate Code拼写成了General Code
2. 自动检测新版本的功能有误, 我使用的时候, 说是检测到了新版本, 然后下载了个跟当前使用一模一样的版本(使用sha256检查过,确实一样). 不知道检测还是下载逻辑有误.

希望官方工程师持续研发这种方便用户的工具.


这个分享到此为止, 本贴对应的代码下载地址:
https://github.com/zhanzr/at32f425-prj.git
下贴再见

使用特权

评论回复
沙发
muyichuan2012| | 2022-3-27 12:19 | 只看该作者
感谢反馈,下一版会修正你说的问题

使用特权

评论回复
板凳
zhanzr21|  楼主 | 2022-3-27 14:13 | 只看该作者
muyichuan2012 发表于 2022-3-27 12:19
感谢反馈,下一版会修正你说的问题

期待新版本

使用特权

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

本版积分规则

个人签名:每天都進步

91

主题

1012

帖子

34

粉丝