LINUX.ORG.RU

Микроконтроллеры, stm32

 , ,


1

2

Нужна помощь!!! Код программы с использованием микроконтроллера stm32F103C8 При срабатывании датчика движения(PB0) должен загораться светодиод(PC13) Код компилируется но не работает.Никак не могу разобраться,что может быть не так? (Использовал библиотеки HAL, сгенерированные в CubeMX)

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART2_UART_Init(void);

static GPIO_TypeDef* port;

static uint32_t pin;

static uint8_t isInitialized = 0;

void Move_Init(GPIO_TypeDef* gpioPort, uint32_t gpioPin)

{

port = gpioPort;

pin = gpioPin;

isInitialized = 1;

}

int8_t Move_Read()

{

if (isInitialized == 1)

{

return HAL_GPIO_ReadPin(port, pin);

}

else

{

return -1;

}

}

int main(void)

{

Move_Init(GPIOB, GPIO_PIN_0);

HAL_Init();

SystemClock_Config();

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_USART2_UART_Init();

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

int8_t moveData = Move_Read();

if (moveData >= 0)

{

  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, moveData);

}


Последнее исправление: Electro (всего исправлений: 7)

Ответ на: комментарий от Electro
while (1) {
  int8_t moveData = Move_Read();

  if (moveData > 0){ ///есть движение
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1); ///ставим бит
  }
  else if (moveData == 0){ ///нет движения
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); ///сбрасываем бит
  }

  sleep_ms(1000); ///какой-то слип должен быть - 1000мс тут от балды
}

должно быть наверное как-то так. слип вразумительный нужен, чтобы не опрашивать в цикле с максимальной скоростью.

зы. если есть осциллограф - посмотреть, там вообще датчик движения сигналит? если сигналит - что на 13 пине получается. может датчик плохой, схема неверно спаяна, светодиод плохой или подключен наоборот.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

не знаю ваши либы для стм

А для чего знаешь? По твоему коду не видно чтобы ты со встроенными МК работал когда-то

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от alysnix

какого х.. в пин пишется байт(moveData)

А эти ваши 0 и 1 во что превратятся? Правильно, они будут приведены к типу третьего параметра функции, то есть никак не меньше char. А если слегка погуглить, то окажется, что третий параметр – это перечисление, которое размером с int.

DrBrown
()
Ответ на: комментарий от DrBrown

Хм, а если moveData меньше нуля?

-1 там если неинициализировано. и возвращается там 0 или 1 если все нормально.

я не обратил внимания что там читается только пин. то есть возражение что может быть больше 1 снимается.

то есть пока Move_Read дает в норме или 0 или 1(я думал он может давать некую «скорость», то есть значения >1), такой код - нормальный.

while (1) {
  int8_t moveData = Move_Read();
  if (moveData >= 0){
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, moveData); ///ставим или сбрасываем бит
  };
  sleep_ms(1000); ///какой-то слип должен быть - 1000мс тут от балды
}
alysnix ★★★
()

я думаю у тебя проблема не в коде, а в схеме (в железе). Начиная от ошибки в подкл. к не той ноге, неработающего сенсора и/или светодиода и до кривой stm32

Бери готовые примеры из Интернета, начиная с blink и убеждайся в работе железа, потом будешь свое накручивать

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)

При срабатывании датчика движения(PB0) должен загораться светодиод(PC13)

А зачем здесь контроллер?

MX_USART2_UART_Init();

Зачем вам UART2?

if (isInitialized == 1)

Зачем эта проверка?


Вообще, код очень странно написан. Куча лишних действий непонятного назначения.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Какие ответы вы хотите получить от человека написавшего следующее - «Сам в этом не сильно разбираюсь, а такое написание нашёл на одном из сайтов» Копипаст бессмысленный и беспощадный (

pavel_l
()
Ответ на: комментарий от Electro

Сам в этом не сильно разбираюсь, а такое написание нашёл на одном из сайтов

Фигово. Тогда, по идее, надо либо сесть и начать разбираться (это не быстро), либо писать объявление в Job, чтобы тот самый «спец» сделал тебе «под ключ». Советы тебе здесь, конечно, дадут (уже дают), но копипастить это в свой проект без понимания, что оно делает — такое себе.

Вариант с Job, кстати, может прокатить, контроллерщики на ЛОРе точно есть. Сойдётесь ли вы в цене — вопрос отдельный.

(Если что, я в этой тематике НЕКОМПЕТЕНТЕН, я программист, но совсем в другой области.)

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от pavel_l

Да хотя бы на первые два вопроса - «зачем здесь вообще контроллер?» и «зачем здесь UART?»

Даже если ТС последует совету Хоббита и спросит в соответствующем разделе, ему ведь придется свою хотелку сформулировать. А в текущей формулировке логичным ответом будет «выкинь контроллер и соедини датчик со светодиодом проводком». Ну может еще транзистор поставить.

COKPOWEHEU
()
Ответ на: комментарий от futurama

Что ж это за учебный процесс, где датчик движения изучается раньше основ работы контроллера? К моменту упоминания внешней периферии должны ведь все уши прожужжать про внутреннюю, начиная от портов и заканчивая хотя бы UART'ом.

COKPOWEHEU
()
Ответ на: комментарий от Electro

USART2_UART для приёма и передачи данных,используется в нем (в асинхронном режиме).

В коде этого нет.

А, if (isInitialized == 1) нужна для проверки считывания сигнала с датчика

В коде написано другое. Там это просто бесполезный флаг, который железно устанавливается в начале.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Так этот код по идее же должен сработать,загореться светодиод на датчик движения т.к в основном коде while,вроде бы все условия и пины правильно распределены.

Electro
() автор топика
Ответ на: комментарий от Electro

вроде бы все условия и пины правильно распределены.

Значит, надо код отлаживать. Начать с такого, который 100% работает, постепенно добавлять то, что там надо по заданию и смотреть на каком этапе сломается.

Ваш код слишком переусложнен. Судя по описанию там достаточно чего-то вроде

#define SENS B,0,1
#define LED C,13,0
...
int main(){
  GPIO_config(SENS);
  GPIO_config(LED);
  while(1){
    if(GPI_ON(BTN))GPO_ON(LED); else GPO_OFF(LED);
  }
}

Никаких лишних переменных, никаких лишних иницилизаций - 10 строк кода

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Код избыточный, но (по логике) рабочий. Поэтому я предложил проверить железо, подключение и возможно настройки компилятора (может не под ту версию МК компилит)

futurama ★★★★★
()