牛卧堂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