【GD32使用】基于GD32的超声波模块开发

基于GD32的超声波模块开发

代码见下:

首先初始化引脚接口,利用PA11作为Triger触发脚,PB12作为Echo脚。 (注意如果采集到的超声波信号一直为0,请检查触发脉宽是否大于10us,另外驱动电压vcc和Echo引脚的响应信号的电压均为5V,使用的时候要避免直接与IO口进行连接(GD32引脚最大电压为3.6V!!!!!))

rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_12);
	gpio_bit_reset(GPIOA,GPIO_PIN_11);
	gpio_bit_reset(GPIOB,GPIO_PIN_12);

本例中使用TImer1作为计数时钟,初始化Timer1。由于数据处理是在中断中进行的,因此也要初始化中断。

timer_oc_parameter_struct timer_ocintpara;
	timer_parameter_struct timer_initpara;
	//初始化中断
	NVIC_SetPriorityGrouping(NVIC_PRIGROUP_PRE4_SUB0);
	nvic_irq_enable(EXTI10_15_IRQn,4,0);
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB,GPIO_PIN_SOURCE_12);
	exti_init(EXTI_12,EXTI_INTERRUPT,EXTI_TRIG_RISING);
	exti_interrupt_flag_clear(EXTI_12);

	//定时器1初始化
	rcu_periph_clock_enable(RCU_TIMER1);

	timer_deinit(TIMER1);

	/* TIMER1 configuration */
	//1us进行一次计数
	timer_initpara.prescaler         = 119;
	timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
	timer_initpara.counterdirection  = TIMER_COUNTER_UP;
	timer_initpara.period            = 65535;
	timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
	timer_initpara.repetitioncounter = 0;
	timer_init(TIMER1,&timer_initpara);

定义产生触发信号的函数

void Triger(void)
{
          
   
	uint32_t count=0;
	gpio_bit_set(GPIOA,GPIO_PIN_11);
    
	for(count=0;count<800;count++);//产生一个大于10us的脉冲,这里的800是用示波器测出来的。
    
	gpio_bit_reset(GPIOA,GPIO_PIN_11);

}

最后在中断中对数据进行处理输出即可

/*!
    rief      Timer1 Interrupt handler
    param[in]  none
    param[out] none
    
etval     none
*/
void Timer1_EXTI_IRQHandler(void)
{
          
   
	uint32_t lastCount=0;

	if(RESET!=exti_interrupt_flag_get(EXTI_12))//发生超声波中断
	{
          
   
        //先将定时器进行初始化,设置计数寄存器为0
		timer_counter_value_config(TIMER1,0);
		timer_enable(TIMER1);
        
		while(gpio_input_bit_get(GPIOB,GPIO_PIN_12)==1);
		lastCount=timer_counter_read(TIMER1);
        
		printf("get trigger !!value = %d cm
",(lastCount*34/2000));
		timer_disable(TIMER1);
        
		exti_interrupt_flag_clear(EXTI_12);
	}
	
}

下面程序是初始化串口的代码,作为开发参考。

usart.c

#include "MiniSys_usart.h"

/*!
    rief      USART initialize function
    param[in]  none
    param[out] none
    
etval     none
*/
void MiniSys_USART_Init(void)
{
          
   
	/* enable GPIO clock */
	rcu_periph_clock_enable(RCU_GPIOB);
	
	/* enable USART clock */
	rcu_periph_clock_enable(RCU_USART0);
	
	/* connect port to USART0_TX */
	gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6);
	
	/* connnect port to USART0_RX */
	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
	
	/* remap config */
	gpio_pin_remap_config(GPIO_USART0_REMAP,ENABLE);
	
	/*usart configure */
	usart_deinit(USART0);
	usart_baudrate_set(USART0,115200U);
	usart_receive_config(USART0,USART_RECEIVE_ENABLE);
	usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
	usart_enable(USART0);
}



/*!
    rief      retarget the C library printf function to the USART
    param[in]  none
    param[out] none
    
etval     none
*/
int fputc(int ch, FILE *f)
{
          
   
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}
经验分享 程序员 微信小程序 职场和发展