[技术问答]

新唐M051BSP函数库问题?谢谢指教

[复制链接]
1267|6
手机看帖
扫描二维码
随时随地手机跟帖
sdlzwcg|  楼主 | 2018-1-5 11:01 | 显示全部楼层 |阅读模式
最近找了一下5V的CORTEX-M芯片,重点看了一下新唐的M0516LDN,刚开始看函数库,看看系统初始化。
时钟部分函数,有一个有问题,详细如下:
/**
  * @brief      Set HCLK clock source and HCLK clock divider
  * @param[in]  u32ClkSrc is HCLK clock source. Including :
  *             - \ref CLK_CLKSEL0_HCLK_S_HXT
  *             - \ref CLK_CLKSEL0_HCLK_S_PLL
  *             - \ref CLK_CLKSEL0_HCLK_S_LIRC
  *             - \ref CLK_CLKSEL0_HCLK_S_HIRC
  * @param[in]  u32ClkDiv is HCLK clock divider. Including :
  *             - \ref CLK_CLKDIV_HCLK(x)
  * @return     None
  * @Details    This function set HCLK clock source and HCLK clock divider.
  *             The register write-protection function should be disabled before using this function.
  */
void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv)
{
    uint32_t u32HIRCSTB;

    /* Read HIRC clock source stable flag */   
    u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;

    /* Switch to HIRC for Safe. Avoid HCLK too high when applying new divider. */
    CLK->PWRCON |= CLK_CLKSTATUS_OSC22M_STB_Msk;
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);  
    CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | CLK_CLKSEL0_HCLK_S_HIRC;

    /* Apply new Divider */
    CLK->CLKDIV = (CLK->CLKDIV & (~CLK_CLKDIV_HCLK_N_Msk)) | u32ClkDiv;

    /* Switch HCLK to new HCLK source */
    CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | u32ClkSrc;   

    /* Update System Core Clock */
    SystemCoreClockUpdate();

    /* Disable HIRC if HIRC is disabled before switching HCLK source */
    if( u32HIRCSTB == 0 )
        CLK->PWRCON &= ~CLK_CLKSTATUS_OSC22M_STB_Msk;              
}


问题语句1:
/* Switch to HIRC for Safe. Avoid HCLK too high when applying new divider. */
    CLK->PWRCON |= CLK_CLKSTATUS_OSC22M_STB_Msk;

是否应为:CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

问题语句2:
if( u32HIRCSTB == 0 )
        CLK->PWRCON &= ~CLK_CLKSTATUS_OSC22M_STB_Msk;   

是否应为:
if( u32HIRCSTB == 0 )
        CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk;


这是官网下载的BSP,不知大家用的如何?
刚开始看,就出问题,不知后面还有没有?
新唐芯片用的少?怎么没及时修正?
欢迎指教。
jliu_nuvoton| | 2018-1-5 13:17 | 显示全部楼层
如你所说这两条语句确实有问题,你改的也是对的。
我们会及时修正这个错误,谢谢你

使用特权

评论回复
dongliushui| | 2018-1-8 13:59 | 显示全部楼层
jliu_nuvoton 发表于 2018-1-5 13:17
如你所说这两条语句确实有问题,你改的也是对的。
我们会及时修正这个错误,谢谢你 ...

新唐大神,ARM9系列的资料,新唐官网怎么没有提供下载啊。

使用特权

评论回复
dongliushui| | 2018-1-8 14:00 | 显示全部楼层
其他系列也有写错的地方,那个库函数有的宏写错了。被网友发现了。

使用特权

评论回复
用的时候还要配合手册,一步一步走,有疑问的,还是以手册为准,修改。

使用特权

评论回复
海中陆地| | 2018-5-15 16:38 | 显示全部楼层
哥们,你的库函数跟我的不一样啦,是我的库太老了,还是你的哟?我的是:M051_Series_BSP_CMSIS_Rev3.00.001。
这个库我发现有个函数也有问题,也不知道是不是我看错了。我改了自己认为是正常了
PWM函数:uint32_t PWM_ConfigOutputChannel(PWM_T *pwm,uint32_t u32ChannelNum,uint32_t u32Frequency,uint32_t u32DutyCycle);

问题是:你前面设置好了PWM时钟来源,但这下面的部分会找错通道2,3,的PWM时钟源
文件:pwm.c   127行开始
   if(pwm == PWMA)
        //库函数问题部分
        //u32Src = (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk << (u32ChannelNum >> 1))) >> (CLK_CLKSEL1_PWM01_S_Pos << (u32ChannelNum >> 1));
        //自己修改部分       
        u32Src = (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM01_S_Msk << ((u32ChannelNum >> 1)<<1))) >> (CLK_CLKSEL1_PWM01_S_Pos + ((u32ChannelNum >>1)<<1));
    else /*pwm == PWMB*/
        //库函数问题部分
        //u32Src = (CLK->CLKSEL2 & (CLK_CLKSEL2_PWM45_S_Msk << (u32ChannelNum >> 1))) >> (CLK_CLKSEL2_PWM45_S_Pos << (u32ChannelNum >> 1));
        //自己修改部分
        u32Src = (CLK->CLKSEL2 & (CLK_CLKSEL2_PWM45_S_Msk << ((u32ChannelNum >> 1)<<1))) >> (CLK_CLKSEL2_PWM45_S_Pos + ((u32ChannelNum >>1)<<1));

希望官方把库维护好呀。

使用特权

评论回复
xinpian101| | 2018-7-18 18:07 | 显示全部楼层
jliu_nuvoton 发表于 2018-1-5 13:17
如你所说这两条语句确实有问题,你改的也是对的。
我们会及时修正这个错误,谢谢你 ...

https://bbs.21ic.com/icview-2531138-1-1.html
大神,这些老掉牙的库去哪儿下?

使用特权

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

本版积分规则

2

主题

22

帖子

1

粉丝