adnega 11 24 октября, 2022 Опубликовано 24 октября, 2022 · Жалоба А если внимательнее почитать? У STM32F103 тоже ноль по-умолчанию: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба Да действительно, помогло. //====================================================================================== 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 , а GD от нуля. Всем спасибо. Буду подправлять везде инит, успешно работающий на STM :) ADC, DAC, CAN поднялись без проблем. С SPI поднялся, но там непонятка с переключением полярности SCK после переключения возникает непонятный глюк. Решил переключением фронтов на MISO/MOSI. Позднее опишу подробнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба на 3-й странице в этой ветке я выкладывал документ о совместимости. Почитайте про SPI - многие вопросы отпадут (для серии 10x - оч.много ньюансов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба Да я этот мануал читал Этот пункт имеется ввиду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба По поводу 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, буду копать дальше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 11 декабря, 2023 Опубликовано 11 декабря, 2023 (изменено) · Жалоба Добрый день. Столкнулся с проблемой на 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. Изменено 11 декабря, 2023 пользователем haker_fox Убрал длинный код под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vit496 0 11 декабря, 2023 Опубликовано 11 декабря, 2023 · Жалоба 2 hours ago, LAS9891 said: FLASH_PAGE_SIZE * 1024 что за 1024? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 11 декабря, 2023 Опубликовано 11 декабря, 2023 · Жалоба 2 hours ago, vit496 said: что за 1024? FLASH_PAGE_SIZE - размер страницы в килобайтах. Он у меня равен 1. Соответственно, FLASH_PAGE_SIZE * 1024 = размер в байтах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться