Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переход с STM32F10x на STM32F4xx
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Diman142
Приветствую коллеги, я начинающий разработчик и волею судеб столкнулся с семейством МК STM32.
Нужно было переписать проект для STM32F105RC на STM32F407VG. Соответственно пришлось переписывать некоторые функции в проекте связанные с периферией. Камнем преткновения стали функции чтения и записи SPI. В исходном проекте для F105RC она имеют следующий вид:

CODE
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;
}

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

CODE
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.
И что нужно изменить в этих функциях, чтобы они заработали на моем микроконтроллере,

Заранее спасибо.
Genadi Zawidowski
А можете уточнить, что подразумевается под словом "вылетает"?
Diman142
Цитата(Genadi Zawidowski @ Feb 13 2017, 23:27) *
А можете уточнить, что подразумевается под словом "вылетает"?


Если проходить программу по шагам то после прохождения циклов for в обеих функциях, программа переходит в Default handler, который является пустым бесконечным циклом.
Genadi Zawidowski
Тогда покажите что за буферы передаются в Ваши функции. Попробуйте читать регистры, но не писать в память - что изменится в "вылете".
Diman142
Цитата(Genadi Zawidowski @ Feb 14 2017, 01:00) *
Тогда покажите что за буферы передаются в Ваши функции. Попробуйте читать регистры, но не писать в память - что изменится в "вылете".


Буфера генерируются функциями более высокого уровня, вот пример значения буферов при попытки записи конфигураций в модуль. Я проверял, значения этих буферов совпадает со значениями в исходном проекте для F105RC.
В случае если убрать из функций операции записи в регистры, то у функции чтения не устанавливается флаг и программа стоит на шаге проверки флага, а у функции записи вылетает следующая ошибка, (при условии что я правильно понял то, что вы попросили сделать), но в default handler не залетает.
Genadi Zawidowski
Я же сказал про то что из регистра читать, в память не писать
Diman142
Цитата(Genadi Zawidowski @ Feb 14 2017, 02:09) *
Я же сказал про то что из регистра читать, в память не писать


Прошу прощения за глупый вопрос.
Я не до конца понимаю, читать из регистра DR, но не записывать его данные в буфера??
Genadi Zawidowski
было
Код
   readBuffer[i] = SPIx->DR;

стало
Код
   SPIx->DR;

или стало
Код
  (void) SPIx->DR;
Diman142
Цитата(Genadi Zawidowski @ Feb 14 2017, 13:13) *
было
Код
   readBuffer[i] = SPIx->DR;

стало
Код
   SPIx->DR;

или стало
Код
  (void) SPIx->DR;


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

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


Genadi Zawidowski
По дебаговской диагностике не подскажу. sorry.
Diman142
Если убрать шаг проверки флага, то программа не вылетает в default handler и нормально проходит.

Цитата(Genadi Zawidowski @ Feb 14 2017, 14:19) *
По дебаговской диагностике не подскажу. sorry.


А может есть пример для записи в буфера данных с spi для серии F4?
Если чтение и проверку флага оставить а каким-то образом изменить вот эту строчку?
Код
readBuffer[i] = SPIx->DR;
Genadi Zawidowski
Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.
Diman142
Цитата(Genadi Zawidowski @ Feb 14 2017, 14:27) *
Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.


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

CODE
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;

}
A.Lex
А где вы указываете какой именно SPI ?
Diman142
Цитата(A.Lex @ Feb 14 2017, 15:04) *
А где вы указываете какой именно 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
A.Lex
GPIO_OType_PP - это OUTPUT?
MISO -> INPUT
Diman142
Цитата(A.Lex @ Feb 14 2017, 17:30) *
GPIO_OType_PP - это OUTPUT?
MISO -> INPUT


PP - это push Pull
Miso как Input это в серии F10x, А для F4xx вроде нужно конфигурить, как AF, по крайней мере так во всех примерах.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.