Jump to content
Braimik

Uart В Proteus Не Работает

Recommended Posts

Всем добрый день, с толкнулся с такой проблемой , что при написании кода для UART в протеусе симуляция не работает, то есть терминал вылазит, символы печатаю в терминале все отображается, но Микроконтроллер не реагирует на них, пробовал разные коды , с разных сайтов , если открыть готовый проект в протеусе то все работает , создаю свой проект либо исправляю готовый , на нужный мне МК , он перестает , работать , вот один из примеров кода

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : RS485 Test
Version :
Date    : 15.10.2014
Author  : Brain
Company :
Comments:

Chip type			   : ATmega8515
Program type		    : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model		    : Small
External RAM size	   : 0
Data Stack size		 : 128
*****************************************************/
#include <mega8515.h>
// Standard Input/Output functions
#include <stdio.h>
 char read;

// Declare your global variables here
void main(void)
{
DDRA=0xFF;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
EMCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// SPI initialization
// SPI disabled
SPCR=0x00;
while (1)
  {
  // Place your code here
	   read=getchar(); //
	   if( read == 'A') PORTA.0 = 1;
	   if( read == 'B') PORTA.0 = 0;
	   if( read == 'C') PORTA.1 = 1;
	   if( read == 'D') PORTA.1 = 0;
	   if( read == 'E'){ PORTA.1 = 0; PORTA.0 = 1; }
  }
}

Share this post


Link to post
Share on other sites

И не будет работать! У Вас неверный подход к решению задачи. Чуть позже скину рабочий пример .


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Проверьте тактовую в протеусе. И 8МГц дают ошибку (не помню какую).


Я не раздаю удочки. Я продаю рыбу.

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

Проверьте тактовую в протеусе. И 8МГц дают ошибку (не помню какую).

Самое , что странное, в рабочем коде исправляю команду , либо пишу все тоже самое под МК другой и все не работает, в основном на 16МГц пишу

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новом программируемом чипе SoC STMicroelectronics. На вебинаре будут детально рассмотрены новые возможности, особенности подключения, аппаратные и программные средства для разработки, а также практические примеры работы с микросхемой.

Подробнее

