打印
[其他ST产品]

STM32F1常用外设介绍

[复制链接]
楼主: 范德萨发额
手机看帖
扫描二维码
随时随地手机跟帖
81
范德萨发额|  楼主 | 2023-2-28 19:55 | 只看该作者 回帖奖励 |倒序浏览
获取当前预分频器的值函数
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

使用特权

评论回复
82
范德萨发额|  楼主 | 2023-2-28 19:55 | 只看该作者
使用跨文件的变量: extern声明变量,告诉编译器,有Num这个变量在别的文件中定义了,在此文件中也可以使用

使用特权

评论回复
83
范德萨发额|  楼主 | 2023-2-28 19:56 | 只看该作者
程序示例:
void Timer_Init(void)
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
       
        TIM_InternalClockConfig(TIM2);//使用内部时钟
       
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分频
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数
        TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装值
        TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器特有
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写入参数
       
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
       
        NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
        NVIC_Init(&NVIC_InitStructure);//写入参数
       
        TIM_Cmd(TIM2, ENABLE);//开启定时器
}

/*
void TIM2_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)//判断是否中断溢出
        {
               
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除中断标志位
        }
}
*/

使用特权

评论回复
84
范德萨发额|  楼主 | 2023-2-28 19:56 | 只看该作者
输出比较常用的函数
配置输出比较函数
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);

使用特权

评论回复
85
范德萨发额|  楼主 | 2023-2-28 19:57 | 只看该作者
输出比较

    OC(Output Compare)输出比较
    输出比较可以通过比较CNT和CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
    每个高级定时器和通用定时器都拥有4个输出比较通道
    高级定时器的前3个通道额外拥有死去生成和互补输出的功能

使用特权

评论回复
86
范德萨发额|  楼主 | 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);

使用特权

评论回复
87
范德萨发额|  楼主 | 2023-2-28 19:57 | 只看该作者
配置强制输出模式函数

在运行中想要暂停输出波形并且强制输出高或者低电平,强制输出高电平和设置百分百占空比一样,强制输出低电平和设置百分百低电平是一样的。

使用特权

评论回复
88
范德萨发额|  楼主 | 2023-2-28 19:58 | 只看该作者
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

使用特权

评论回复
89
范德萨发额|  楼主 | 2023-2-28 19:58 | 只看该作者
配置CCR寄存器的预装功能函数

预装功能就是影子寄存器:写入的值不会立即生效,而是在更新事件才会生效

使用特权

评论回复
90
范德萨发额|  楼主 | 2023-2-28 19:58 | 只看该作者
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

使用特权

评论回复
91
范德萨发额|  楼主 | 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);

使用特权

评论回复
92
范德萨发额|  楼主 | 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);

使用特权

评论回复
93
范德萨发额|  楼主 | 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);

使用特权

评论回复
94
范德萨发额|  楼主 | 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);

使用特权

评论回复
95
范德萨发额|  楼主 | 2023-2-28 20:02 | 只看该作者
选择输出比较模式函数

void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

使用特权

评论回复
96
范德萨发额|  楼主 | 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);

使用特权

评论回复
97
范德萨发额|  楼主 | 2023-2-28 20:03 | 只看该作者
使用高级定时器输出PWM时调用使能主输出函数

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

    1

定时器输出需要使用复用推挽输出,开启复用推挽输出引脚的控制权才能交给片上外设,PWM波形才能通过引脚输出

使用特权

评论回复
98
范德萨发额|  楼主 | 2023-2-28 20:04 | 只看该作者
引脚重映射

开启AFIO时钟函数

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

    1

    完全重映射:四个引脚全换
    部分重映射:前面两个引脚变了或者后面两个引脚变了
    调试端口不能做普通的GPIO口使用,需要解除复用

使用特权

评论回复
99
范德萨发额|  楼主 | 2023-2-28 20:04 | 只看该作者
程序示例
void PWM_Init(void)
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟
       
        GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//开启引脚
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置响应速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);//写入参数
       
        TIM_InternalClockConfig(TIM2);//使用内部时钟
       
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;                //ARR
        TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;                //PSC
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写入参数
       
        TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体
        TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋默认值
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1模式
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
        TIM_OCInitStructure.TIM_Pulse = 0;                //CCR
        TIM_OC3Init(TIM2, &TIM_OCInitStructure);//写入参数
       
        TIM_Cmd(TIM2, ENABLE);//开启时钟
}

void PWM_SetCompare3(uint16_t Compare)
{
        TIM_SetCompare3(TIM2, Compare);//设置CCR3的值
}

使用特权

评论回复
100
范德萨发额|  楼主 | 2023-2-28 20:04 | 只看该作者
输入捕获

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则