• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
le2x

Как переслать 64 бита в аппаратный регистр

16 сообщений в этой теме

le2x    0

Добрый день коллеги!

Имеется микроконтроллер STM32F103C8, к нему подключен внешняя микросхема - регистр разрядностью 64 бита. Управление происходит по трем линиям:

LATCH_DIO  - разрешение записи в регистр (LOW)

CLK_DIO  - синхронизация

DATA_DIO  - данные (последовательно, побитно)

Очень напоминает работу SPI поэтому и решил для начала попробовать приспособить его. Но ничего не вышло так-как по SPI в одном пакете может передать максимально 16 бит данных.

Полагаю что необходимо использовать GPIO для этого. Но вот беда не могу понять как из переменной извлечь биты данных и установить их на DATA_DIO последовательно? Или может быть есть еще какие-то решения? Разработку веду в CoIDE v.1.7

Изменено пользователем le2x
ошибка

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
ALEN&Co    5
1 час назад, le2x сказал:

Но ничего не вышло так-как по SPI в одном пакете может передать максимально 16 бит данных

SPI может передать сколько угодно, но нужно вовремя подавать ему эту информацию.

Для этого служит DMA.

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    277
4 часа назад, le2x сказал:

может передать максимально 16 бит данных

Вот и передайте 4 раза по 16 бит. А потом активируйте сигнал LATCH_DIO, по которому все переданные биты одним махом запишутся в регистр.

Для этого линией LATCH_DIO надо управлять вручную, а не соединять с сигналом SS от SPI. То есть на какой-то свободный GPIO выход вешаете этот самый LATCH_DIO и дергаете им, когда все 64 бита передано.

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


Ссылка на сообщение
Поделиться на других сайтах
le2x    0
45 минут назад, Yurkin2015 сказал:

Вот и передайте 4 раза по 16 бит. А потом активируйте сигнал LATCH_DIO, по которому все переданные биты одним махом запишутся в регистр.

Для этого линией LATCH_DIO надо управлять вручную, а не соединять с сигналом SS от SPI. То есть на какой-то свободный GPIO выход вешаете этот самый LATCH_DIO и дергаете им, когда все 64 бита передано.

Типа вот так что ли?

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

void delay (uint32_t time_delay) //функция задержки
{
    uint32_t i;
    for (i=0;i<time_delay;i++);
}

int main(void)
{
    // настраиваем выводы 4-7 порта A  на альтернативный режим работы
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);
    GPIO_SetBits(GPIOA, GPIO_Pin_8); //устанывливаем на линнии запрет приема данных

    //выводы под SPI
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);

    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    SPI_I2S_SendData(SPI1, 0x80F1);
    SPI_I2S_SendData(SPI1, 0x80F2);
    SPI_I2S_SendData(SPI1, 0x80F4);
    SPI_I2S_SendData(SPI1, 0x80F8);
    GPIO_SetBits(GPIOA, GPIO_Pin_8);

    while(1)
    {

    }
}

 

Так не работает. Причем могу за комментировать строки GPIO_ResetBits(GPIOA, GPIO_Pin_8); GPIO_SetBits(GPIOA, GPIO_Pin_8); результат не меняется

Кстати пытаюсь к STM32 подключить Arduino Multifunction Shield http://arduinolearning.com/code/multi-function-shield-examples.php

И у них оно примерно так и работает:
 

digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);

Проверял код из примера в ссылке на Arduino mega 2560,  этот шилд отлично все отображает

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

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    10
31 minutes ago, le2x said:

SPI_I2S_SendData(SPI1, 0x80F1);

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

После последней передачи надо дождаться окончания передачи и затем устанавливать

34 minutes ago, le2x said:

GPIO_SetBits(GPIOA, GPIO_Pin_8);

Для начала можно просто поставить везде задержки без проверки флагов

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    277
34 минуты назад, le2x сказал:

Так не работает.

Возьмите нормальный пример SPI из интернета для Coocox. В Вашей программе не хватает проверки: перед отправкой очередного слова нужно проверять закончилась ли предыдущая процедура передачи.

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0x80F2);
и т.д.

Какая конкретно внешняя микросхема?

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


Ссылка на сообщение
Поделиться на других сайтах
le2x    0
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    SPI_I2S_SendData(SPI1, 0x80F1);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F2);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F4);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F8);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    GPIO_SetBits(GPIOA, GPIO_Pin_8);

Попробовал и с задержкой и с проверкой флагов, бесполезно, он зажигает последний индикатор и все тут. Получается последней отрабатывает вот эта строка

SPI_I2S_SendData(SPI1, 0x80F8);

пробовал ее закоментить тогда зажигается третий индикатор, последней отрабатывает строка

SPI_I2S_SendData(SPI1, 0x80F4);

