Не работает HC-SR04 и stm32f3

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Не работает HC-SR04 и stm32f3

Сообщение swfvova »

Привет) Решил что-то в жизни поменять, начал с spl на cmsis :)) попробовал подключить дальномер (HC-SR04) к stm32f3 вроде бы все правильно сделал, а работать не хочет (принимает всегда нули), можете, пожалуйста, посмотреть мой код и сказать где ошибка. Заранее спасибо за ответ)
Спойлер

Код: Выделить всё

#define PIN_TRIG (1 << 8)
#define PIN_ECHO (1 << 10)

void delay_us(const uint16_t us)
{
  uint32_t i = us * 28;
  while (i-- > 0) {
    __asm("nop");
  }
}

int main() {
	float distance;
	uint16_t counter;
	
	//TRIG - PA8
	//Echo - PA10
	RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
	GPIOA->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER10_1;
	GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR10_0;
	GPIOA->PUPDR |= GPIO_PUPDR_PUPDR8;
	//GPIOA->PUPDR
	
	//Led
	RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
	GPIOE->MODER |= GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER9_0; //out
	
	while(1) {
		counter = 0;
		
		GPIOA->ODR |= PIN_TRIG;
		delay_us(10);
		GPIOA->ODR &= ~PIN_TRIG;

		while((GPIOA->IDR & PIN_ECHO) == 0);
		
		while((GPIOA->IDR & PIN_ECHO) == 1) {
			GPIOE->ODR |= 1 << 13;
			counter++;
		}
		GPIOE->ODR &= ~(1 << 13);
		
	}
}
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Не работает HC-SR04 и stm32f3

Сообщение oleg110592 »

зачем PA10 в Alternate function mode
зачем PA8 включена подтяжка
для измерения длительности импульса лучше (имхо) использовать таймер в режиме захвата
Реклама
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Re: Не работает HC-SR04 и stm32f3

Сообщение swfvova »

oleg110592 писал(а):зачем PA10 в Alternate function mode
зачем PA8 включена подтяжка
для измерения длительности импульса лучше (имхо) использовать таймер в режиме захвата
можете, пожалуйста, подробней рассказать
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Не работает HC-SR04 и stm32f3

Сообщение oleg110592 »

GPIOA->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER10_1;
смотрим определения:

Код: Выделить всё

#define GPIO_MODER_MODER8_0 ((uint32_t)0x00010000)
#define GPIO_MODER_MODER10_1 ((uint32_t)0x00200000)
смотрим документацию:
раздел GPIO port mode register (GPIOx_MODER) (x = A..F)
00: Input mode (reset state)
01: General purpose output mode
10: Alternate function mode
11: Analog mode
2 в шестнадцатеричном это 10 в бинарном виде
т.е. вывод PA10 находится в Alternate function mode.
так понимаю он (PA10) должен быть входом, по сбросу он и так вход, поэтому достаточно настроить только PA8 на выход:

Код: Выделить всё

GPIOA->MODER |= GPIO_MODER_MODER8_0;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8_0;
подтяжка Pull-up на PA8 не нужна (он настроен на выход), а вот на PA10 может пригодится:

Код: Выделить всё

GPIOA->PUPDR |= GPIO_PUPDR_PUPDR10_0;
смотреть раздел GPIO port pull-up/pull-down register (GPIOx_PUPDR) (x = A..F)

о режиме захвата таймера (Timer input capture mode) можно посмотреть в AN4013 Application note и в примерах
Реклама
Эиком - электронные компоненты и радиодетали
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Re: Не работает HC-SR04 и stm32f3

Сообщение swfvova »

oleg110592, спасибо)
Реклама
Ответить

Вернуться в «ARM»