Ладно, допустим с выводом за раз, и без прерываний, массива более 255 байт на STM32F0 через DMA я пролетаю, но как
отправить хотя бы 255 байт?
Вот так:
не отправляется, в ЛА видно что есть старт, и правильно с нормальной скоростью отправляется адрес устройства,
и всё, больше никаких байт не идёт и стопа тоже нет.
Что не так?
Код практически целиком взят из снипетов (см. 1 пост), только изменён I2C2 на I2C1 и канал DMA c 4 на 2
(в снипетах код для STM32F072RBT)
Возникли вопросы по регистру I2C1->CR2 в STM32F030F4:
Cудя по дащиту (RM стр. 518) там есть секция "NBYTES" которая имеет размерность 8 бит и куда
записывается количество байт для передачи (максимум 255), т.е. по максимуму это выглядит так:
I2C1->CR2 = I2C_CR2_AUTOEND | (256<<16) | (OLED_addr_127<<1); /* (3) */
я правильно понимаю, что этота секция не даст отправить вподряд более 255 байт между "старт-адрес-..байты...-стоп"?
Этот же регистр не даст передать по DMA более 255 байт вподряд, хотя у DMA есть регистр DMA1_Channel2->CNDTR
куда можно записать уже 16 бит ?
Пока решил заняться STM32F030F4, для STM32F030F4 у меня работает только ногодрыг, не получается запустить аппаратный I2C, вот часть кода:
может кто нибудь заметит ошибку, пока что в ЛА невидно вообще никакой активности на линиях I2C
они сидят в высоком уровне даже в момент ресета.
Что-то не работает моя переделка снипета от F0
Вот часть кода:
Если раскомментировать в функции OLED_SendScreen пересылку без DMA - тогда работает, если выполнить
OLED_SendScreen в том виде как сейчас, в ЛА видно что происходит "условие старт", после чего линии лежат
в нуле и ничего не передаётся.
Снипет смотрел этот:
Я просто не пойму почему в версии проекта с ногодрыгом я отправлял абсолютно все байты, включая адрес, на экран одной функцией:
а в аппаратной версии, если попытаюсь вместо I2C_SendAddr использовать I2C_SendByte, адрес отправляется, экран нормально реагирует,
но происходит бесконечное зависание на этапе ожидания бита подтверждения отправки байта:
while (0 == (I2C1->SR1 & I2C_SR1_TXE)){}
Как отправить массив (uint8_t) по I2C через DMA на STM32F105RBT6 или STM32F030F4 используя CMSIS?
Желательно сначала разобраться как это сделать на STM32F105RBT6 а потом перенести код на STM32F030F4.
Сейчас я отправляю на STM32F105RBT6 без DMA буффер OLED экрана (SSD1306 128x32) таким образом:
как сюда прикрутить DMA?
Можно как то обойтись без функции I2C_SendAddr используя только I2C_SendByte (добавив адрес в начало массива) что бы не ждать пока отправиться байт адреса?
Я понял откуда я взял неправильную интерпритацию столбцов Alternate functions и Additional functions,
я их подсознательно перепутал со столбцами Default и Remap из датащитов из F1xx серии, а вчера начал
делать более информативный компонент STM32F030F4 для DipTrace и случился затык.
То есть ситуация что в alternate functions могут встречаться более одного варианта разводки периферии по ногам микросхемы - нормальна?
Тогда я что то запутался - в чём смысл отдельных столбцов в таблице Alternate functions и Additional functions ?
Уже ответили: http://forum.easyelectronics.ru/viewtopic.php?f=35&t=38418&p=591070#p591070
В колонке Alternate functions должно быть написано где появляется переферия по умолчанию,
а в колонке Additional functions варианты куда её можно переназначить и там действительно
может быть много вариантов.
Вот что мне надо было:
можете предложить как сэкономить байт другой флеша или оперативки, а также предложить научно обоснованную
поправку вместо "30" , она явно великовата, но ЛА через ногодрыг PB1 трудно понять погрешности
самого ногодрыга.
На DWT всё это было технически совершенней особенно нравилась что первой строкой:
DWT->CYCCNT = 0; //Обнуляем счетчик
начинался отсчёт и поправка требовалась меньше.
Forger
Спасибо ваш код пригодиться для когда понадобиться неблокирующая задержка, мне же пока требуется простейшая блокирующая.
Ещё вопрос в STM32F030F4 таймер SysTick 24 битный?
Чем заменить DWT на STM32F030F4 для задержек delay_us и delay_ms ?
На STM32F105RBT6 замечательно работало так:
Можно ли использовать SysTick без прерываний, если можно, то как это сделать на CMSIS (под Keil 5.26) ?
Если нельзя, то как это сделать на CMSIS на самом, по вашему мнению, ненужном таймере STM32F030F4?
Я точно сам не знаю что я тут включаю, скопипастил откуда то.
На другом форуме ответили (http://forum.easyelectronics.ru/viewtopic.php?f=35&t=38368&p=590328#p590328)
, такой код заработал:
FLASH->ACR = FLASH_ACR_LATENCY;
// настраиваем систему тактирования
RCC->CR |= RCC_CR_HSEON; //включаем генератор HSE
while(!(RCC->CR & RCC_CR_HSERDY)); //ожидание готовности HSE
RCC->CFGR2 = RCC_CFGR2_PREDIV_DIV1; // предделитель для PLL
RCC->CFGR = RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMUL6; // настройка PLL
RCC->CR |= RCC_CR_PLLON; //включаем PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); //ожидание готовности PLL
RCC->CFGR |= RCC_CFGR_SW_PLL; // настраиваем делители шин и переводим тактирование от PLL
Как настроить тактирование STM32F030F4 через CMSIS на максимальные частоты от кварца 8мгц, как на скрине от CubeMX ?
Вот так работает не на 48мгц а на 8мгц (засекал по частоте срабатывания таймера TIM3 т.к. частоту 48мгц мерить нечем,
TIM3 срабатывает через 3сек а не через 0,5сек):
Что не так?
Начал делать проект под STM32F030F4 и обнаружил что не могу подключить к проекту Standard Peripherals Drivers стандартными средствами,
так ка я это делал для серии F1 (см. скрин из проекта от F1), там такой строки просто нет!
Как добавить "Standard Peripherals Drivers" для F0 в Keil 5.26?
Были ли вообще когда либо сразу в Keil библиотеки "Standard Peripherals Drivers" для серии F0 ?
Спасибо k155la3, проблема оказывается в наличии русских символов в пути к проекту.
Можно как-то научить Keil толерантности к русским символом в пути к проекту?
Спасибо Arlleex, выбор стандартного компилятора 5 версии решает проблему, но можно ли как то заставить нормально работать 6 версию?
(возврат на 6 версию проблему возвращает)