zhanzr21 发表于 2022-3-26 21:39

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

本帖最后由 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
* @paramnone
* @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"

/**
* @briefmain function.
* @paramnone
* @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
感谢反馈,下一版会修正你说的问题

期待新版本
页: [1]
查看完整版本: 【AT-START-F425测评】时钟配置代码自动生成