Перейти к содержанию
    

Переход с STM32F10x на STM32F4xx

Приветствую коллеги, я начинающий разработчик и волею судеб столкнулся с семейством МК STM32.

Нужно было переписать проект для STM32F105RC на STM32F407VG. Соответственно пришлось переписывать некоторые функции в проекте связанные с периферией. Камнем преткновения стали функции чтения и записи SPI. В исходном проекте для F105RC она имеют следующий вид:

 

int readfromspi(uint16 headerLength, const uint8 *headerBuffer, uint32 readlength, uint8 *readBuffer)
{

int i=0;

   GPIO_ResetBits(SPIx_CS_GPIO, SPIx_CS);

   for(i=0; i<headerLength; i++)
   {
   	SPIx->DR = headerBuffer[i];

    	while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

    	readBuffer[0] = SPIx->DR ; 
   }

   for(i=0; i<readlength; i++)
   {
   	SPIx->DR = 0;  

   	while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

     readBuffer[i] = SPIx->DR ;
   }

   GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

   return 0;
}

и соответственно

 

int writetospi(uint16 headerLength, const uint8 *headerBuffer, uint32 bodylength, const uint8 *bodyBuffer)
{

int i=0;

   GPIO_ResetBits(SPIx_CS_GPIO, SPIx_CS);

   for(i=0; i<headerLength; i++)
   {
   	SPIx->DR = headerBuffer[i];

   	while ((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

   	SPIx->DR;
   }

   for(i=0; i<bodylength; i++)
   {
    	SPIx->DR = bodyBuffer[i];

   	while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

	SPIx->DR ;
}

   GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

   return 0;
}

 

Все необходимые definы я сделал программа компилируется, но вылетает после операции чтения или записи.

Помогите пожалуйста понять, почему данные функции не отрабатывают на STM32F407VG.

И что нужно изменить в этих функциях, чтобы они заработали на моем микроконтроллере,

 

Заранее спасибо.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можете уточнить, что подразумевается под словом "вылетает"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можете уточнить, что подразумевается под словом "вылетает"?

 

Если проходить программу по шагам то после прохождения циклов for в обеих функциях, программа переходит в Default handler, который является пустым бесконечным циклом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Буфера генерируются функциями более высокого уровня, вот пример значения буферов при попытки записи конфигураций в модуль. Я проверял, значения этих буферов совпадает со значениями в исходном проекте для F105RC.

В случае если убрать из функций операции записи в регистры, то у функции чтения не устанавливается флаг и программа стоит на шаге проверки флага, а у функции записи вылетает следующая ошибка, (при условии что я правильно понял то, что вы попросили сделать), но в default handler не залетает.

post-93785-1487027020_thumb.jpg

post-93785-1487027099_thumb.jpg

Изменено пользователем Diman142

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же сказал про то что из регистра читать, в память не писать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же сказал про то что из регистра читать, в память не писать

 

Прошу прощения за глупый вопрос.

Я не до конца понимаю, читать из регистра DR, но не записывать его данные в буфера??

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

было

   readBuffer[i] = SPIx->DR;

стало

   SPIx->DR;

или стало

  (void) SPIx->DR;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

было

   readBuffer[i] = SPIx->DR;

стало

   SPIx->DR;

или стало

  (void) SPIx->DR;

 

Спасибо за пояснение.

Сделал, как вы сказали программа программа выдает ошибку, (ошибка на скрине).

Ошибка появляется на шаге проверки флага.

 

while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

 

post-93785-1487070954_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По дебаговской диагностике не подскажу. sorry.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если убрать шаг проверки флага, то программа не вылетает в default handler и нормально проходит.

 

По дебаговской диагностике не подскажу. sorry.

 

А может есть пример для записи в буфера данных с spi для серии F4?

Если чтение и проверку флага оставить а каким-то образом изменить вот эту строчку?

 readBuffer[i] = SPIx->DR;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.

 

Да действительно были разрешены прерывания, от SPI1, я убрал это дело и повторил то, что вы попросили сделать, при запрете прерывания программа проходит циклы for и также вылетает в default handler, вот инициализация на всякий случай.

 

int SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPIx, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

SPI_I2S_DeInit(SPIx);

// SPIx Mode setup
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;	 //
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPIx, &SPI_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
// SPIx SCK and MOSI pin setup

GPIO_InitStructure.GPIO_Pin = SPIx_SCK | SPIx_MOSI | SPIx_MISO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(SPIx_GPIO, &GPIO_InitStructure);

// SPIx CS pin setup
GPIO_InitStructure.GPIO_Pin = SPIx_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(SPIx_CS_GPIO, &GPIO_InitStructure);
// Disable SPIx SS Output
SPI_SSOutputCmd(SPIx, DISABLE);

// Enable SPIx
SPI_Cmd(SPIx, ENABLE);

// Set CS high
GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

return 0;

}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где вы указываете какой именно SPI ?

 

В запуске SPI

SPIx = SPI1

 

SPI_Cmd(SPIx, ENABLE);

 

Сделаны следующие операции define:

 

#define SPIx_GPIO                    GPIOA
#define SPIx_CS                    GPIO_Pin_4
#define SPIx_CS_GPIO                GPIOA
#define SPIx_SCK                    GPIO_Pin_5
#define SPIx_MISO                    GPIO_Pin_6
#define SPIx_MOSI                    GPIO_Pin_7
#define SPIx                                             SPI1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...