SN_TIM1_INIT.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "SN_TIM1_INIT.h"
  2. /*
  3. 文件名:SN_TIM1_INIT.c/.h
  4. 作者: SN_FAE_黄泽洪
  5. 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证
  6. 本人不担负商业使用上带来的风险。
  7. */
  8. /*
  9. SN_TIM1_INIT模块的使用方法:
  10. 该模块是定时执行一个中断事件的,可以只执行一次,也可以设置周期性执行任务。
  11. //定时被调用的函数
  12. void LED(void){
  13. std_gpio_toggle_pin(LED_GPIO_PORT, LED_PIN);
  14. }
  15. int main(void){
  16. SN_SYSCLK_set(SYSCLK_48MHZ);
  17. //每个100个计数时钟数,就执行一次LED(void)任务
  18. SN_TIM1_CALL_set(100 ,TIM1_AGAIN_WORK ,LED ,NVIC_PRIO_2); //设置led的亮度 在led对应的io口可以看到电平切换状态
  19. while(1){
  20. }
  21. }
  22. //定时器时间计算:
  23. 假设现在的系统时钟时8M 并且AHB APB 都是1分频 那么定时器1计数频率 要经过下面这些路径设置
  24. 系统时钟SystemCoreClock ---> AHB ---> APB ---> 定时器预分频器(PSC) ----> 定时器计数器
  25. 由于默认设置 定时器1时钟分频是固定1分频(对这个参数设置就设置死区分频),定时器预分频是 1分频 ,那么我们的 定时器频率 = ( SystemCoreClock )/ PSC = SystemCoreClock
  26. 那么计数值 TIM1_ARR_VALUE = 100 ; 那么定时器时间就是 100 * 1/8000000 = 125us
  27. 通过灵活配置 定时器重载值 和 定时器预分频器 可以灵活配置出需要的定时器时钟计数频率 在宏定义中修改这两个值
  28. */
  29. //定时器3全局中断回调函数
  30. void(*TIM1_call_fun)(void) = NULL;
  31. /*
  32. 函数名称:uint8_t SN_TIM1_CALL_set()
  33. ----------------------------------------------------------------------------------
  34. 功能: 定时器中断(默认使用系统时钟不分频)
  35. ----------------------------------------------------------------------------------
  36. @参数: TIM_ARR_VALUE 溢出周期
  37. @ 0x0001 - 0xffff;
  38. @参数: TIM_ARR_VALUE 单次/多次
  39. @TIM1_NOCE_WORK 使能单次定时器触发
  40. @TIM1_AGAIN_WORK 使能周期性定时器触发
  41. @参数: void (*TIM1_call_fun)void 回调事件
  42. @回调函数指针:
  43. @参数: 中断优先级
  44. @:NVIC_PRIO_0
  45. @:NVIC_PRIO_1
  46. @:NVIC_PRIO_2
  47. @:NVIC_PRIO_3
  48. ----------------------------------------------------------------------------------
  49. @返回值: 溢出周期
  50. 注意:定时器1的PWM和定时器3的中断处理不能同时使用
  51. 分频系数默认是使用1分频,修改这些参数要在SN_TIM1_INIT.h 文件中修改
  52. */
  53. uint8_t SN_TIM1_CALL_set(uint16_t TIM1_ARR_VALUE ,uint8_t OPM_WORK ,void(*call_fun)(void) ,uint32_t NVIC_PRIO_x){
  54. //初始化定时器1,使用系统时钟, 默认psc不分频
  55. std_tim_basic_init_t basic_init_struct = {0};
  56. /* TIM1时钟使能 */
  57. std_rcc_apb2_clk_enable(RCC_PERIPH_CLK_TIM1);
  58. /* 配置TIM1计数器参数 */
  59. basic_init_struct.prescaler = 48;
  60. basic_init_struct.counter_mode = TIM_COUNTER_MODE_UP;
  61. basic_init_struct.period = TIM1_ARR_VALUE;
  62. basic_init_struct.clock_div = TIM_CR1_CLK_DIV1;
  63. basic_init_struct.repeat_counter = 0x00;
  64. std_tim_init(TIM1, &basic_init_struct);
  65. /* 清除更新事件标志 */
  66. std_tim_clear_flag(TIM1, TIM_FLAG_UPDATE);
  67. //单次或连续
  68. if(OPM_WORK == 1){
  69. std_tim_onepulse_enable(TIM1);
  70. }else{
  71. std_tim_arrpreload_enable(TIM1); //使能自动加载
  72. std_tim_onepulse_disable(TIM1); //关闭单脉冲输出
  73. }
  74. //设置中断优先级
  75. NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn , NVIC_PRIO_x);
  76. NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn );
  77. //设置回调函数
  78. TIM1_call_fun = call_fun;
  79. //启动定时器&中断
  80. std_tim_interrupt_enable(TIM1,TIM_INTERRUPT_UPDATE);
  81. std_tim_enable(TIM1);
  82. return TIM1_ARR_VALUE;
  83. }
  84. //定时器1中断回调函数
  85. //这个任务无需用户修改
  86. void TIM1_BRK_UP_TRG_COM_IRQHandler(void){
  87. if (std_tim_get_flag(TIM1,TIM_FLAG_UPDATE )){
  88. std_tim_clear_flag(TIM1,TIM_FLAG_UPDATE);
  89. TIM1_call_fun(); //调用回调函数
  90. }
  91. }