[其他ST产品] STM32F1常用外设介绍

[复制链接]
 楼主| 范德萨发额 发表于 2023-2-28 19:55 | 显示全部楼层
获取当前预分频器的值函数
  1. uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
 楼主| 范德萨发额 发表于 2023-2-28 19:55 | 显示全部楼层
使用跨文件的变量: extern声明变量,告诉编译器,有Num这个变量在别的文件中定义了,在此文件中也可以使用
 楼主| 范德萨发额 发表于 2023-2-28 19:56 | 显示全部楼层
程序示例:
  1. void Timer_Init(void)
  2. {
  3.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
  4.        
  5.         TIM_InternalClockConfig(TIM2);//使用内部时钟
  6.        
  7.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
  8.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分频
  9.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数
  10.         TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装值
  11.         TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
  12.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器特有
  13.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写入参数
  14.        
  15.         TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
  16.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
  17.        
  18.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
  19.        
  20.         NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
  21.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
  22.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
  23.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
  24.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
  25.         NVIC_Init(&NVIC_InitStructure);//写入参数
  26.        
  27.         TIM_Cmd(TIM2, ENABLE);//开启定时器
  28. }

  29. /*
  30. void TIM2_IRQHandler(void)
  31. {
  32.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)//判断是否中断溢出
  33.         {
  34.                
  35.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除中断标志位
  36.         }
  37. }
  38. */

 楼主| 范德萨发额 发表于 2023-2-28 19:56 | 显示全部楼层
输出比较常用的函数
配置输出比较函数
  1. void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  2. void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  3. void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  4. void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
 楼主| 范德萨发额 发表于 2023-2-28 19:57 | 显示全部楼层
输出比较

    OC(Output Compare)输出比较
    输出比较可以通过比较CNT和CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
    每个高级定时器和通用定时器都拥有4个输出比较通道
    高级定时器的前3个通道额外拥有死去生成和互补输出的功能
 楼主| 范德萨发额 发表于 2023-2-28 19:57 | 显示全部楼层
输出比较常用的函数
配置输出比较函数

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

    1
    2
    3
    4

给输出比较结构体赋一个默认值函数

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
 楼主| 范德萨发额 发表于 2023-2-28 19:57 | 显示全部楼层
配置强制输出模式函数

在运行中想要暂停输出波形并且强制输出高或者低电平,强制输出高电平和设置百分百占空比一样,强制输出低电平和设置百分百低电平是一样的。
 楼主| 范德萨发额 发表于 2023-2-28 19:58 | 显示全部楼层
  1. void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  2. void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  3. void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
  4. void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
 楼主| 范德萨发额 发表于 2023-2-28 19:58 | 显示全部楼层
配置CCR寄存器的预装功能函数

预装功能就是影子寄存器:写入的值不会立即生效,而是在更新事件才会生效
 楼主| 范德萨发额 发表于 2023-2-28 19:58 | 显示全部楼层
  1. void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  2. void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  3. void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
  4. void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
 楼主| 范德萨发额 发表于 2023-2-28 20:01 | 显示全部楼层
配置快速使能函数

void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
 楼主| 范德萨发额 发表于 2023-2-28 20:01 | 显示全部楼层
外部事件时清除REF信号函数

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
 楼主| 范德萨发额 发表于 2023-2-28 20:01 | 显示全部楼层
单独设置输出比较的极性函数

带N的是高级定时器里互补通道的配置函数

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
 楼主| 范德萨发额 发表于 2023-2-28 20:01 | 显示全部楼层
单独修改输出使能参数函数

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
 楼主| 范德萨发额 发表于 2023-2-28 20:02 | 显示全部楼层
选择输出比较模式函数

void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
 楼主| 范德萨发额 发表于 2023-2-28 20:03 | 显示全部楼层
单独更改CCR寄存器的值的函数

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
 楼主| 范德萨发额 发表于 2023-2-28 20:03 | 显示全部楼层
使用高级定时器输出PWM时调用使能主输出函数

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

    1

定时器输出需要使用复用推挽输出,开启复用推挽输出引脚的控制权才能交给片上外设,PWM波形才能通过引脚输出
 楼主| 范德萨发额 发表于 2023-2-28 20:04 | 显示全部楼层
引脚重映射

开启AFIO时钟函数

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

    1

    完全重映射:四个引脚全换
    部分重映射:前面两个引脚变了或者后面两个引脚变了
    调试端口不能做普通的GPIO口使用,需要解除复用
 楼主| 范德萨发额 发表于 2023-2-28 20:04 | 显示全部楼层
程序示例
  1. void PWM_Init(void)
  2. {
  3.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟
  5.        
  6.         GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//开启引脚
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置响应速度
  10.         GPIO_Init(GPIOA, &GPIO_InitStructure);//写入参数
  11.        
  12.         TIM_InternalClockConfig(TIM2);//使用内部时钟
  13.        
  14.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元
  15.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
  16.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
  17.         TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;                //ARR
  18.         TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;                //PSC
  19.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器
  20.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写入参数
  21.        
  22.         TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体
  23.         TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋默认值
  24.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1模式
  25.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平
  26.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
  27.         TIM_OCInitStructure.TIM_Pulse = 0;                //CCR
  28.         TIM_OC3Init(TIM2, &TIM_OCInitStructure);//写入参数
  29.        
  30.         TIM_Cmd(TIM2, ENABLE);//开启时钟
  31. }

  32. void PWM_SetCompare3(uint16_t Compare)
  33. {
  34.         TIM_SetCompare3(TIM2, Compare);//设置CCR3的值
  35. }

 楼主| 范德萨发额 发表于 2023-2-28 20:04 | 显示全部楼层
输入捕获

    IC(Input Capture)输入捕获
    输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
    每个高级定时器和通用定时器都拥有4个输入捕获通道
    可配置PWMI模式,同时测量频率和占空比
    可配合主从触发模式,实现硬件全自动测量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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