找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] MINI51BSPBUG?

[复制链接]
跳转到指定楼层
楼主
重庆酱油仔 发表于 2014-1-13 11:07:18 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
如题在官网下载的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。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

8#
zhbbhz 发表于 2014-1-17 08:22:50 | 只看该作者
7楼是安全的用法!
回复 支持 反对

使用道具 举报

7#
a_ziliu 发表于 2014-1-16 11:27:24 | 只看该作者
是的,但這個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;
   
回复 支持 反对

使用道具 举报

6#
 楼主| 重庆酱油仔 发表于 2014-1-16 08:54:09 | 只看该作者
这个是指只有不是空的(NoMsk)  就执行下面的语句,到
u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;
时,会错误的与掉前面已经置位的数据。
回复 支持 反对

使用道具 举报

5#
a_ziliu 发表于 2014-1-15 17:59:47 | 只看该作者
不是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;   
  }
}
回复 支持 反对

使用道具 举报

地板
zhbbhz 发表于 2014-1-15 09:37:40 | 只看该作者
升级有时是必要的!
回复 支持 反对

使用道具 举报

板凳
 楼主| 重庆酱油仔 发表于 2014-1-14 10:33:36 | 只看该作者
本帖最后由 重庆酱油仔 于 2014-1-14 10:35 编辑

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

使用道具 举报

沙发
chenwenbin 发表于 2014-1-13 17:06:58 | 只看该作者
请问你用的是哪个版本的BSP,u32tmp = ( u32tmp & ~MODULE_CLKSEL_Msk(u32ModuleIdx)<<MODULE_CLKSEL_Pos(u32ModuleIdx) ) | u32ClkSrc;这个只是对对应IP位进行操作,应该不会影响到其他IP的
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU