uart_terminalУже с давних пор, помимо рассмотрения периферии, есть огромное желание делать побольше устройств, но то что кажется интересным — требует много времени, для себя или для дома вроде ничего не нужно, а делать устройства без цели как то лениво :) В творческих муках «быть или не быть», все таки решил что «быть!», поэтому буду постепенно прокачивать навыки.

Хорошим посылом стало освоение STM, первая платка была тестовая, на ней вылезло много тонкостей. Все таки по сравнению с AVR, чтобы начать работать с стм, неплохо бы обладать хоть каким то опытом работы с микроконтроллерами. Хотя есть мнение, что стартовать с стм ничуть не сложнее чем с авр.

В общем, я решил закрепить свое знакомство с железом STM, каким нибудь устройством, не важно каким. Долго думал что же такого сделать полезного, пересмотрел много разных сайтов, в итоге мне понравилась идея переносного тестового UART терминала. Эту идею можно встретить на разных сайтах, в различных вариациях. В кратце это независимое устройство, с дисплеем и UART входом, к нему можно подключиться и посмотреть приходящие байты. Конечно когда идет поток данных то устройство бесполезно, но если это отладочные данные, то польза очевидна, т.е. использовать вместо компьютера с терминалкой.

Причем тут большой простор для фантазии, например можно его использовать просто как удаленный дисплей для вывода информации, или например когда я тестировал радиомодули на открытом воздухе, то бегать с ноутбуком явно не будешь, пришлось прицепить отладочный светодиод, но он малоинформативен, а вот переносной дисплей с UART входом был бы очень кстати. В конце концов у меня на ноуте USB порты почти всегда забиты, и прицеплять каждый раз Ft232 напрягает, а так всего один проводок кинуть и все ок.

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

В качестве дисплея используется дисплей от Nokia 1202. Про этот дисплей еще полгода назад в группе вк упоминал Steep zero(Сергей), а Михаил подсказал магазинчик в котором их можно приобрести, за это им Спасибо. Можно придраться что дисплей так себе, разрешение 96*68, символов мало и текст мелкий, НО по сути за те деньги что он продается альтернативы в общем то ему и нет. Надо сказать, мне он намного больше понравился чем тот же wg12864.

Пример работы с дисплейчиком прислал тот же steep zero :) пример для кокоса под stm32f4discovery В своей программе я все лишь вынес функции работы с дисплеем в отдельную библиотеку и переделал настройки под свой микроконтроллер stm32f103c8t6. У него 2 юарта, на железке я вывел оба, пригодится ли второй или нет, время покажет, дописать кусок кода проще чем паять новую плату.

Схема в принципе простая, наружу выведено четыре штырька с UART1 и UART2, четыре для программатора, разъемчик для дисплея и две кнопки. Питание схемы 3.3В.
nokia1202

Плата получилась не без косяков, один проводок отвалился, пришлось напаивать соплю, но все же потихоньку скилл по освоению фоторезиста растет.
plate

Дисплей к плате прилепил термосоплями, не эстетично, но зато практично :)
uart_terminal

Надо отметить, что когда я рисовал схему, то особо даташит не читал. В итоге вышло так, что дисплей оказался на одной из ножек JTAG, который по умолчанию включен. В результате я отключил JTAG вместе с SWD :) Оказалось что включить обратно его можно, но для этого камень должен находиться в состоянии RESET, а для этого нужно, на ножку NRST подать низкий уровень, но вот незадача, NRST был не выведен :) Можно было бы воспользоваться Bootloaderом, но у меня по схеме он намертво заземлен :) Пришлось через лупу иголкой тыкать в ножку NRST. Поэтому, как минимум: обязательно выводить контактную площадку под NRST, а ножку Boot0 подключать через перемычку, которую можно отпаять, а еще лучше выводить их на штырьки.

Прошивка получилась тоже очень простой, приходящий байт в прерывании заносится в буфер, увеличивается счетчик байт. В основном цикле, если счетчик прочитанных байт, не равен счетчику полученных данных, то выводим символы из буфера на дисплей. Имеется первоначальная настройка скорости. Кнопкой можно переключить внешний вид принимаемых данных — либо hex, либо ascii. Примечательно то, что либа дисплея поддерживает русский алфавит.

