board_timer.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "ddl.h"
  2. #include "lpm.h"
  3. #include "lptim.h"
  4. #include "bt.h"
  5. #include "gpio.h"
  6. #include "timer3.h"
  7. #include "multi_button.h"
  8. //volatile uint32_t uart_rx_ticks = 0;
  9. ///<Timer1配置初始化
  10. void board_Timer1Cfg(uint16_t u16Period) //peroid = 2ms
  11. {
  12. uint16_t u16ArrValue;
  13. uint16_t u16CntValue;
  14. stc_bt_mode0_cfg_t stcBtBaseCfg;
  15. DDL_ZERO_STRUCT(stcBtBaseCfg);
  16. Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能
  17. stcBtBaseCfg.enWorkMode = BtWorkMode0; //定时器模式
  18. stcBtBaseCfg.enCT = BtTimer; //定时器功能,计数时钟为内部PCLK
  19. stcBtBaseCfg.enPRS = BtPCLKDiv2; //PCLK/2
  20. stcBtBaseCfg.enCntMode = Bt16bitArrMode; //自动重载16位计数器/定时器
  21. stcBtBaseCfg.bEnTog = FALSE;
  22. stcBtBaseCfg.bEnGate = FALSE;
  23. stcBtBaseCfg.enGateP = BtGatePositive;
  24. Bt_Mode0_Init(TIM1, &stcBtBaseCfg); //TIM1 的模式0功能初始化
  25. u16ArrValue = 0x10000 - u16Period;
  26. Bt_M0_ARRSet(TIM1, u16ArrValue); //设置重载值(ARR = 0x10000 - 周期)
  27. u16CntValue = 0x10000 - u16Period;
  28. Bt_M0_Cnt16Set(TIM1, u16CntValue); //设置计数初值
  29. Bt_ClearIntFlag(TIM1,BtUevIrq); //清中断标志
  30. Bt_Mode0_EnableIrq(TIM1); //使能TIM1中断(模式0时只有一个中断)
  31. EnableNvic(TIM1_IRQn, IrqLevel1, TRUE); //TIM1中断使能
  32. Bt_M0_Run(TIM1); //TIM1 运行。
  33. }
  34. //Timer3 Port端口配置
  35. void board_Timer3PortCfg(void)
  36. {
  37. stc_gpio_cfg_t stcTIM3Port;
  38. //结构体初始化清零
  39. DDL_ZERO_STRUCT(stcTIM3Port);
  40. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能
  41. stcTIM3Port.enDir = GpioDirIn;
  42. Gpio_Init(GpioPortA, GpioPin8, &stcTIM3Port);
  43. Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2); //PA08设置为TIM3_CH0A
  44. #if 0
  45. Gpio_Init(GpioPortA, GpioPin7, &stcTIM3Port);
  46. Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4); //PA07设置为TIM3_CH0B
  47. Gpio_Init(GpioPortB, GpioPin10, &stcTIM3Port);
  48. Gpio_SetAfMode(GpioPortB,GpioPin10,GpioAf5); //PB10设置为TIM3_CH1A
  49. Gpio_Init(GpioPortB, GpioPin0, &stcTIM3Port);
  50. Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf2); //PB00设置为TIM3_CH1B
  51. Gpio_Init(GpioPortB, GpioPin8, &stcTIM3Port);
  52. Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf6); //PB08设置为TIM3_CH2A
  53. Gpio_Init(GpioPortB, GpioPin15, &stcTIM3Port);
  54. Gpio_SetAfMode(GpioPortB,GpioPin15,GpioAf2); //PB15设置为TIM3_CH2B
  55. #endif
  56. }
  57. //Timer3 配置
  58. void board_Timer3Cfg(void)
  59. {
  60. uint16_t u16ArrValue;
  61. uint16_t u16CntValue;
  62. stc_tim3_mode23_cfg_t stcTim3BaseCfg;
  63. stc_tim3_m23_input_cfg_t stcTim3PortCapCfg;
  64. //结构体初始化清零
  65. DDL_ZERO_STRUCT(stcTim3BaseCfg);
  66. DDL_ZERO_STRUCT(stcTim3PortCapCfg);
  67. Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能
  68. stcTim3BaseCfg.enWorkMode = Tim3WorkMode2; //锯齿波模式
  69. stcTim3BaseCfg.enCT = Tim3Timer; //定时器功能,计数时钟为内部PCLK
  70. stcTim3BaseCfg.enPRS = Tim3PCLKDiv4; //PCLK/4 6MHZ
  71. stcTim3BaseCfg.enCntDir = Tim3CntUp; //向上计数,在三角波模式时只读
  72. Tim3_Mode23_Init(&stcTim3BaseCfg); //TIM3 的模式23功能初始化
  73. stcTim3PortCapCfg.enCHxACmpCap = Tim3CHxCapMode; //CHB通道设置为捕获模式
  74. stcTim3PortCapCfg.enCHxACapSel = Tim3CHxCapRise; //CHB通道上升沿下降沿捕获都使能
  75. stcTim3PortCapCfg.enCHxAInFlt = Tim3FltPCLKDiv16Cnt3; //PCLK/16 3个连续有效
  76. stcTim3PortCapCfg.enCHxAPolarity = Tim3PortPositive; //正常输入输出
  77. Tim3_M23_PortInput_Cfg(Tim3CH0, &stcTim3PortCapCfg); //端口输入初始化配置
  78. //Tim3_M23_PortInput_Cfg(Tim3CH1, &stcTim3PortCapCfg); //端口输入初始化配置
  79. //Tim3_M23_PortInput_Cfg(Tim3CH2, &stcTim3PortCapCfg); //端口输入初始化配置
  80. u16ArrValue = 0xFFFF;
  81. Tim3_M23_ARRSet(u16ArrValue, TRUE); //设置重载值,并使能缓存
  82. u16CntValue = 0;
  83. Tim3_M23_Cnt16Set(u16CntValue); //设置计数初值
  84. Tim3_ClearAllIntFlag(); //清中断标志
  85. Tim3_Mode23_EnableIrq(Tim3CA0Irq); //使能TIM3 CB0比较/捕获中断
  86. Tim3_Mode23_EnableIrq(Tim3UevIrq); //使能TIM3 Uev更新中断
  87. EnableNvic(TIM3_IRQn, IrqLevel1, TRUE); //TIM3中断使能
  88. Tim3_M23_Run(); //运行
  89. }
  90. ///<Lptmer配置初始化
  91. void board_LPTimerInit(void)
  92. {
  93. stc_lptim_cfg_t stcLptCfg;
  94. DDL_ZERO_STRUCT(stcLptCfg);
  95. ///< 使能LPTIM0 外设时钟
  96. Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim, TRUE);
  97. Lptim_Cmd(M0P_LPTIMER, FALSE); ///< 停止lptimer0
  98. stcLptCfg.enGate = LptimGateLow;
  99. stcLptCfg.enGatep = LptimGatePLow;
  100. stcLptCfg.enTcksel = LptimRcl;
  101. stcLptCfg.enTogen = LptimTogEnLow;
  102. stcLptCfg.enCt = LptimTimerFun; //计数器功能
  103. stcLptCfg.enMd = LptimMode2; //工作模式为模式2:自动重装载16位计数器/定时器
  104. stcLptCfg.u16Arr = 30000; //预装载寄存器值,计数初值
  105. Lptim_Init(M0P_LPTIMER, &stcLptCfg);
  106. Lptim_ClrItStatus(M0P_LPTIMER); //清除中断标志位
  107. Lptim_ConfIt(M0P_LPTIMER, TRUE); //允许LPTIMER中断
  108. EnableNvic(LPTIM_IRQn, IrqLevel3, TRUE);
  109. Lptim_Cmd(M0P_LPTIMER, TRUE); ///< 启动lptimer1运行
  110. }
  111. /*******************************************************************************
  112. * TIM1中断服务函数
  113. ******************************************************************************/
  114. void Tim1_IRQHandler(void)
  115. {
  116. //Timer1 模式0 溢出中断
  117. if(TRUE == Bt_GetIntFlag(TIM1, BtUevIrq))
  118. {
  119. Bt_ClearIntFlag(TIM1,BtUevIrq); //中断标志清零
  120. button_ticks();
  121. }
  122. }
  123. /**
  124. ******************************************************************************
  125. ** \brief LPTIMER中断服务函数
  126. **
  127. ** \return 无
  128. ******************************************************************************/
  129. void LpTim_IRQHandler(void)
  130. {
  131. // static boolean_t bFlag = TRUE;
  132. if (TRUE == Lptim_GetItStatus(M0P_LPTIMER))
  133. {
  134. Lptim_ClrItStatus(M0P_LPTIMER);//清除LPTimer的中断标志位
  135. }
  136. }