查看: 537|回复: 5
打印 上一主题 下一主题

STM32寄存器之输入捕获

[复制链接] qrcode

28

主题

33

帖子

98

积分

注册会员

Rank: 2

积分
98
楼主
跳转到指定楼层
发表于 2016-1-4 01:58 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

源代码:

void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
GPIOA->ODR|=0<<0;
TIM2->ARR=arr;
TIM2->PSC=psc;
TIM2->CCMR1|=1<<0;
TIM2->CCMR1|=1<<4;
TIM2->CCMR1|=0<<10;
TIM2->CCER|=0<<1;
TIM2->CCER|=1<<0;
TIM2->DIER|=1<<1;
TIM2->DIER|=1<<0;
TIM2->CR1|=0X01;
MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
int main(void)
{

u32 temp=0;
u8  temp1;
STM32_Clock_Init(9);    //72MHz
uart_init(72,9600);
  delay(1000);
LED_Init();
KEY_Init();

TIM1_PWM_Init(899,0);
TIM2_Cap_Init(0xffff,72-1);
while(1)
{
    
delay(80);
LED0_PWM_VAL++;
if(LED0_PWM_VAL==300)LED0_PWM_VAL=0;
if(TIM2CH1_CAPTURE_STA&0X80)
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;
temp+=TIM2CH1_CAPTURE_VAL;
Uart1_SendString("HIGH:",5);
temp1=(u8)(temp/100000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100000/10000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10000/1000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%1000/100+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100/10+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10+0x30);
Uart1_SendByte(temp1);
Uart1_SendString(" usrn",7);
TIM2CH1_CAPTURE_STA=0;
}
}
}


void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM2CH1_CAPTURE_STA&0X80)==0)
{
if(tsr&0x01)
{
if(TIM2CH1_CAPTURE_STA&0X40)
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=0xffff;
}else TIM2CH1_CAPTURE_STA++;

}
}
if(tsr&0x02)
{
if(TIM2CH1_CAPTURE_STA&0X40)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=TIM2->CCR1;
TIM2->CCER&=~(1<<1);
}else
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA=0X40;
TIM2->CNT=0;
TIM2->CCER|=1<<1;
}
}
}
TIM2->SR=0;
}
功能:捕获PA0的按键高电平持续时间。

效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

134

帖子

160

积分

注册会员

Rank: 2

积分
160
沙发
发表于 2016-1-4 01:59 PM | 只看该作者

代码看不懂呦

大神

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

66

主题

492

帖子

924

积分

高级会员

Rank: 4

积分
924
板凳
发表于 2016-1-4 02:19 PM | 只看该作者
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0清除之前设置
GPIOA->CRL|=0X00000008; //PA0输入
GPIOA->ODR|=0<<0; //PA0下拉
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1|=1<<0; //CC1S=01选择输入端IC1映射到TI1上
TIM2->CCMR1|=1<<4; //IC1F=0001配置滤波器以Fck_int采样,2个时间后有效
TIM2->CCMR1|=0<<10; //IC2PS=00配置输入分频,不分频
TIM2->CCER|=0<<1; //CC1P=0上升沿捕获
TIM2->CCER|=1<<0; //CCIE=1允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=1<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=0X01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQn,2); //抢占2,子优先级0,组2
}
int main(void)
{

u32 temp=0;
u8  temp1;
Stm32_Clock_Init(9);    //72MHz
uart_init(72,9600);
  delay(1000);
LED_Init();
KEY_Init();

TIM1_PWM_Init(899,0);
TIM2_Cap_Init(0xffff,72-1); //以1MHz的频率计数
while(1)
{
    
delay(80);
LED0_PWM_VAL++;
if(LED0_PWM_VAL==300)LED0_PWM_VAL=0;
if(TIM2CH1_CAPTURE_STA&0X80) //成功捕获到了一次高电平
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL; //得到总的高电平时间
Uart1_SendString("HIGH:",5);
temp1=(u8)(temp/100000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100000/10000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10000/1000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%1000/100+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100/10+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10+0x30);
Uart1_SendByte(temp1);
Uart1_SendString(" usrn",7);
TIM2CH1_CAPTURE_STA=0; //开启下一次捕获
}
}
}
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM2CH1_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if(tsr&0x01) //溢出
{
if(TIM2CH1_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0xffff;
}else TIM2CH1_CAPTURE_STA++;

}
}
if(tsr&0x02) //捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM2CH1_CAPTURE_VAL=TIM2->CCR1; //获取当前的捕获值
TIM2->CCER&=~(1<<1); //CC1P=0设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA=0X40; //标记捕获到了上升沿
TIM2->CNT=0; //计数器清空
TIM2->CCER|=1<<1; //CC1P=1设置为下降沿捕获
}
}
}
TIM2->SR=0; //清除中断标志位
}
这回看懂了吧
回复 支持 反对

使用道具 举报

1

主题

99

帖子

81

积分

注册会员

Rank: 2

积分
81
地板
发表于 2016-1-11 07:45 PM | 只看该作者
可以详细点
回复 支持 反对

使用道具 举报

0

主题

91

帖子

4

积分

新手上路

Rank: 1

积分
4
5#
发表于 2016-1-13 07:35 PM | 只看该作者
可以用STM32的固件库吧
回复 支持 反对

使用道具 举报

0

主题

78

帖子

10

积分

新手上路

Rank: 1

积分
10
6#
发表于 2016-1-14 08:37 AM | 只看该作者
可以,不过我的是寄存器方式的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表