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

А если внимательнее почитать?

image.thumb.png.3fb6f88dca4c68bdda004e831a555060.png

У STM32F103 тоже ноль по-умолчанию:

Clipboard02.png

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


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

Да действительно, помогло.

//======================================================================================
void init_TIM4_ENA (void)
//======================================================================================
{
  GPIO_InitTypeDef         GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
                         
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // PB6, PB7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);

  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);

  TIM_Cmd(TIM4, ENABLE);
}

Расширил инит и все поднялось.

Запутало немного, что STM считает таймеры от 1

image.thumb.png.6dce694062057b6970360dc757c36d2b.png

, а GD от нуля.

image.thumb.png.9265d57ad5c0a25000a5a734f154f6e8.png

Всем спасибо. Буду подправлять везде инит, успешно работающий на STM :)

ADC, DAC, CAN поднялись без проблем.

С SPI поднялся, но там непонятка с переключением полярности SCK

после переключения возникает непонятный глюк. Решил переключением фронтов на MISO/MOSI.

Позднее опишу подробнее.

 

 

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


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

на 3-й странице в этой ветке я выкладывал документ о совместимости. Почитайте про SPI - многие вопросы отпадут (для серии 10x - оч.много ньюансов).

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


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

По поводу SPI.

Так получилось, что у меня на одном SPI микросхемы, у которых разная полярность защелкивания данных по SCLK

Несколько микросхем я опрашивал на STM так: (с разными CS)

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   SPI2->CR1 &= ~SPI_CPOL_High; // sclk low 
   GPIO_WriteBit (GPIOA, GPIO_Pin_6, Bit_RESET); // cs =0
   SPI_I2S_SendData(SPI2, ch);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
   value = SPI_I2S_ReceiveData(SPI2) ;
   GPIO_WriteBit (GPIOA, GPIO_Pin_6, Bit_SET); // cs =1

А с другой полярностью так:

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   SPI2->CR1 |= SPI_CPOL_High; // sclk high
   SPI_I2S_SendData(SPI2, ch);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
   SPI_I2S_ReceiveData(SPI2); // данные не нужны, выкидываем
   GPIO_WriteBit (GPIOB, GPIO_Pin_4, Bit_SET); // stb =1
   GPIO_WriteBit (GPIOB, GPIO_Pin_4, Bit_RESET); // stb =0
 

В итоге, пока не было записи уникальной микросхемы все работало, а после записи в неё данные ломались.

Долго я бился с этим включая выключая SPI, даже выключал тактирование, ничего не помогало, в итоге решил не трогать вообще SPOL, а играть переключением CPHA сделал так

Для одних

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   GPIO_WriteBit (GPIOA, GPIO_Pin_6, Bit_RESET); // CS = 0
   SPI_I2S_SendData(SPI2, ch);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
   value = SPI_I2S_ReceiveData(SPI2);
   GPIO_WriteBit (GPIOA, GPIO_Pin_6, Bit_SET);  // cs = 1

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

По рекомендации GD дергать CPHA надо при выключенном SPI:

 

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) != RESET);
   SPI2->CR1 &= ~0x40; // SPE = 0 spi off
   SPI2->CR1 &= ~SPI_CPHA_2Edge; // CPHA = 0
   SPI2->CR1 |= 0x40;  // SPE = 1 spi on

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   SPI_I2S_SendData(SPI2, ch);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
   SPI_I2S_ReceiveData(SPI2);
   GPIO_WriteBit (GPIOB, GPIO_Pin_1, Bit_SET); // stb =1
   GPIO_WriteBit (GPIOB, GPIO_Pin_1, Bit_RESET); // stb =0

   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) != RESET);
   SPI2->CR1 &= ~0x40; // SPE = 0 spi off
   SPI2->CR1 |= SPI_CPHA_2Edge; // CPHA = 1
   SPI2->CR1 |= 0x40;  // SPE = 1 spi on
 

Так заработало нормально, вдруг кому пригодится

STM позволяет больше вольностей, чем GD, буду копать дальше.

 

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


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

Добрый день. Столкнулся с проблемой на GD32F103. Не получается стереть страницу FLASH. Код такой:

Spoiler
flash_status Page_Erase (uint32_t Pagex, uint32_t Amount)
{
//---Variables---//
fmc_state_enum state;
uint32_t       flash_page_start_addr; // Начальный адрес страницы.
uint32_t       counter = 0;
uint32_t       temp    = 0;
//---------------//

if ( (Pagex >= FMC_SIZE) || (Amount > FMC_SIZE) )
  return FLASH_WROG_ADDRES;
  
flash_page_start_addr = PAGE0_ADDR + (FLASH_PAGE_SIZE * 1024)*Pagex; // Вычисление начального адреса первой стираемой страницы.

//---Процедура UnLock---//
temp = FMC_CTL0;
while ( (temp & FMC_CTL0_LK) && (counter < FMC_TIMEOUT_COUNT) )
  {
  fmc_unlock(); // Unlock the main FMC operation.
  counter++;
  temp = FMC_CTL0;
  }
  
if (counter == FMC_TIMEOUT_COUNT)
  return FLASH_ERROR;
//----------------------//

for (uint32_t i=0; i<Amount; i++)
  {
  state                  = fmc_page_erase(flash_page_start_addr);
  flash_page_start_addr += (FLASH_PAGE_SIZE * 1024);

  if (state != FMC_READY)
    break; // return FLASH_ERROR;
  }

//---Процедура Lock---//
temp    = FMC_CTL0;
counter = 0;
while ( (!(temp & FMC_CTL0_LK)) && (counter < FMC_TIMEOUT_COUNT) )
  {
  fmc_lock(); // Lock the main FMC operation.
  counter++;
  temp = FMC_CTL0;
  }
  
if (counter == FMC_TIMEOUT_COUNT)
  return FLASH_ERROR;
//--------------------//

if (state != FMC_READY)
  return FLASH_ERROR;
else
  return FLASH_OK;
}
//------------------------------------------------------------------------------//

Использую библиотечные функции из драйверов производителя. Проверил их, всё согласно даташитам, никакого криминала, а страница не трётся. Хотя состояние state всегда FMC_READY, а в отладчике вижу, что страница не поменялась. SYS_CLK = 108 MHz.

Изменено пользователем haker_fox
Убрал длинный код под спойлер.

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


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

2 hours ago, vit496 said:

что за 1024?

FLASH_PAGE_SIZE - размер страницы в килобайтах. Он у меня равен 1. Соответственно, FLASH_PAGE_SIZE * 1024 = размер в байтах.

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


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

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

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

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

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

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

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

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

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

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