[其他ST产品] STM32入门基础

[复制链接]
1107|47
 楼主| 为你转身 发表于 2023-7-30 15:56 | 显示全部楼层
服务函数结束后清除标志位

        EXTI_ClearITPendingBit(EXTI_Line0);//清除中断挂起标志位
 楼主| 为你转身 发表于 2023-7-30 15:56 | 显示全部楼层
定时器

TIM(Timer)定时器

<1> 简介

· 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

· 16位计数器、预分频、自动重装寄存器的时基单元,在72M计数时钟下可以实现最大59.65s的定时

· 不仅具备基本的定时器中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

· 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
4555764c617a33ce25.png
 楼主| 为你转身 发表于 2023-7-30 15:56 | 显示全部楼层
对72MHz计72个数就是1MHz,也就是1us的时间,计72000个数,那就是1KHz也就是1ms的时间

59.65s =65536 · 65536 · 1/72M/(中断频率倒数),

· STM32的定时器支持级联的模式:一个定时器的输出当做另一个定时器的输入最大定时时间就是59.65s · 65536 · 65536

· STM32F103C8T6有TIM1/2/3/4四个定时器
9722064c617b4e89c9.png
 楼主| 为你转身 发表于 2023-7-30 15:56 | 显示全部楼层
基本定时器有三个重要的定时器,这三个我们称一起为时基单元
2810364c617c5bb21c.png
下面是我们常选择的基本定时器
 楼主| 为你转身 发表于 2023-7-30 15:57 | 显示全部楼层
这三个定时器连内部定时器,也就是ck_int

· 预分频器(PSC):对输入的基准频率提前进行一个分频的操作
实际分频系数 = 预分频器的值 + 1,最大可以写65535即65536分频


· 计数器(CNT):也是16位,值可以从0~65535,当计数器的值自增(自减)到目标值时,产生中断,完成定时


 楼主| 为你转身 发表于 2023-7-30 15:57 | 显示全部楼层
自动重装寄存器():也是16位当计数值等于自动重装值时,就是计时的时间到了,就会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数计时,计数值等于自动重装值的中断一般叫做“更新中断”,此更新中断就会通往NVIC,再配置好NVIC的定时器通道,定时器上的更新中断就会得到CPU的响应了,对应的事件叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作
 楼主| 为你转身 发表于 2023-7-30 15:57 | 显示全部楼层
我们在通用定时器内,不仅可选择内部时钟,也可以选择外部TIMX_ETR引脚上的外部时钟

基本结构
1190764c617f52c3be.png
 楼主| 为你转身 发表于 2023-7-30 15:57 | 显示全部楼层
定时器触发中断,我们可以选择RCC触发的内部时钟(定时器中断计数),也可以选择ETR引脚提供的外部时钟模式2.

也可以选择触发输入当作外部时钟(模式1),对应的为ETR外部时钟,ITRx其他1定时器,Tix输入捕获通道

编码器模式为编码器独有的模式
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
预分频器时序

5102264c6180829f2d.png
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
计数器技术频率 : CK_CNT = CK_PSC / (PSC+1)

计数器时序
9351664c6181811437.png
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
· 计数器溢出频率 : CK_CNT_OV = CK_CNT / (ARR + 1)

通过设置ARPE,就可以选择有无预装的情况
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
开启定时器步骤

第一步,RCC开启时钟
第二步,选择时基单元的时钟源
第三步,配置时基单元
第四步,配置输出中断控制,允许更新中断输出到NVIC
第五步,配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步,运行控制
第七步,使能计数器
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
输出比较说明

· OC——输出比较

· 输出比较可以通过CNT和CRR寄存器值的关系,来对输出电平进行 1, 0 ,翻转

· 每个通用定时器/高级都有4个输出比较通道
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
PWM

· 可通过一系列脉冲的宽度进行调制
 楼主| 为你转身 发表于 2023-7-30 15:58 | 显示全部楼层
 楼主| 为你转身 发表于 2023-7-30 15:59 | 显示全部楼层