#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
#include <delay.h>
#include <nokia_lcd.h>
#include  <misc.h>
 
uint8_t FIFO_BUFF[128];
char temp_buff[16];
uint8_t hex = 0;
uint8_t getcount = 0, setcount = 0, setup = 0, posY=0, ps = 0;
uint32_t baudRate = 9600;
 
void USART1_IRQHandler(void)
{
  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  {
	  FIFO_BUFF[getcount++]=USART1->DR;
	  if(getcount == 127)getcount=0;
  }
}
 
int main(void)
{
	RCC_ClocksTypeDef RCC_Clocks;
	RCC->CR|=((uint32_t)RCC_CR_HSEON);
	while (!(RCC->CR & RCC_CR_HSERDY)) {};
	RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0, SW1.
	RCC->CFGR |= RCC_CFGR_SW_HSE; // Выбрать HSE для тактирования SW0=1.
	RCC_GetClocksFreq(&RCC_Clocks);
 
	lcd_pin_init();
	lcd_init();
	lcd_gotoxy(0,0);
	lcd_puts("uart terminal");
	_delay_ms(1500);
	lcd_clear();
 
	GPIO_InitTypeDef buttons_setup;
	buttons_setup.GPIO_Speed = GPIO_Speed_2MHz;
	buttons_setup.GPIO_Mode = GPIO_Mode_IPU;
	buttons_setup.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Init(GPIOB,&buttons_setup);
 
	lcd_gotoxy(1,0);
	lcd_puts("speed 9600");
 
	lcd_gotoxy(1,1);
	lcd_puts("speed 19200");
 
	lcd_gotoxy(1,2);
	lcd_puts("speed 57600");
 
	lcd_gotoxy(1,3);
	lcd_puts("speed 115200");
 
	lcd_gotoxy(0,0);
	lcd_puts(">");
 
	while(setup != 5)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)== 0)
		{
			switch (posY) {
				case 0:
					baudRate = 9600;
					break;
				case 1:
					baudRate = 19200;
					break;
				case 2:
					baudRate = 57600;
					break;
				case 3:
					baudRate = 115200;
					break;
				default:
					baudRate = 9600;
					break;
			}
			setup = 5;
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 0 && (ps == 0) )
		{
			lcd_gotoxy(0,posY);
			lcd_puts(" ");
			posY++;
			if (posY > 3)posY = 0;
			lcd_gotoxy(0,posY);
			lcd_puts(">");
			ps = 1;
 
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 1)ps = 0;
	}
	lcd_clear();
	lcd_puts(">");
	lcd_gotoxy(1,0);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef rx1_setup;
	rx1_setup.GPIO_Mode = GPIO_Mode_IPU;
	rx1_setup.GPIO_Pin = GPIO_Pin_10;
	rx1_setup.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &rx1_setup);
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	USART_InitTypeDef uart1_setup;
	uart1_setup.USART_BaudRate = baudRate;
	uart1_setup.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	uart1_setup.USART_Mode = USART_Mode_Rx;
	uart1_setup.USART_Parity = USART_Parity_No;
	uart1_setup.USART_StopBits = USART_StopBits_1;
	uart1_setup.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &uart1_setup);
 
	USART_Cmd(USART1, ENABLE);
 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitTypeDef NVIC_InitStructure;
 
	/* Enable the USARTx Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
 
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 
	while(1)
    {
		if(getcount != setcount)
		{
			if(hex == 1)
			{
			sprintf(temp_buff, "%x ",FIFO_BUFF[setcount++]);
			lcd_puts(temp_buff);
			}
			else lcd_putch(FIFO_BUFF[setcount++]);
			if(setcount == 127) setcount = 0;
			if(lcd_X >= 13  && lcd_Y == 7) lcd_clear();
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 0)
		{
			if(hex == 0)hex = 1;
			else hex = 0;
			ps = 1;
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 1)ps = 0;
 
    }
}

Посмотреть как работает это безобразие

Устройство очень простое и в общем то сложностей никаких нет, можно было бы его сделать на AVR, но суть была в том, чтобы освоиться с stm32f103, теперь уже есть минимальное представление как собирать более сложные схемы. Рекомендую собрать нечто подобное.

Для желающих прошивка test_nokia

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Свежие записи
Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика