牛卧堂MCU技术交流

标题: MINI51BSPBUG? [打印本页]

作者: 重庆酱油仔    时间: 2014-1-13 11:07
标题: MINI51BSPBUG?
如题在官网下载的MINNI51BSP 使用中发现在设置时钟时,
1    CLK_SetModuleClock(PWM01_MODULE,CLK_CLKSEL1_PWM01_S_HCLK,1);
2    CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_IRC22M,CLK_CLKDIV_UART(1));
先写句子2,再写1,串口的时钟会被关闭。查阅BSP的内容发现内部用宏命令处理时执行如下语句时,
u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;会自动给关闭掉UART的时钟。请问是否有人关注到此问题,是否为BUG。


作者: chenwenbin    时间: 2014-1-13 17:06
请问你用的是哪个版本的BSP,u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;这个只是对对应IP位进行操作,应该不会影响到其他IP的
作者: 重庆酱油仔    时间: 2014-1-14 10:33
本帖最后由 重庆酱油仔 于 2014-1-14 10:35 编辑

Mini51DESeriesBSP_CMSIS_v3.00.001;
人肉验证,绝不雌黄!
感觉问题应该在 & ~MODULE_CLKSEL_Msk(u32ModuleIdx;可能有位标记错误。但没弄明白他里面的位怎么标记的,不敢轻易动手!

作者: zhbbhz    时间: 2014-1-15 09:37
升级有时是必要的!
作者: a_ziliu    时间: 2014-1-15 17:59
不是bug,裡面有作判斷。
void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv)
{
  uint32_t u32tmp=0,u32sel=0,u32div=0;
   
  if(MODULE_CLKSEL_Msk(u32ModuleIdx)!=MODULE_NoMsk)
  {
    u32sel = (uint32_t)&CLK->CLKSEL0+((MODULE_CLKSEL(u32ModuleIdx))*4);
    u32tmp = *(volatile uint32_t *)(u32div);
    u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;   
    *(volatile uint32_t *)(u32sel) = u32tmp;
  }

  if(MODULE_CLKDIV_Msk(u32ModuleIdx)!=MODULE_NoMsk)
  {
    u32div =(uint32_t)&CLK->CLKDIV+((MODULE_CLKDIV(u32ModuleIdx))*4);
    u32tmp = *(volatile uint32_t *)(u32div);
    u32tmp = ( u32tmp & ~MODULE_CLKDIV_Msk(u32ModuleIdx)<<MODULE_CLKDIV_Pos(u32ModuleIdx) ) | u32ClkDiv;  
    *(volatile uint32_t *)(u32div) = u32tmp;   
  }
}
作者: 重庆酱油仔    时间: 2014-1-16 08:54
这个是指只有不是空的(NoMsk)  就执行下面的语句,到
u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;
时,会错误的与掉前面已经置位的数据。
作者: a_ziliu    时间: 2014-1-16 11:27
是的,但這個FUNCTION只有用在很簡單的SAMPLE CODE。
你可以按位操作的處理。
/* Enable IP clock */
    CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_PWM01_EN_Msk | CLK_APBCLK_PWM23_EN_Msk | CLK_APBCLK_PWM45_EN_Msk;

    /* Select UART clock source from external crystal*/
    CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_XTAL;
    CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_PWM01_S_Msk)| CLK_CLKSEL1_PWM01_S_HCLK;
   
作者: zhbbhz    时间: 2014-1-17 08:22
7楼是安全的用法!




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2