Хочу зажечь все четыре индикатора.

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

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


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

О, уже какие-то индикаторы появились. Что у Вас там за внешняя схема? Какие индикаторы и как они соединены?

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


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

Принципиальная электрическая схема и изображение платы во вложении.

Пины микроконтроллера:

LATCH_DIO - GPIO_Pin_8

CLK_DIO - GPIO_Pin_5

DATA_DIO - GPIO_Pin_7

apc220-bluetooth-voice-recognition-module.jpg

1457533970_untitled.png

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


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

Через spi должно б работать. Если нет, посомотрите примеры с 595 сдвиговым регистром, там всё просто, например так:

uint64_t inputData;    
for (i = 0; i < 64; i++)
	{
	if (inputData & 0x80000000)
	    {
	    HAL_GPIO_WritePin(DATA_DIO_PORT, DATA_DIO_PIN,
		    GPIO_PIN_SET);
	    }
	else
	    {
	    HAL_GPIO_WritePin(DATA_DIO_PORT, DATA_DIO_PIN,
		    GPIO_PIN_RESET);
	    }
	HAL_GPIO_WritePin(MCU_595_SH_GPIO_Port, MCU_595_SH_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(MCU_595_SH_GPIO_Port, MCU_595_SH_Pin, GPIO_PIN_RESET);
	inputData <<= 1;
	}

Можно между подъемом и спуском строба задержку небольшую сделать, что бы фронт успел нарастать. Но вообще должно бы и с spi работать. СPOL и СPHA правильно настроены?

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


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

Не понятно откуда 8 байт, если два 8-ми битных регистра.

Поставьте вмесо F8, FF и должены включитьсявсе индикаторы.

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


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

Я кажется понял свою ошибку, посмотрел внимательнее на схему и понял что не нужно никаких 64 бита передавать в регистр а всего 16. Первые байт отвечают за номер индикатора а второй значение на сегментах. Так что должно все получиться с SPI.

Цитата

Поставьте вмесо F8, FF и должены включитьсявсе индикаторы.

Да действительно так и есть, загорелись все 4 индикатора, правда не цифрами а кракозябрами, осталось подобрать правильные коды символов

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


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

В общем заработало в таком варианте

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

void delay (uint32_t time_delay) //функция задержки
{
    uint32_t i;
    for (i=0;i<time_delay;i++);
}

int main(void)
{
    // настраиваем выводы 4-7 порта A  на альтернативный режим работы
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);

    //выводы под SPI
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_2Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 15;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);

    while(1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xC0F1);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xF9F2);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xA4F4);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xB0F8);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

    }
}

Сначала нужно установить 1 на LATCH_DIO, затем передать два байта по SPI, затем установить 0 на LATCH_DIO. Вот это как раз и странно, должно быть все наоборот. Получается LATCH_DIO нельзя подключить к SPI_NSS выходу, либо подключать через инвертор (элемент НЕ, транзистор по схеме с ОЭ). Но в примере для Arduino  все логично. Что тогда не так?

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


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

Во-первых, у Вас настройка SPI неправильная. Данные в 595 регистр задвигаются по положительному перепаду 0->1, поэтому, если полярность клоков выбрана Low, то фронт клоков нужно выбрать первый, т.е. по первому фронту после Low состояния клоков.

spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации

Во-вторых, флаг SPI_I2S_FLAG_TXE означает, что регистр передачи SPI опустел. То есть данные из регистра TX перешли в сдвиговый регистр SPI и начали выталкиваться наружу. Другими словами установка флага SPI_I2S_FLAG_TXE в 1 не означает окончание передачи по SPI.

Для проверки окончания есть другой флаг SPI_I2S_FLAG_BSY, который = 1 в процессе передачи и = 0, когда передача закончилась.

 

1 час назад, le2x сказал:

Сначала нужно установить 1 на LATCH_DIO,

Сигнал LATCH_DIO записывает данные на выходные линии тоже по положительному перепаду 0->1. То есть после задвигания всех 16 битов нужно каким-то образом организовать такой перепад на линии LATCH_DIO.

Например, так

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
SPI_I2S_SendData(SPI1, 0xC0F1);// пишем в TX данные, начало передачи
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
GPIO_SetBits(GPIOA, GPIO_Pin_8);

 

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


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

Уважаемый @Yurkin2015 вы абсолютно правы. Надо было мне сразу заглянуть в даташит на 74HC595

и тогда бы я увидел эту диаграмму.

Безымянный.png

Поправил фронт и полярность в настройках GPIO. Ваш код действительно работает. Также он работает и в таком варианте когда сначала на линию LATCH_DIO  устанавливаем 0, передаем данные по SPI c проверкой флагов и устанавливаем на LATCH_DIO = 1, так что теперь все логично и понятно. Спасибо. Осталось поиграть с SPI_NSS дабы не задействовать отдельную ногу под LATCH_DIO

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

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


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