void clear_buffer_rx()
{
char x_=0;
	 for(x_=0; x_<16; x_++) rx_buffer[x_]=0;
		 rx_counter=0;	
		 rx_wr_index=0;
}
void AT_cmd()
{
error=0;

	 for (x=6; x<9; x++) if(rx_buffer[x]<48 || rx_buffer[x]>57)error=1;

	 if(error==0 && rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='P' && rx_buffer[4]=='R' && rx_buffer[5]=='G')
	 {
	 #asm("cli")
	 eep_data_buff[0] = rx_buffer[6]-48;
	 eep_data_buff[1] = rx_buffer[7]-48;
	 if(eep_data_buff[0]==0)eep_data_buff[0]=1;
	 if(eep_data_buff[1]==0)eep_data_buff[1]=1;

	 eep_data_buff[2] = (rx_buffer[8]-48)*2;
	 if(eep_data_buff[2]==0)eep_data_buff[2]=20;
	 else if (eep_data_buff[2]!=0 && eep_data_buff[2]<5) eep_data_buff[2]=5;

	 for (x=0; x<9; x++) printf("%c" , rx_buffer[x]);
	 timer_eep=0;
	 #asm("sei")
	 printf("\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='='&& rx_buffer[7]=='E')
	 {
	 start_process=1;
	 start=1;
		 printf("START=ON!");
	 printf("\r\n");
	 clear_buffer_rx();
	 menu=0;
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='='&& rx_buffer[7]=='D')
	 {
	 start_process=0;
		 printf("START=OFF!");
	 printf("\r\n");
	 clear_buffer_rx();
	 menu=0;
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='D'&& rx_buffer[4]=='T'&& rx_buffer[5]=='A'&& rx_buffer[6]=='?')
	 {
	 printf("Setting data:");
	 for (x=0; x<4; x++) printf("%d" , eep_data[x]);
	 printf("\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='R'&& rx_buffer[4]=='E'&& rx_buffer[5]=='V'&& rx_buffer[6]=='?')
	 {
	 printf("##########################\r\n");
	 printf("LED Progect 11.01.2015\r\n");
	 printf("7 SEG LED 4DIG\r\n");
	 printf("Autor: Ugrimov Artem Aleksandrovich\r\n");
	 printf("Program V1.0.0\r\n");
	 printf("Automatic system for press control\r\n");
	 printf("##########################\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='?')
	 {
	 if(start_process)
	 {
		 printf("START=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("START=OFF!");
		 printf("\r\n");
	 }

	 if(OUT_LEFT)
	 {
		 printf("OUT_LEFT=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("OUT_LEFT=OFF!");
		 printf("\r\n");
	 }
	 if(OUT_RIGHT)
	 {
		 printf("OUT_RIGHT=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("OUT_RIGHT=OFF!");
		 printf("\r\n");
	 }
	 if(RELAY_MOTOR)
	 {
		 printf("REL_MOTOR=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("REL_MOTOR=OFF!");
		 printf("\r\n");
	 }
	 if(SENS_1==0)
	 {
		 printf("SENS_1=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("SENS_1=OFF!");
		 printf("\r\n");
	 }
	 if(SENS_2==0)
	 {
		 printf("SENS_2=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("SENS_2=OFF!");
		 printf("\r\n");
	 }
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if(rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]==0 && x_)
	 {
	 printf("OK!\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else
	 {
	 for(x=0;x<8;x++)
	 {
		 if(rx_buffer[x]>0)
		 {
			 delay_ms(300);
			 x=9;
			 x_++;
		 }

	 }
	 if(x_==2)
	 {
		 for(x=0;x<8;x++)
		 {
			 if(rx_buffer[x]>0)
			 {
				 printf("ERROR!\r\n");
				 for (x=0; x<9; x++) printf("%c" , rx_buffer[x]);
				 clear_buffer_rx();
				 x=9;
				 x_=0;
			 }
		 }
	 }
	 }
	 #asm("sei")
}

вот вырезки из проекта , который отлично работает.


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Плата STEVAL-IDB011V1 – тестируем идеи на новом BLE 5.2-чипе BlueNRG-LP

Новая система на кристалле BlueNRG-LP производства STMicroelectronics предназначена для устройств интернета вещей(IoT ) и не только, отвечает стандарту BLE 5.2 и поддерживает MESH-сети. Микросхема содержит малопотребляющий MCU Cortex-M0+. Отладка STEVAL-IDB011V1 позволит сэкономить время на разработку новых устройств.

Подробнее

[

вот вырезки из проекта , который отлично работает.

несовсем понял смысл кода, мне надо как на порты пришла буква он либо"1" либо "0"

Share this post


Link to post
Share on other sites

мне надо как на порты пришла буква он либо"1" либо "0"

ну так напиши свои обработчики , делов то?

напиши if(rx_buffer[0]=='A') PORTA|=0x01; ......
......................

и т.д. :)


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Матерьбожья!!! Да с этим кодом ТС голову поломает.

Ещё раз - выберите в даташите нормальную тактовую частоту мк в разделе UART и будет вам счастие. Не забудьте такую же установить в протеусе.


Я не раздаю удочки. Я продаю рыбу.

Share this post


Link to post
Share on other sites

Матерьбожья!!! Да с этим кодом ТС голову поломает.

Что в нем сложного то?

Видно как проверяются данные на валидность , и потом обрабатываются АТ команды в зависимости от типа запроса :)


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Решил немного мозг по напрягать , и написал функцию , которая сравнивает два массива символов (фактически строку) и возвращает значение:

1 - если строки одинаковы.

0 - если разные.

вот так вызывается функция :

if(string_cmp(rx_buffer, "AT+REV?"))
{
printf("REV1.0.0\n\r");
clear_buffer_rx();
}
else
{
printf("error command!");
clear_buffer_rx();
}

Если кому интересно - выложу саму функцию сюда :)


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

А чем вас стандартная функция strcmp не устроила? И да, очень интересно взглянуть на ваш вариант.

Edited by BerZerKku

Share this post


Link to post
Share on other sites

А что там можно увидеть нового ? Скорее всего обычное циклическое посимвольное сравнение. Лучше ничего и не придумаешь.

Share this post


Link to post
Share on other sites

BerZerKku, просто захотелось свою функцию сделать :)

Вот:

char string_cmp(char *str1,char *str2)
{
unsigned char  x=0, error=1;
char *txt1, *txt2;
txt1 = str1+0;
txt2 = str2+0;
while(txt1[x]!=0 || txt2[x]!=0 && (error!=0))
{
if(txt1[x] != txt2[x])
{
error=0;
}
x++;
}
return error;
}


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Пусть и не с первой попытки, но рабочий код появился. Но, если честно, он ужасен )

Это Вы с кем общаетесь? :)


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

1) я не ищу решения , так как у меня нет трудностей и соответственно, зачем меня поздравлять? Или с чем? :)

2) и первый кусок , и второй - рабочие.

3) чем код ужасен?

Вполне обычный и понятный код . Проверяем пришедшие символы , если совпадают - выполняем команду и очищаем буфер .


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Странно, мне показалось что-ли, что сначала вами был выложен код с некой переменной "z" который работал лишь частично?

Что в не так? Отвечаю:

Во-первых, появились некие промежуточные переменные txt1 и txt2. Зачем ?! Проще, да и правильнее, передать в функцию указатель на константные данные.

Во-вторых, переменная с неподходящим именем error, которая сравнивается в каждом цикле, хотя было достаточно использовать break или return ?

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

Да и "понятный код" - это только для вас, автора данного кода. Лично я далеко не сразу понял, что за конструкция у вас в проверке цикла и почему она вообще работает.

Edited by BerZerKku

Share this post


Link to post
Share on other sites

С промежуточными переменными погорячился . error возвращает значение .

Да писал еще немного бухим , так что можно смягчить приговор )))

так лучше? :)

char string_cmp(char *str1,char *str2)
{
unsigned char  x=0, error=1;
str1+=0;
str2+=0;
while(str1[x]!=0 || str2[x]!=0 && (error!=0))
{
if(str1[x] != str2[x])
{
error=0;
}
x++;
}
return error;
}


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Да это и не приговор был. А попытка донести, что не стоит изобретать велосипед. Одно из достоинств языка С/С++ это возможность использовать чужой код. Вы сами написали простейшую функцию, причем она заработала далеко не сразу и было потрачено N-ое количество времени. А результат думаю в разы медленнее библиотечного.

Share this post


Link to post
Share on other sites

Чушь ... Написал я её за 5 минут. И заработала она сразу )))

