结论:
问题:使用NUC029LAN库函数中的设备时钟使能函数时,无法正常打开定时器TMR2和TMR3。
原因:clk.h中,定时器2模块(TMR2_MODULE)和定时器3模块(TMR2_MODULE)的值有问题。
解决办法:
库函数的clk.h中,TMR2_MODULE 和 TMR3_MODULE的值如下更改:
项目场景:
使用NUC029LAN库函数中的设备时钟使能函数,使能定时器1~4的模块时钟。
问题描述:
在使用设备时钟使能库函数(如下)时,定时器TMR2、TMR3无法正常工作。
CLK_EnableModuleClock(TMR0_MODULE);
CLK_EnableModuleClock(TMR1_MODULE);
CLK_EnableModuleClock(TMR2_MODULE);
CLK_EnableModuleClock(TMR3_MODULE);
原因分析:
设备时钟使能库函数CLK_EnableModuleClock(uint32_t u32ModuleIdx)源码如下:
void CLK_EnableModuleClock(uint32_t u32ModuleIdx)
{
*(volatile uint32_t *)((uint32_t)&CLK->APBCLK + (MODULE_APBCLK(u32ModuleIdx) * 4)) |= 1 << MODULE_IP_EN_Pos(u32ModuleIdx);
}
对比后发现,使用寄存器操作(如下)时,定时器TMR2、TMR3可以正常工作。
CLK->APBCLK = CLK_APBCLK_TMR0_EN_Msk | CLK_APBCLK_TMR1_EN_Msk |
CLK_APBCLK_TMR2_EN_Msk | CLK_APBCLK_TMR3_EN_Msk;
解决方案:
经过排查,设备时钟使能库函数使用的定时器2模块(TMR2_MODULE)和定时器3模块(TMR2_MODULE)的值有问题! 如下修改后,使用设备时钟使能函数时,定时器TMR2、TMR3可以正常工作。
原来的值:
#define TMR0_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |( 8<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR0_EN_Pos)
#define TMR1_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(12<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos)
#define TMR2_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(16<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR0_EN_Pos)
#define TMR3_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(20<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos)
修改后的值:
#define TMR0_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |( 8<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR0_EN_Pos)
#define TMR1_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(12<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos)
#define TMR2_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(16<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR2_EN_Pos)
#define TMR3_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(20<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR3_EN_Pos)
声明:[笔记整理] 内容整理自新唐NUC029LAN库函数,版权归原作者所有,若有侵权请联系删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)