本帖最后由 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
下贴再见
|
|