OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4999|回复: 2

普通的超声波模块的数据读取

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
发表于 2014-6-25 13:43:44 | 显示全部楼层 |阅读模式
[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]
以前配置的,现在拿出来一起分享
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-6-25 20:13:57 | 显示全部楼层
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-25 22:39:12 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 00:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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