[mw_shl_code=c,true]/*main.c*/
#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"gpio.h"
#include"count.h"
u32 H,L;
u8 flag;
u32 count,sum;
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
TIM2_Cap_Init(0xffff,499,1); //500us计数一次
GPIO_Init();
Trig=0;
while(1)
{
Trig=1;
delay_us(20);
Trig=0;
TIM2->CCER&=~(1<<1);
if(TIM2->SR&0x02) //捕获上升沿
{
count=TIM2->CCR1;
// printf("UP\r\n");
}
TIM2->CCER|=1<<1; //捕获下降沿
if(TIM2->SR&0x02)
{
count=TIM2->CCR1; //记录在下降沿时捕获寄存器的值
// printf("%ld\r\n",count);
// printf("DOWN\r\n\r\n");
}
printf("%ld\r\n",count);
TIM2->CNT=0; //清除CNT和CCR1的值
TIM2->CCR1=0;
// TIM2->SR&=~(1<<0);
}
}
/*count.c*/
/******************************************************************************/
/***************************输入捕获配置***************************************/
/******************************************************************************/
#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"count.h"
void TIM2_Init(u16 arr)
{
RCC->APB1ENR|=1<<0;
RCC->APB2ENR|=1<<2;
TIM2->ARR=arr;
GPIOA->CRL&=0xfff00000;
GPIOA->CRL|=0x00038888;
GPIOA->ODR&=~(1<<0); //下拉输入 //必须改正
GPIOA->ODR&=~(1<<1);
GPIOA->ODR&=~(1<<2);
GPIOA->ODR|=1<<3;
TIM2->CCMR1|=1<<0;
TIM2->CCMR1&=0xffffff3f;
TIM2->CCMR1|=0x00000030;
TIM2->CCER&=~(1<<1); //捕获上升沿
TIM2->CCMR1&=0xfffffff3;
TIM2->CCER|=1<<0;
TIM2->DIER|=1<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=1<<0;
TIM2->CR2|=1<<7; //这样可以使用CH1~CH3通道,CH4没办法用,PA0,PA1均可用
MY_NVIC_Init(1,3,TIM2_IRQn,2);
}
void TIM3_Init(u16 arr,u16 psc) //作为计时器
{
RCC->APB1ENR|=1<<1;
TIM3->ARR=arr; //装初值
TIM3->  SC=psc;
TIM3->DIER|=1<<0;
// TIM3->CR1|=1<<0;
MY_NVIC_Init(1,3,TIM3_IRQn,2);
}
void TIM2_Cap_Init(u16 arr,u16 psc,u16 way)
{
RCC->APB1ENR|=1<<0; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //开启PA时钟
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->  SC=psc; //预分频器设置
switch(way)
{
case 1:
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0x00000008;
break;
case 2:
GPIOA->CRL&=0xffffff00;
GPIOA->CRL|=0x00000088;
break;
case 3:
GPIOA->CRL&=0xfffff000;
GPIOA->CRL|=0x00000888;
break;
case 4:
GPIOA->CRL&=0xffff0000;
GPIOA->CRL|=0x00008888;
break;
}
switch(way)
{
case 1:
TIM2->CCMR1|=1<<0; //IC1映射到TI1上
TIM2->CCMR1|=1<<4; //采样频率
TIM2->CCER&=~(1<<1); //上升沿捕获
TIM2->CCER|=1<<0; //通道1 捕获使能
break;
case 2:
TIM2->CCMR1|=1<<8; //CH1 PWM2模式
TIM2->CCMR1|=1<<12;
TIM2->CCER&=~(1<<5); //开启通道
TIM2->CCER|=1<<4; //MOE 主输出使能
break;
case 3:
TIM2->CCMR2|=1<<0; //CH1 PWM2模式
TIM2->CCMR2|=1<<4;
TIM2->CCER&=~(1<<9); //开启通道
TIM2->CCER|=1<<8; //MOE 主输出使能
break;
case 4:
TIM2->CCMR2|=1<<8; //CH1 PWM2模式
TIM2->CCMR2|=1<<12;
TIM2->CCER&=~(1<<13); //开启通道
TIM2->CCER|=1<<12; //MOE 主输出使能
break;
}
TIM2->DIER|=1<<0;
TIM2->DIER|=1<<1;
TIM2->CR1|=1<<0;
TIM2->CR1|=1<<7;
}
/*count.h*/
#ifndef COUNT_H
#define COUNT_H
#include"sys.h"
void TIM3_Init(u16 arr,u16 psc);
void TIM2_Init(u16 arr);
void TIM2_Cap_Init(u16 arr,u16 psc,u16 way);
#endif
/*gpio.c*/
#include"gpio.h"
void GPIO_Init()
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0xfffff000;
GPIOB->CRL|=0x00000333;
GPIOB->ODR|=1<<0;
// GPIOB->ODR|=1<<0;
// GPIOB->ODR|=1<<0;
}
/*gpio.h*/
#ifndef GPIO_H
#define GPIO_H
#include"sys.h"
#define Trig PBout(0)
//#define Echo PBin(1)
void GPIO_Init(void);
#endif
[/mw_shl_code]
以前配置的,现在拿出来一起分享
|