stm32普通IO口捕获PWM的高电平
来源:互联网 发布:淘宝店分销怎么发货 编辑:程序博客网 时间:2024/05/07 21:18
思路:普通IO口配置上升沿下降沿触发中断,然后配置一个定时器(周期大于等于PWM周期),在IO口中断中读取定时器计数。
定时器不需要配置中断
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //72M/72=1M
TIM_TimeBaseStructure.TIM_Period = 20000;//20ms overflow
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/*load */
TIM_ARRPreloadConfig(TIM3, ENABLE);
//clear IT bit
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
/* overflow interrupt*/
//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* allow*/
TIM_Cmd(TIM3, ENABLE);
}
IO口配置
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*
PE9 CH1 DJ //PE10 CH2 MD// PE11 CH6 adjust */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource9);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource11);
EXTI_InitStructure.EXTI_Line = EXTI_Line9 | EXTI_Line10 |EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
IO中断配置
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* PB6 PE5 interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//highest priority
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* PE3 interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
中断处理函数(counter_reload是20000,TIM_TimeBaseStructure.TIM_Period=20000;)
void EXTI9_5_IRQHandler(void)
{
staticu16 C_tmp;
static u16 PE9_Counter;
static u16 PE9_last_count;
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line9);
C_tmp=TIM_GetCounter(TIM3);
//Delay(1);
if(!(GPIOE->IDR & GPIO_Pin_9))
{ // PE6=0 falling
PE9_Counter=C_tmp;
PE9_Counter=(PE9_Counter-PE9_last_count)>0?
(PE9_Counter-PE9_last_count):(PE9_Counter-PE9_last_count+counter_reload);
if (PE9_Counter <Min_duty || PE9_Counter >Max_duty) //1ms~2ms
return;
}
else
{//Rising
PE9_last_count=C_tmp;
}
}
}
void EXTI15_10_IRQHandler(void)
{
staticu16 C_tmp;
static u16 PE10_Counter;
static u16 PE10_last_count;
static u16 PE11_Counter;
static u16 PE11_last_count;
if(EXTI_GetITStatus(EXTI_Line10) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line10);
C_tmp=TIM_GetCounter(TIM3);
//Delay(1);
if(!(GPIOE->IDR & GPIO_Pin_10))
{ // PE6=0 falling
PE10_Counter=C_tmp;
PE10_Counter=(PE10_Counter-PE10_last_count)>0?
(PE10_Counter-PE10_last_count):(PE10_Counter-PE10_last_count+counter_reload);
if (PE10_Counter <Min_duty || PE10_Counter >Max_duty) //1ms~2ms
return;
}
else
{//Rising
PE10_last_count=C_tmp;
}
}
else if(EXTI_GetITStatus(EXTI_Line11) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line11);
C_tmp=TIM_GetCounter(TIM3);
if(!(GPIOE->IDR & GPIO_Pin_11))
{ // PE6=0 falling
PE11_Counter=C_tmp;
PE11_Counter=(PE11_Counter-PE11_last_count)>0?
(PE11_Counter-PE11_last_count):(PE11_Counter-PE11_last_count+counter_reload);
if (PE11_Counter <Min_duty || PE11_Counter >Max_duty) //1ms~2ms
return;
}
else
{//Rising
PE11_last_count=C_tmp;
}
}
}
0 0
- stm32普通IO口捕获PWM的高电平
- STM32采用普通的IO口来测量PWM的频率
- STM32的定时器有两种捕获模式——PWM输入模式和普通输入模式
- stm32的PWM输入捕获模式
- stm32使用PWM时,关闭PWM引脚会出现高电平解决方案
- stm32使用PWM时,关闭PWM引脚会出现高电平解决方案
- STM32 PWM捕获
- STM32 PWM捕获
- STM32 PWM 捕获4
- 判断STM32 GPIO输入口的输入状态(高电平或低电平)
- STM8S PWM输出停止后 IO口电平输出
- stm32 定时器pwm输入捕获
- stm32定时器输入捕获pwm
- STM32 PWM快速开关端口电平问题
- STM32中PWM频率捕获的相关配置(个人理解)
- stm32的jatg口配置为普通io口使用
- 常用的IO口电平
- STM32定时器捕获PWM脉冲频率
- 在腾讯云上创建您的SQL Cluster(2)
- 杂记
- 使用cocoa pods详解 小白教程
- Spring 框架
- 部署ArcGIS API3.17 For JavaScript IIS
- stm32普通IO口捕获PWM的高电平
- 结构类型的定义,应用
- rgb图像的直方图均衡化
- 尝试visual studio2015中c++的Module
- CodeForces - 611B 数学思维
- 1121. Damn Single (25)
- 力学现象动画演示——真空状态下的自由落体运动
- 最常用的PHP正则表达式收集整理
- IOC 和 AOP