VCP -> SOFT_UART_X3 модификация STM32VLDISCOVERY

Расскажу как с минимальными аппаратными манипуляциями переделать ST-LINK установленный на плате STM32VLDISCOVERY в виртуальный ком порт. Для чего это нужно, думаю понятно — через него можно будет обмениваться данными с компом и шить основной контроллер без каких-либо дополнительных плат, что очень удобно. А так же подключать другие устройства. Разумеется о ST-LINK'е после этого вам прийдется забыть.



Шаг 1. Удаляем перемычки SB5, SB9, SB16. Устанавливаем перемычки SB6, SB10. После этого у нас на разъеме CN2 на пинах 2, 4 будут ноги контроллера 26, 27. На разъеме CN3 на пинах 2, 4 будут пины SWCLK, SWDIO нашего подопытного контроллера (STM32F103C8T6). SB16 нужно удалить, т.к. иначе мы не сможем переводить контроллер(STM32F100RBT6B) в режим загрузки.


Шаг 2. Шьем прошивкой которая лежит в архиве, не забыв подключить землю и питание: подключаем другой ST-LINK (я использовал STM32F4DISCOVERY) к разъему CN3 и заливем прошивку при помоши ST-Link Utility.
Можно залить прошивку через переходник при помощи Flash loader demonstrator, подпаявшись к пинам USART1, не забудьте установить на BOOT0 высокий уровень.

Шаг 3. Устанавливаем дрова от ST отсюда, втыкаем дискавери в USB и в системе должен появиться новый ком порт. Кидаем второй пин CN2 на PA10, четвертый пин CN2 на PA9, выход платки Boot оставляем висеть в воздухе, нажимаем кнопочку ресет, запускаем Flash loader demonstrator, указываем наш виртуальный порт и шьем контроллер(STM32F100RBT6B). Потом коротим Boot на землю и нажимаем ресет, программа должна запуститься.

Вот собственно и все, теперь можно шить и обмениваться данными. Софтовая часть ничего особенного из себя не представляет, VCP взят отсюда STM32 — организация виртуального COM-порта и моя реализация софт юарта SOFT_UART_X3. Скорость передачи — 9600 формат 8E1.
  • +1
  • 06 июля 2012, 19:48
  • batson
  • 1
Файлы в топике: vcp.zip

Комментарии (24)

RSS свернуть / развернуть
Все это интересно с познавательной точки зрения, но вот практической пользы ноль. Проще задействовать китайский шнурок от сотика, и не сношать себе мозг замороченными телодвижениями. Вот бы кто расшифровал этот ST-Link, чтобы можно было самодельный заебашить.
+3
А зачем самопал? ST-Link очень дешев.
0
Чтобы собрать свой программатор-отладчик для STM8. Не только ж на фирменные полагаться.
0
А зачем свой программатор собирать? Чем фирменный плох?
Или появятся какие-то дополнительные возможности?
0
может хотят запилить свою версию дискавери и назвать ее STMдуино.
0
ага, догнать и перегнать…
0
Фирменный еще купить надо. Он не так уж и дешев. Если не сравнивать с атмеловскими, ессно. В дискавери дешев, но хотелось бы более законченный и со всеми интерфейсами.
0
>>Фирменный еще купить надо. Он не так уж и дешев.
10 Евро — куда ж дешевле? И никакой возни с пайкой-сборкой

>>но хотелось бы более законченный
Чего-то в discovery не хвататет?
0
Гм, по моей информации ST-Link (не дискавери, а полный ST-Link) — порядка килорубля. Это 25 евро или 35 баксов.
Чего-то в discovery не хвататет?
Коробочки, буферов и всех интерфейсов (JTAG, SWD, SWIM). И еще на нем лишняя макетка болтается. Надо STM8S/8SVL дискавери купить, от них линк отламывается.

Ну и еще одно соображение — ST-LINK можно спалить или еще как-то испортить. Если есть прошивка — то нужно только поменять МК (или перепрошить, если баг чисто софтовый). Если нет — только покупать новый.
0
>>Гм, по моей информации ST-Link (не дискавери, а полный ST-Link) — порядка килорубля. Это 25 евро или 35 баксов.
Да — 22 Евро. Я думал что discovery это есть SL-Link, оказалось что не так.
0
Где вы батенька их берете по 35 у.е? Я свой St-Link V2 за 22$ купил. Самопал наверняка будет стоить больше.
0
Я его вообще не брал. Только наслышан.
По ценам Промэлектроники — ~1100 V1 и ~1150 V2. Как раз в районе 35 баксов.
0
Я делал из практической пользы, все равно ST-Link на этой плате у меня без пользы болтался. До этого переходником на ft232 пользовался,- не так удобно. Тут сразу питание для платы и обмен данными через один кабель.
0
так давно уже расшифровали
0
Есть такой проект — Versaloon. Там и прошивалка, и виртуальный ком порт. Ничего забывать не надо.
0
Ага, знаю о таком, только он своими портами увы с дискавери аппаратно не стыкуется. Были бы выведены ножки аппаратных портов, я бы не заморачивался.
0
Versaloon можно скомпилировать под discovery. После этого он и прошивает и отлаживаться можно. Работает и под виндовс, и под Linux.
0
  • avatar
  • ysv
  • 30 декабря 2012, 14:43
