Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/44: Рейтинг темы: голосов - 44, средняя оценка - 4.95
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
1

помогите с подключением GPS к STM32

03.11.2013, 14:38. Просмотров 8027. Ответов 16
Метки нет (Все метки)

Доброго времени суток!

сразу отмечу, что мой опыт работы с МК - практически нулевой. тем не менее по рабочим делам пришлось очень быстро осваиваться.. собственно задача - нужно подключить GPS (Olimex MOD-GPS) к STM32F4Dyscovery.
и сразу самый тупой и примитивный вопрос - в каким пинам подключаться? оО я планирую использовать USORT1, у него вроде как TX = PA9 , RX = PA10. Для работы GPS нужен источник 3.3V - я подключил пин на 5V. плюс GND. кстати, GPS с UEXT.
т.о. подключил 4 пина - tx, rx, 5v, gnd. все верно?
теперь код:
Код
#define MAX_STRLEN 255 // this is the maximum string length of our string in characters
volatile char received_string[MAX_STRLEN+1]; // this will hold the recieved string

void init_USORT6(uint32_t baudrate){
GPIO_InitTypeDef GPIO_InitStruct; // this is for the GPIO pins used as TX omd RX
USORT_InitTypeDef USORT_InitStruct; // this is for the USORT6 initilizotion
NVIC_InitTypeDef NVIC_InitStructure; // this is used to confikure the NVIC (nested vector interrupt controller)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USORT6, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USORT6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USORT6);

USORT_InitStruct.USORT_BaudRate = baudrate;
USORT_InitStruct.USORT_WordLength = USORT_WordLength_8b;
USORT_InitStruct.USORT_StopByts = USORT_StopByts_1;
USORT_InitStruct.USORT_Parity = USORT_Parity_No;
USORT_InitStruct.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None;
USORT_InitStruct.USORT_Mode = USORT_Mode_Tx | USORT_Mode_Rx;
USORT_Init(USORT6, &USORT_InitStruct);

USORT_ITConfig(USORT6, USORT_IT_RXNE, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = USORT6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USORT_Cmd(USORT6, ENABLE);
}

void USORT_puts(USORT_TypeDef* USORTx, volatile char *s){

while(*s){
// woyt until data rikystir is empty
while( !(USORTx->SR & 0x00000040) );
USORT_SendData(USORTx, *s);
*s++;
}
}

int main(void)
{
char *data = (char *)malloc(80);
init_USORT6(115000);
InitLCD();
while (1){
while (1){
int i=0;
//received_string содержит пакет с ответом от gps модуля
sprymtf( data, "%s", received_string);
ShowMessageWithDelay( data, 3, 0,1);
Delay(25);
}
}

void USORT6_IRQHomdler(void){
// check if the USORT6 receive interrupt flag was set
if( USORT_GetITStatus(USORT6, USORT_IT_RXNE) ){
static uint8_t cnt = 0;
char t = USORT6->DR;
if( (t != \n && t != \r) && (cnt < MAX_STRLEN) ){
received_string[cnt] = t;
cnt++;
}
else{
cnt = 0;
}
}
}
вот как-то так. код исправно выполняется в цикле - но от gps ничего не приходит. вот и вопрос - чего я делаю не так? не верно подключаю или может ошибка в коде - или и то и другое. уже неделю ломаю голову.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 14:38
Ответы с готовыми решениями:

Помогите новичку с stm32
После ковыряния теории и изучения статей про stm32 и usb порт появилось пару вопросиков. Увы,я...

Помогите с таймерами stm32 f103c8t6
#include &quot;stm32f10x.h&quot; // Device header //volatile uint32_t i; int main() {...

STM32 в Eclipse. Помогите разобраться
Всем привет. Разбираюсь с написанием софта для STM32 в Eclipse. За основу взял статью на этом...

Помогите подружить ADXL345 с HAL и STM32
Доброго времени суток, господа знатоки! Не получается подружить датчик ADXL345 и STM32. Только...

Помогите допилить Modbus Master на STM32
Привет, дорогие! Собираю проект на плате STM32F4Dicsovery, подключил Modbus Slave через библиотеку...

16
otixdos
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
03.11.2013, 16:06 2
Цитата Сообщение от ymjir
но от gps ничего не приходит. вот и вопрос
Эту фразу можно понять по разному.
1. Вообще нет никаких посылок с gps.
2. С gps посылки есть, но в процессор не доходят.
в зависимости от пункта и решение Вашей проблемы разное.
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
03.11.2013, 16:29 3
ну, обработчик исключения не вызывается. я так понимаю, это значит что вообще ничего не приходит?
0
HosH
0 / 0 / 0
Регистрация: 15.06.2017
03.11.2013, 16:45 4
Не известно как у вас система тактирования настроена. Возможно ноги оттуда растут! В какой среде пишете?
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
03.11.2013, 17:26 5
Keil
0
otixdos
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
03.11.2013, 18:05 6
Цитата Сообщение от ymjir
обработчик исключения
Может обработчик прерывания ?
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
03.11.2013, 18:10 7
да, конечно прерывания. ум за разум немного уже заходит) еще вопрос такой - gps управляется пакетами (https://www.olimex.com/Products/Modules ... K-NMEA.pdf), не косячу ли я с форматом пакетов? вообще я пытаюсь кинуть пакет test
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
03.11.2013, 18:18 8
Цитата Сообщение от ymjir
нужно подключить GPS (Olimex MOD-GPS) к STM32F4Dyscovery.
и сразу самый тупой и примитивный вопрос - в каким пинам подключаться? оО я планирую использовать USORT1, у него вроде как TX = PA9 , RX = PA10. Для работы GPS нужен источник 3.3V - я подключил пин на 5V. плюс GND. кстати, GPS с UEXT.
т.о. подключил 4 пина - tx, rx, 5v, gnd. все верно?
Зачем на ПЯТЬ Вольт-то?! На 3.3V подключйте. Надеюсь, GPS ещё живой.
Rx и Tx - убедитесь, что соединение с Dyscovery перекрёстное.
И ещё, если опыта мало, советую проверить работу UART сначала без GPS (чтобы исключить сомнения в этой части): соедините Rx и Tx на разъёме Dyscovery, посылайте что-нибудь в Tx - то же самое должно приниматься по Rx.
Цитата Сообщение от ymjir
код исправно выполняется в цикле
Как проверяете, что исправно? Светодидиком в цикле моргаете?
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
03.11.2013, 18:41 9
спасибо за совет. да, USORT похоже не работает - на rx отосланная строка не приходит( странно, в чем может быть косяк.
в цикле заодно вывожу строчку на LCD (в приведенном коде этой строчки нет) - он выполняется исправно...
0
HosH
0 / 0 / 0
Регистрация: 15.06.2017
03.11.2013, 18:52 10
Код
if( (t != n) && (cnt < MAX_STRLEN) )
наверное имелось ввиду \n (0x0A)

Код
USORT_puts(USORT1, "$PMTK000*32<CR><LF>");
и тут походу не всё верно. наверное вот так надо: "$PMTK000*32\n\r"
0
otixdos
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
03.11.2013, 18:53 11
В таких делах большую помощь оказывает COM логер (их большое множество). Посмотреть что отправляется. Посмотреть что приходит. Если на входе Rx процессора есть данные, копать софт. Если их там нет, копать железо.
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
03.11.2013, 19:23 12
Цитата Сообщение от hosh
Код:
USORT_puts(USORT1, "$PMTK000*32<CR><LF>"); и тут походу не всё верно. наверное вот так надо: "$PMTK000*32\n\r"Наоборот: сначала \r, потом \n.
<LF> всегда последний.
Поэтому в алгоритме удобно определять конец NMEA sentence именно по \n (0x0A).
0
HosH
0 / 0 / 0
Регистрация: 15.06.2017
03.11.2013, 20:59 13
Цитата Сообщение от OtyxPM
Цитата Сообщение от hosh
Код:
USORT_puts(USORT1, "$PMTK000*32<CR><LF>"); и тут походу не всё верно. наверное вот так надо: "$PMTK000*32\n\r"Наоборот: сначала \r, потом \n.
<LF> всегда последний.
Поэтому в алгоритме удобно определять конец NMEA sentence именно по \n (0x0A).

Согласен :) очепятался я просто...
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
04.11.2013, 11:09 14
спасибо за ответы! настроил USORT - заработал нормально (на замыкании на себя). но gps по-прежнему молчит. как бы понять, работает ли он вообще, или же я его уже спалил)
команды отправляю в формате USORT_puts(USORT6, "$PMTK000*32\r\n"); (я переключился на 6й юсарт вместо первого)
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
04.11.2013, 11:39 15
может с GPS сначала в терминалке побаловаться? сразу будет видно что присылает, как присылает, правильно ли команды отрабатывает. А уже потом кидаться на МК. А то можно долго искать косяки.
0
ymjir
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 8
04.11.2013, 14:12 16
еще раз всем спасибо за дельные советы.
перепаяли немного gps модуль, убрали uext - остался голый rs232 - и все волшебным образом заработало.
код в шапке поправил на рабочий (в моем случае) вариант - вдруг кому-нибудь пригодится.
0
HosH
0 / 0 / 0
Регистрация: 15.06.2017
04.11.2013, 14:57 17
А что за скорость такая 115000 ??? Как-то не стандартно... или это что бы враги не догадались??? :)
0
04.11.2013, 14:57
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 14:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Помогите разобраться с линковкой stm32+sdram
начал осваивать sdram, сейчас работаю с ней так: #define SDROM_START_ADDR ...

помогите настроить ПО для программирования STM32
Здравствуйте. Я в этом деле совсем уж новичок)) поэтому почти ничего не знаю. Нашел вроде подробные...

Помогите сделать сэлфи на stm32 и ov7670
Приветствую всех! Несмотря на шуточный заголовок (для привлечения внимания), пытаюсь решить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.