#include "stm32f10x.h"
#include <stdio.h>
int overcount=0;
void RCC_Configuration(void);
void NVIC_Config(void);
void USART1_Configuration(void);
void UART_PutChar(USART_TypeDef* USARTx, char Data);
void UART_PutStr (USART_TypeDef* USARTx, char *str);
float Senor_Using(void);
void CH_SR04_Init(void);
void delay1ms(unsigned int x)
{
unsigned char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay_us(u32 Number)
{
u32 i=0;
while(Number--){
i=12; while(i--);
}
}
int main(void)
{
RCC_Configuration();
USART1_Configuration();
NVIC_Config();
CH_SR04_Init();
UART_PutChar(USART1,Senor_Using()); //一調用senor_using串口調試助手就什么也輸不出來,不調用的話至少會輸出hello!
while(i)
{
UART_PutStr ( USART1, "hello!");
delay1ms(1000);
}
}
void RCC_Configuration(void)
{
//----------ê1óÃía2¿RC¾§Õñ-----------
RCC_DeInit(); //3õê¼»ˉÎaè±ê¡Öμ
RCC_HSEConfig(RCC_HSE_ON); //ê1Äüía2¿μĸßËùê±Öó
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //μè′yía2¿¸ßËùê±Öóê1Äü¾íD÷
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
//---------′ò¿aÏàó|íaéèê±Öó--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //ê1ÄüAPB2íaéèμÄGPIOAμÄê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}
/*******************************************************************************
oˉêyÃû£oUSART1_Configuration
êä èë:
êä 3ö:
1|ÄüËμÃ÷£o
3õê¼»ˉ′®¿úó2¼té豸£¬ÆôóÃÖD¶Ï
ÅäÖÃ2½Öè£o
(1)′ò¿aGPIOoíUSART1μÄê±Öó
(2)éèÖÃUSART1ὸö1ü½ÅGPIOÄ£ê½
(3)ÅäÖÃUSART1êy¾Y¸ñ꽡¢2¨ìØÂêμè2Îêy
(4)ê1ÄüUSART1½óêÕÖD¶Ï1|Äü
(5)×îoóê1ÄüUSART11|Äü
*/
void USART1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* μú42½£oÅäÖÃUSART12Îêy
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructer;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructer);
}
void CH_SR04_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
/*TRIG????*/
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);
/*ECOH????*/
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB, & GPIO_InitStructer);
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=999;
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //????72
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//???
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);
}
float Senor_Using(void)
{
float length=0,sum=0;
u16 tim;
int i=0;
while(i!=5)
{
GPIO_SetBits(GPIOB, GPIO_Pin_8);
delay_us(20);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);
i+=1;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);
TIM_Cmd(TIM2,DISABLE);
tim=TIM_GetCounter(TIM2);
length=(tim+overcount*1000)/58.0;
sum=length+sum;
TIM2->CNT=0;
overcount=0;
delay1ms(100);
}
length=sum/5;
return length;
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
overcount++;
}
}
void UART_PutChar(USART_TypeDef* USARTx, char Data)
{
USART_SendData(USARTx, Data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
void UART_PutStr (USART_TypeDef* USARTx, char *str)
{
while (0 != *str)
{
UART_PutChar(USARTx, *str);
str++;
}
}
|