输出比较模式
2955964c6184370eec.png
 楼主| 为你转身 发表于 2023-7-30 15:59 | 显示全部楼层
TIM库函数


  1. // 恢复配置
  2. void TIM_DeInit(TIM_TypeDef* TIMx);

  3. /********时基单元**********************
  4. // 时基单元的配置,第一个选择TIMX的某个定时器,第二个结构体,包含了配置时基单元的一些参数
  5. void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
  6. ********************end***************/

  7. void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  8. void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  9. void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  10. void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  11. void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
  12. void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
  13. void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);

  14. //结构体变量赋一个默认值
  15. void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

  16. void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
  17. void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);
  18. void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct);

  19. //使能计数器,对应图中运行控制(运行控制)
  20. void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);


  21. void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

  22. //输出中断控制 使能中断输出信号,1.选择定时器 2.配置哪个中断输出, 3.状态为使能/失能
  23. void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

  24. void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);
  25. void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);
  26. void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState);


  27. //下面四个对应时基单元的时钟选择部分

  28. /****************时钟源选择********************
  29. //选择内部时钟,选择定时器即可
  30. void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
  31. //选择ITRX其他定时器时钟,1.选择定时器 2.选择接入哪个其他定时器
  32. void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
  33. //选择TIX捕获通道的函数 2.选择具体引脚 3.输入极性与滤波器
  34. void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
  35.                                 uint16_t TIM_ICPolarity, uint16_t ICFilter);
  36. //选择ETR通过外部时钟模式1输入时钟
  37. void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
  38. //选择ETR通过外部时钟模式2输入时钟
  39. void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
  40.                              uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);、
  41. //配置引脚预分频等等
  42. void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
  43. *****************end file**********************************************/


  44. //单独写入预分频值 3.写入模式
  45. void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);


  46. void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
  47. void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
  48. void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
  49.                                 uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
  50. void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  51. void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  52. void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  53. void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  54. void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
  55. void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState);
  56. void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState);
  57. void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);
  58. void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  59. void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  60. void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  61. void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  62. void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
  63. void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
  64. void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
  65. void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
  66. void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
  67. void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
  68. void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
  69. void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
  70. void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
  71. void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
  72. void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
  73. void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
  74. void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
  75. void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
  76. void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
  77. void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
  78. void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
  79. void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
  80. void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
  81. void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource);
  82. void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState);
  83. void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode);
  84. void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
  85. void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
  86. void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);

  87. //给计数器写入一个值函数
  88. void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

  89. //给自动重装器写入一个值函数
  90. void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
  91. void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
  92. void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
  93. void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
  94. void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
  95. void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
  96. void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
  97. void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
  98. void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
  99. void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);
  100. uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
  101. uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
  102. uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
  103. uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

  104. //获取当前计数器的值函数
  105. uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

  106. //获取当前预分频器的值函数
  107. uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
  108. FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
  109. void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
  110. ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
  111. void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
 楼主| 为你转身 发表于 2023-7-30 15:59 | 显示全部楼层
定时器初始化示例:
  1. void Timer_Init(void)
  2. {
  3.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
  4.        
  5. //因为如果不写默认的就是使用内部时钟,所以我们可以选择不写这个
  6.         TIM_InternalClockConfig(TIM2);//使用内部时钟
  7.        
  8.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
  9.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分频
  10.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数
  11.         TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装值
  12.         TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
  13.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器特有
  14.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写入参数
  15.        
  16.         TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
  17.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
  18.        
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
  20.        
  21.         NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
  22.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
  23.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
  24.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
  25.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
  26.         NVIC_Init(&NVIC_InitStructure);//写入参数
  27.        
  28.         TIM_Cmd(TIM2, ENABLE);//开启定时器
  29. }
周半梅 发表于 2023-12-29 08:19 | 显示全部楼层

共模电感的电感值可以用电桥来测量
Pulitzer 发表于 2023-12-29 09:22 | 显示全部楼层

单层板不具有固定孔
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部