Работает нормально . Не знаю быстрее или медленнее ) это в данном случае не важно.


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

так лучше? :)

char string_cmp(char *str1,char *str2)
{
unsigned char x=0, error=1;
str1+=0;
str2+=0;
while(str1[x]!=0 || str2[x]!=0 && (error!=0))
{
if(str1[x] != str2[x])
{
error=0;
}
x++;
}
return error;
}

У тебя проход по символам будет всегда полным, невзирая даже на неравенство самых первых символов. А это может затянуться на долго...

Сделай return 0; при первом же несовпадении. Тогда из цикла будешь вылетать быстрее.

Share this post


Link to post
Share on other sites

Ну да, логично ;)

Это подправлю.

одна голова хорошо , а две еще лучше :)


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

одна голова хорошо , а две еще лучше :)

А с третей змей горынычем станешь=)) а вот такой вопрос в конечно итоге мне надо , PORTA PORTC чтобы принимали символы(A, G, C и т.д.) А Вот порт B хотелось бы со сдвигом 10010101 и т.д. как это организовать ? лучше будет как мне кажется через прерывание

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Так " с нуля" и не требуется. Возможно кому-то пригодятся отдельные схемные решения из этой конструкции. А кто-то и полностью соберёт, ведь для этого даже плата имеется ...
    • Может кому-то и пригодится, ведь не только у ТС такие проблеммы были пять лет назад ...
    • С ТЗ в диффе (100 Ом/22 Ом и 4.8кОм с 15в), ТП 1.8мА, меандр почти идеальный, синус - ужас (ослик мультика на выход диффа). Без ТЗ - наоборот. Каскод в инвенторе должен разгрузить дифференциальный, но нет, не получилось. Еще заметил, что ТЗ в одном плече (+) "меняют" синус в лучшую сторону (параллельник и два ТЗ не совместимы?). Лучший результат, если "разгружаю" инвертер (и дифф, как "слабое звено") литером (скрипт спонтанеый, в затворе, конечно, от 100 Ом), на много эффективней каскода и ТЗ можно не применять. Кто полевые (в библиотеке МС - ни о чем) применял в УН, какие? Там "копать" стоит, чтоб дорогущий литерал в Ланзар не ставить.   Еще, чем лучший график после диффа, тем хуже Кг, глюк мультисима, по ходу, пора "слезать" с него.
    • @Константин Сомов , Вы на даты постов смотрите? На кой хрен кому-то Ваш пост нужен через четыре года?
    • Очень больше значение имеет ток утечки времязадающего электролитического конденсатора. Если бы его не было - и аналоговые схемы подошли бы. По этой самой причине я и отметил, что 0,5...1 мин - максимальное время устойчивой работы. Но Вам нужно было потоптаться по собственным граблям. Потоптался...  
    • @Alex_641  Так зависит собирать или нет не изза денег даже, хотя купить запчасти дороже чем купить готовый набор в китае  если все это не в шкапчике... разговор больше о времени доставки.

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

  • Similar Content

    • By Карен Григорян
      Здравствуйте, товарищи форумчане!
      У меня вот такая проблемка: есть такая схема:

      По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
      Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
        while (1)
        {
              HAL_ADC_Start_IT(&hadc1);
              HAL_Delay(10);
      }
      Код колбека прерывания:
      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
          if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
          {
            int adc = HAL_ADC_GetValue(&hadc1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
          }
              }
      На всякий случай вот настройка АЦП в stm32:

      Вот пример неправильного вычисления:

    • By RheinmetallSkorpion qq
      Помогите собрать эту схему(даже не нужно что бы она работала, просто скриншот) в любой подходящей программе.(желательно Протеус)
      Либо скажите как называются элементы TV и L , и что за линия под номером 2.
      Так я смогу собрать ее сам
    • By Daeamon Dmitry
      Здравствуйте, набросал вот такую схемку при помощи программы Filter Designer, но вышло что то совсем не то чего ожидал хотел сделать срез на саб от 25 до 80 +-
      Судя по графику в Proteus творится что то непонятное, помогите пожалуйста разобраться в чем проблема.
       
       
      25hp.htm 80lp.htm
    • By SAYMPR
      Кто нибудь может подсказать , данная схема похожа на бортовой навигатор?
       

    • By Timofey Shilov
      Пытаюсь разобраться в программировании этого контроллера и при попытке настроить USART для приема/передачи данных возникла проблема:
      Пытаюсь принять байт и после нажатия кнопки отправить его обратно, но на выходе получается совсем не то что ожидаю.

      При отправке 0 должно вернуть 0, но возвращает вот это. В чем может быть проблема?
      ASCII                                BIN                   DEC         HEX

      Подозрения падают на настройку baud rate, но вроде всё как в мануалах.

      Полный код:
      #include "stm32f4xx.h" #include "stm32f4xx_hal_gpio.h" #include "stm32f4xx_hal_rcc.h" #include "stm32f4xx_hal_cortex.h" #include "stdint.h" #include "math.h" //define Internal RC frequencies #define XTAL 16000000UL //define busses prescalers #define AHB_PRE 1 #define APB1_PRE 2 #define APB2_PRE 1 #define SysTicksClk 10000 //calculate peripheral frequencies #define SYSCLK 84000000 #define AHB SYSCLK/AHB_PRE #define APB1 AHB/APB1_PRE #define APB1_TIM APB1*2 #define APB2 AHB/APB2_PRE #define APB2_TIM APB2*1 #define SysTicks AHB/SysTicksClk #define USART_BAUDRATE 19200 #define BUF_LEN 1 struct Data { char Msg[BUF_LEN]; } Message; void USART2_IRQHandler(void) { if (!(USART2->SR & USART_SR_TXE)) { if (Message.Msg[0] == (char)0x00) GPIOA->ODR |= 1 << 1; if (Message.Msg[0] == (char)0x01) GPIOA->ODR |= 0 << 1; } if (USART2->SR & USART_SR_RXNE) { Message.Msg[0] = USART2->DR; } } int main() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN; GPIOA->MODER |= 1 << 1*2; //Set GPIOA pins output mode GPIOB->MODER |= 0 << 0*2; GPIOA->MODER |= 0xA0; GPIOA->AFR[0] |= 0x7700; RCC->APB1ENR |= RCC_APB1ENR_USART2EN; USART2->CR1 |= USART_CR1_UE; //usart enable USART2->CR1 |= USART_CR1_TE; //transmitter enable USART2->CR1 |= USART_CR1_RE; //receiver enable float div = (float)APB1 /(16*(float)USART_BAUDRATE); int integer = APB1 / (16*USART_BAUDRATE); float flo = (div - (float)integer)*16; int floatt = round(flo); USART2->BRR = (( integer << 4 ) + floatt); NVIC_EnableIRQ(USART2_IRQn); USART2->CR1 |= USART_CR1_TXEIE; USART2->CR1 |= USART_CR1_RXNEIE; int i; while(1) { if (!(GPIOB->IDR & GPIO_IDR_ID0)) { i = 1; } else { if(i == 1) { USART2->DR &= Message.Msg[0]; while(!(USART2->SR & USART_SR_TC)); i = 0; } } } }  
      Сама схема:

×
×
  • Create New...