123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include "SN_TIM3_INIT.h"
- /*
- 文件名:SN_TIM3_INIT.c/.h
- 作者: SN_FAE_黄泽洪
- 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证
- 本人不担负商业使用上带来的风险。
- */
- /*
- SN_TIM3_INIT模块的使用方法:
- 该模块是定时执行一个中断事件的,可以只执行一次,也可以设置周期性执行任务。
- void LED(void){
-
- std_gpio_toggle_pin(LED_GPIO_PORT, LED_PIN);
-
- }
-
- int main(void){
-
- SN_SYSCLK_set(SYSCLK_48MHZ);
- //每个100个计数时钟数,就执行一次LED(void)任务
- SN_TIM3_CALL_set(100 ,TIM3_AGAIN_WORK ,LED ,NVIC_PRIO_2); //设置led的亮度 在led对应的io口可以看到电平切换状态
-
- while(1){
- }
- }
-
-
- //定时器时间计算:
- 假设现在的系统时钟时8M 并且AHB APB 都是1分频 定时器3的计数频率 要经过下面这些路径设置
-
- 系统时钟SystemCoreClock ---> AHB ---> APB ---> 定时器预分频器(PSC) ----> 定时器计数器
-
-
- 由于默认设置 定时器时钟分频是 1分频 定时器预分配是 1分频 ,那么我们的 定时器频率 = ( SystemCoreClock / TIM_CLOCK_DTS_DIV )/ (2^PSC)
-
- 那么计数值 TIM3_ARR_VALUE = 100 ; 那么定时器时间就是 100 * 1/(8000000/(2^PSC))
- 通过灵活配置 定时器重载值 和 定时器预分频器 可以灵活配置出需要的定时器时钟周期 在宏定义中修改这两个值
-
- */
- //定时器3全局中断回调函数
- void(*TIM3_call_fun)(void) = NULL;
- /*
- 函数名称:uint8_t SN_TIM3_CALL_set()
- ----------------------------------------------------------------------------------
- 功能: 定时器中断(默认使用系统时钟不分频 , 定时器时钟不分频 ,预分分频器不分频)
- ----------------------------------------------------------------------------------
- @参数: TIM_ARR_VALUE 溢出周期
- @ 0x0001 - 0xffff;
-
- @参数: TIM_ARR_VALUE 单次/多次
- @TIM3_NOCE_WORK 使能单次定时器触发
- @TIM3_AGAIN_WORK 使能周期性定时器触发
- @参数: void (*TIM3_call_fun)void 回调事件
- @回调函数指针:
-
- @参数: 中断优先级
- @:NVIC_PRIO_0
- @:NVIC_PRIO_1
- @:NVIC_PRIO_2
- @:NVIC_PRIO_3
- ----------------------------------------------------------------------------------
- @返回值: 溢出周期
- 注意:定时器3的PWM和定时器3的中断处理不能同时使用
- 分频系数默认是使用1分频,修改这些参数要在SN_TIM1_INIT.h 文件中修改
- */
- uint8_t SN_TIM3_CALL_set(uint16_t TIM_ARR_VALUE ,uint8_t OPM_WORK ,void(*call_fun)(void) ,uint32_t NVIC_PRIO_x){
- //初始化定时器3,使用系统时钟, 默认psc不分频
- std_tim_basic_init_t basic_init_struct = {0};
-
- /* TIM3时钟使能 */
- std_rcc_apb1_clk_enable(RCC_PERIPH_CLK_TIM3);
-
- /* TIM3基本定时器配置 */
- basic_init_struct.period = TIM_ARR_VALUE; //设置定时器计数周期值
- basic_init_struct.prescaler = TIM_PSC_DIV; //预分配器
- basic_init_struct.clock_div = TIM_CLOCK_DTS_DIV; //设置定时器使用分频为1分频
- std_tim_init(TIM3, &basic_init_struct);
-
- //单次或连续
- if(OPM_WORK == 1){
- std_tim_onepulse_enable(TIM3);
- }else{
- std_tim_arrpreload_enable(TIM3); //使能自动加载
- }
-
- //设置中断优先级
- NVIC_SetPriority(TIM3_IRQn, NVIC_PRIO_x);
- NVIC_EnableIRQ(TIM3_IRQn);
-
-
- //设置回调函数
-
- TIM3_call_fun = call_fun;
-
- //启动定时器&中断
- std_tim_arrpreload_enable(TIM3);
- std_tim_interrupt_enable(TIM3, TIM_INTERRUPT_UPDATE);
- std_tim_enable(TIM3);
-
- return TIM_ARR_VALUE;
- }
- //定时器3中断回调函数
- //这个任务无需用户修改
- void TIM3_IRQHandler(void){
- if (std_tim_get_flag(TIM3,TIM_FLAG_UPDATE )){
-
- std_tim_clear_flag(TIM3,TIM_FLAG_UPDATE );
- TIM3_call_fun(); //调用回调函数
-
-
- }
- }
|