В общем понял что nss для работы в режиме slave и multimaster и что этот вариант мне не подходит управление осуществляю при помощи GPIO. Всем спасибо за помощь. Ниже рабочий код.

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);

    //выводы под SPI CLK_DIO - GPIO_Pin_5, DATA_DIO - GPIO_Pin_7
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 15;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);


    while(1)
    {

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xC0F1);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xF9F2);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xA4F4);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xB0F8);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    }
}

 

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: ToRcH2565
      Добрый день, недавно начал изучать азы STM, и наткнулся на интересную возможность, а именно отправлять текст через отладочный порт:
      https://hubstub.ru/stm32/111-otladka-po-swd-stm32.html  (дабы долго не обьяснять о чем я веду речь, ибо без знания терминов это может затянутся).
      Так вот, столкнулся я с проблемкой, а именно где же можно данные сообщения посмотреть в EmBlocks, отладочные окна пролез все, там не нахожу, возможно нужно ковырять глубже настройки среды? или данная среда не умеет отображать эти сообщения?
      Очень не хотелось бы городить UART для отображение отладочных сообщений...
    • Автор: Motrosoff8888
      Всем привет! Ребят есть вот это STM32F030K6T6 
      вот это, адаптер для прошивки  
      и это, собственно чем прошить. 
      Имеется прошивка, скетч, для двух Atmega328p. Есть пьезоэлементы, которые подсоединены к аналоговому пину, при касании, одна другой передаёт символы через NRF24l01, друга принимает таким же модулем и отправляет данные по блютус HC-05 на телефон.  Хотелось бы перенести её на STM32, не бесплатно конечно но и в рамках разумного. Цель переноса на STM32 - увеличить скорость отклика (задержка между ударом по пьезику и появлением символа в мониторе порта телефона) пьезо! И есть уже адаптер для прошивки МК с 32 ножками. Буду признателен если кто то ответит, можно в ЛС
    • Автор: Motrosoff8888
      Всем привет! Ребят есть вот это STM32F030K6T6 
      вот это, адаптер для прошивки 
      и это, собственно чем прошить. 
      Имеется прошивка для двух Atmega328p. Есть пьезоэлементы, которые подсоединены к аналоговому пину, при касании, одна другой передаёт символы через NRF24l01, друга принимает таким же модулем и отправляет данные по блютус HC-05 на телефон.  Хотелось бы перенести её на STM32, не бесплатно конечно но и в рамках разумного. Цель переноса на STM32 - увеличить скорость отклика (задержка между ударом по пьезику и появлением символа в мониторе порта телефона) пьезо! И есть уже адаптер для прошивки МК с 32 ножками. Буду признателен если кто то ответит, можно в ЛС
    • Автор: saer2
      Добрый!
      Осваиваю стм32.
      Уточните пожалуйста, есть ли описание библиотеки stblib ? 
      как с ней работать?
    • Автор: karomag
      Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...
      // Общие выводы индикатора #define D0 GPIO_Pin_14 #define D1 GPIO_Pin_13 #define D2 GPIO_Pin_12 #define ALL_CATOD ( D0 | D1 | D2 ) // К какой ноге какой сегмент подключен #define SEG_A GPIO_Pin_0 #define SEG_B GPIO_Pin_1 #define SEG_C GPIO_Pin_2 #define SEG_D GPIO_Pin_3 #define SEG_E GPIO_Pin_4 #define SEG_F GPIO_Pin_5 #define SEG_G GPIO_Pin_6 //Собираем цифры из сегментов #define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F ) #define DIG1 ( SEG_B | SEG_C ) #define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D ) #define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D ) #define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C) #define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D ) #define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G ) #define DIG7 ( SEG_A | SEG_B | SEG_C ) #define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) #define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G) #define ALL_SEG (DIG8 ) void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD; GPIO_Init(GPIOA, &GPIO_InitStructure); } void show_temp(void) { u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры) u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter u16 catods[] = { D0, D1, D2 }; u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 }; u8 i; tmp = measureT; for (i = 0; i < 3; i++) { if (tmp > 0) { //Вытаскиваем первую справа цифру из числа counter digit = tmp % 10; tmp = tmp / 10; //Выключаем все разряды. 1 на катоды GPIOA->ODR |= ALL_CATOD; //Включаем i разряд индикатора GPIOA->ODR &= ~catods[i]; //Выводим цифру в i разряд GPIOA->ODR &= ~DIG8; //Выключаем все сегменты GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные //Небольшая задержка. Пусть цифра погорит некоторое время delay_ms(1000); } } } Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?