结论:
问题:使用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); // 使能TMR0模块时钟
CLK_EnableModuleClock(TMR1_MODULE); // 使能TMR1模块时钟
CLK_EnableModuleClock(TMR2_MODULE); // 使能TMR2模块时钟
CLK_EnableModuleClock(TMR3_MODULE); // 使能TMR3模块时钟
原因分析:
设备时钟使能库函数CLK_EnableModuleClock(uint32_t u32ModuleIdx)源码如下:/**
* @brief This function enable module clock 使能APB设备时钟
* @param u32ModuleIdx is module index. Including :
* - \ref WDT_MODULE 看门狗 时钟使能控制 (写保护)
* - \ref TMR0_MODULE Timer0 时钟使能控制
* - \ref TMR1_MODULE Timer1 时钟使能控制
* - \ref TMR2_MODULE Timer2 时钟使能控制
* - \ref TMR3_MODULE Timer3 时钟使能控制
* - \ref FDIV_MODULE 分频器输出 时钟使能控制
* - \ref I2C0_MODULE I2C0 时钟使能控制
* - \ref I2C1_MODULE I2C1 时钟使能控制
* - \ref SPI0_MODULE SPI0 时钟使能控制
* - \ref SPI1_MODULE SPI1 时钟使能控制
* - \ref UART0_MODULE UART0 时钟使能控制
* - \ref UART1_MODULE UART1 时钟使能控制
* - \ref PWM01_MODULE PWM_01 时钟使能控制
* - \ref PWM23_MODULE PWM_23 时钟使能控制
* - \ref PWM45_MODULE PWM_45 时钟使能控制
* - \ref PWM67_MODULE PWM_67 时钟使能控制
* - \ref ADC_MODULE ADC 时钟使能控制
* - \ref ACMP01_MODULE 模拟比较器0/1 时钟使能控制
* - \ref ACMP23_MODULE 模拟比较器2/3 时钟使能控制
* @return None 无返回值
*/
// 使能APB设备时钟控制(选择模块)
void CLK_EnableModuleClock(uint32_t u32ModuleIdx)
{
// 下列等式等价为 APBCLK = APBCLK | (1<<(CLK_APBCLK_xxxx_EN_Pos))
// (APBCLK + (MODULE_APBCLK(u32ModuleIdx) * 4)) —— APBCLK寄存器加上库函数原始定义的APBCLK的复位值(0x000_000X)
*(volatile uint32_t *)((uint32_t)&CLK->APBCLK + (MODULE_APBCLK(u32ModuleIdx) * 4)) |= 1 << MODULE_IP_EN_Pos(u32ModuleIdx);
}
对比后发现,使用寄存器操作(如下)时,定时器TMR2、TMR3可以正常工作。 /* Enable peripheral clock */
// 使能UART0、TMR0、TMR1、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) /*!< TMR0 Module */
#define TMR1_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(12<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos) /*!< TMR1 Module */
#define TMR2_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(16<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR0_EN_Pos) /*!< TMR2 Module */
#define TMR3_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(20<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos) /*!< TMR3 Module */
修改后的值:
#define TMR0_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |( 8<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR0_EN_Pos) /*!< TMR0 Module */
#define TMR1_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(12<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR1_EN_Pos) /*!< TMR1 Module */
#define TMR2_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(16<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR2_EN_Pos) /*!< TMR2 Module */
#define TMR3_MODULE ((0x0<<31)|(0x1<<29) |(0x7<<25) |(20<<20) |(MODULE_NoMsk<<10) |CLK_APBCLK_TMR3_EN_Pos) /*!< TMR3 Module */
声明:[笔记整理] 内容整理自新唐NUC029LAN库函数,版权归原作者所有,若有侵权请联系删除。