Не отрицаю, наверно можно, только у меня отладчик не востребован, а в таком варианте включения мне работать очень удобно.
0
// SOFT UART ONLY RX — STM32F103C8T6 — CooCox (1.05.2015, zz555)
// 10 bit protocol: 1-start bit, 8-bit data, 1-stop bit (bps = timer_irq/3)
//
// Recive bytes:
// 1 — waiting flag_rx_rdy = 1
// 2 — read rx_buf[]
// 3 — flag_rx_rdy = 0, rx_byte_no = 0
//
// PA1 (IN) RX
// PC13 (OUT) LED

#include «stm32f10x.h»

#define PC13_1 GPIOC->BSRR |= GPIO_ODR_ODR13 // PC13 OUT ON/OFF
#define PC13_0 GPIOC->BRR |= GPIO_ODR_ODR13
#define PC13_N GPIOC->ODR^=GPIO_ODR_ODR13 // PC13 OUT Инвертируем
#define RX_BUF_SIZE 256

uint8_t rx_buf[RX_BUF_SIZE];
uint8_t rx_byte;
uint8_t rx_byte_no;
uint8_t state_rx;
uint8_t rx_counter;
uint8_t rx_counter_equ;
uint8_t rx_mask;
uint8_t bit_no_rx;
uint8_t flag_rx_rdy;
uint8_t err;
uint8_t i;
uint8_t k;
uint32_t TimingDelay;

void TIM2_IRQHandler(void) {
// RX
if (rx_byte_no>0) {
k++;
if (k>30) {k=0; flag_rx_rdy=1;}
}
if (flag_rx_rdy==0) {
if (state_rx>1) {k=0; rx_counter++;} else rx_counter=1;
if (rx_counter==rx_counter_equ) {
rx_counter=0;
switch (state_rx) {
case 1: // start bit
{
if ((GPIOA->IDR & GPIO_IDR_IDR1)==GPIO_IDR_IDR1) {} else { // PA1 — RX
rx_byte=0; bit_no_rx=1; state_rx=2; rx_counter_equ=4;
}
break;
}

case 2: // data bits
{
if ((GPIOA->IDR & GPIO_IDR_IDR1)==GPIO_IDR_IDR1) rx_mask=1; else rx_mask=0; // PA1 — RX
rx_byte >>= 1;
rx_mask <<= 7;
rx_byte |= rx_mask;
bit_no_rx++;
if (bit_no_rx==9) state_rx=3;
rx_counter_equ=3;
break;
}

case 3: // stop bit
{
if ((GPIOA->IDR & GPIO_IDR_IDR1)==GPIO_IDR_IDR1) { // PA1 — RX
rx_buf[rx_byte_no]=rx_byte;
rx_byte_no++;
if (rx_byte_no==RX_BUF_SIZE-1) rx_byte_no=0;
} else err=1;
state_rx=1;
rx_counter_equ=1;
break;
}
}
}
}
TIM2->SR &= ~TIM_SR_UIF;
}

// Функция временной задержки в милисекундах
void Delay_ms(uint32_t nTime) {
TimingDelay = nTime*2400;
while (TimingDelay != 0) TimingDelay--;
}

void flash (void) {
err=0;
for(i=0; i<10; i++) {
PC13_0;
Delay_ms(10);
PC13_1;
Delay_ms(10);
}
}

//=======================================================================================================================
void Init_STM() {
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN);
GPIOA->CRL &= ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1);
GPIOA->CRL |= GPIO_CRL_CNF1_1; // PA1 (IN) RX
GPIOA->BSRR = GPIO_BSRR_BS1;
GPIOC->CRH |= GPIO_CRH_MODE13; // PC13 (OUT) LED

// Инициализация таймера TIM2
RCC->CFGR |= RCC_CFGR_HPRE_DIV2; // sys_clk/2 (36/2=18 MHz)
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Разрешаем тактирование TIM2
TIM2->DIER |= TIM_DIER_UIE; // Update interrupt enable
TIM2->PSC = 625-1; // Предделитель частоты перед таймером (при 0 максимальная частота) (18000/625=28.8 KHz)
TIM2->ARR = 1; // До скольки считает таймер (28.8/3=9600 Hz)
TIM2->CR1 |= (TIM_CR1_CEN | TIM_CR1_ARPE); // Запускаем таймер
NVIC_EnableIRQ (TIM2_IRQn); // Разрешаем прерывания TIM2
}

//=======================================================================================================================
int main (void) {
Init_STM();

PC13_0;
Delay_ms(10); // Пауза 0,01 с
PC13_1;

// Init_UART
state_rx=1;
rx_counter_equ=1;
rx_byte_no=0;
flag_rx_rdy=0;

while (1) {
if (flag_rx_rdy==1) {
if (err==1) flash();
for(i=0; i<rx_byte_no; i++) {
if (rx_buf[i]==65) PC13_0;
}
Delay_ms(10);
PC13_1;
rx_byte_no=0;
flag_rx_rdy=0;
}
}
}
0
Тест «BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAB» — LED ON
0
Для STM32F030F4P6 незаменимая штука! Там всего 1 UART.
0
Во первых, не надо два раза постить одно и то же. Во вторых, код надо постить в теге code, иначе получается каша (и не только из-за пропадания индентации, но и из-за срабатывания автозамены).
0
Спасибо, буду знать про тег code, жаль, здесь правки нет. В первой статье нет ссылки на эту статью.
0
здесь правки нет.
Зато есть превью. Которым почему-то никто не пользуется.
В первой статье нет ссылки на эту статью.
Это не повод плодить дубли. Хочешь, чтобы тебя заметили и/или нашли поиском — пиши топик, а не комментарий.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.