#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "timer.h"
#include "chao.h"
#include "fat.h"
#include "fontupd.h"
#include "flash.h"
#include "spi.h"
#include "fat.h"
#include "text.h"
extern u8 flag;
long S=0;
u8 disbuff[4]={0,0,0,0,};
void StartModule()
{
TX=1;
delay_us(25);
TX=0;
delay_us(300);
}
void Count()
{
if(flag==0)
{
S=(TIM3->CNT*340.0000/2000);
disbuff[0]=S/1000;
disbuff[1]=S%1000/100;
disbuff[2]=S%1000%100/10;
disbuff[3]=S%1000%10%10;
LED0=!LED0;
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowNum(142,150,disbuff[0],1,16);
LCD_ShowNum(150,150,disbuff[1],1,16);
LCD_ShowNum(158,150,disbuff[2],1,16);
LCD_ShowNum(166,150,disbuff[3],1,16);
}
else
{
POINT_COLOR=BLUE;
Show_Str(30,170,"所测得距离超过规定的范围",16,0);
}
}
int main(void)
{
u8 i;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LED_Init();
LCD_Init();
Timerx_Init(60000,71);
SPI_Flash_Init(); //SPI FLASH初始化
if(Font_Init())//字库不存在,则更新字库
{
POINT_COLOR=RED;
LCD_Clear(WHITE);
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"Font Updating...");
//字体更新
SD_Initialize(); //初始化SD卡
while(FAT_Init()) //FAT 错误
{
LCD_ShowString(60,90,"FAT SYS ERROR");
i= SD_Initialize();
if(i)//SD卡初始化
{
LCD_ShowString(60,110,"SD_CARD ERROR");
}
delay_ms(500);
LCD_Fill(60,90,240,126,WHITE);//清除显示
delay_ms(500);
LED0=!LED0;
}
LCD_Fill(60,90,240,126,WHITE);//清除显示
while(Update_Font()!=0)//字体更新出错
{
LCD_ShowString(60,90,"SYSTEM FILE LOST");
delay_ms(500);
LCD_ShowString(60,90,"Please Check....");
delay_ms(500);
LED0=!LED0;
};
LCD_Clear(WHITE);
}
POINT_COLOR=RED;
Show_Str(30,150,"显示测距距离:0000毫米",16,0);
Show_Str(30,30,"无线传输超声波测距",16,0);
Show_Str(30,50,"移植正点原子的程序",16,0);
Show_Str(30,110,"奋斗STM32移植程序",16,0);
while(1)
{
StartModule();
while(RX==0); //当RX为零时等待
TIM3->CNT=0;
TIM3->CR1|=0x01; //使能定时器3 //开启计数
while(RX==1); //当RX为1计数并等待
TIM3->CR1&=0xfffe; //使能定时器3
Count(); //计算
delay_ms(200);
}
}
#include "timer.h"
#include "led.h"
u8 flag;
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1;
flag=1;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->  SC=psc; //预分频器72,得到1MHZ的计数时钟
// //这两个东东要同时设置才可以使用中断
// TIM3->DIER|=1<<0; //允许更新中断
// TIM3->DIER|=1<<6; //允许触发中断
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,?
}
这样程序 距离可以测得出来。。但是把定时器中断范围了开了就不行了,我想测得距离不能超过超声波模块的距离
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
哪里出了问题啊。。
|