lb3


Министерство образования и науки Российской Федерации
САНКТ-ПЕТЕРБУРГСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ, МЕХАНИКИ И ОПТИКИ
Факультет лазерной и световой инженерии
Кафедра оптико-электронных приборов и систем
Дисциплина программирование микроконтроллеров
Лабораторная работа №3Реализация протокола обмена данных по интерфейсу RS-232
Выполнил:
Захаров А.А. гр. В4106
Проверил Васильев А.С.
2016
Цель работы: освоить приемы организации взаимодействия микроконтроллера с персональным компьютером по интерфейсу RS-232.
Задание
Реализовать устройство, выводящее на светодиоды LED1-LED8 число в бинарном виде, переданное по интерфейсу RS-232 с персонального компьютера по протоколу в соответствии с вариантом индивидуального задания
Вариант задания
№ Протокол Скорость передачи данных
4.
0xAB 0xCD 0xEF 0xFF 0x14 0x02 Data CRC 57600
Поле Data – 1 байт, содержащее передаваемое с персонального компьютера число в диапазоне от 0 до 255.
Поле CRC – 1 байт, контрольная сумма пакета и равна дополнению суммы всех байт пакета без учета переноса до значения 0x100.
Код программы:
#include "MDR32F9Qx_config.h"
#include "MDR32Fx.h"
#include "MDR32F9Qx_uart.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_rst_clk.h"
#include "core_cm3.h"
#include "system_MDR32F9Qx.h"
static PORT_InitTypeDef PortInit;
static UART_InitTypeDef UART_InitStructure;
uint8_t Recieve_buff[256];
uint8_t Recieve_Wr = 0, Recieve_Rd = 0, Recieve_Cnt = 0;
uint8_t Number;
uint8_t D_number = 0;
void UART1_IRQHandler (void)
{
if(UART_GetITStatus(MDR_UART1, UART_IT_RX == 1 ))
{
UART_ClearITPendingBit(MDR_UART1, UART_IT_RX);
Recieve_buff[Recieve_Wr] = UART_ReceiveData(MDR_UART1);
Recieve_Wr++;
Recieve_Cnt++;
}
}
void init_leds(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);
PortInit.PORT_Pin = PORT_Pin_All;
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(MDR_PORTA, &PortInit);
}
void init_UART(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB,ENABLE);
PortInit.PORT_PULL_UP = PORT_PULL_UP_OFF;
PortInit.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PortInit.PORT_PD_SHM = PORT_PD_SHM_OFF;
PortInit.PORT_PD = PORT_PD_DRIVER;
PortInit.PORT_GFEN = PORT_GFEN_OFF;
PortInit.PORT_FUNC = PORT_FUNC_ALTER;
PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_Pin = PORT_Pin_5;
PORT_Init(MDR_PORTB, &PortInit);
PortInit.PORT_Pin = PORT_Pin_6;
PORT_Init(MDR_PORTB, &PortInit);
RST_CLK_CPU_PLLconfig (RST_CLK_CPU_PLLsrcHSIdiv2,0);
RST_CLK_PCLKcmd(RST_CLK_PCLK_UART1, ENABLE);
UART_BRGInit(MDR_UART1, UART_HCLKdiv1);

UART_InitStructure.UART_BaudRate = 28800;
UART_InitStructure.UART_WordLength = UART_WordLength8b;
UART_InitStructure.UART_StopBits = UART_StopBits1;
UART_InitStructure.UART_Parity = UART_Parity_No;
UART_InitStructure.UART_FIFOMode = UART_FIFO_OFF;
UART_InitStructure.UART_HardwareFlowControl =
UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;
UART_Init(MDR_UART1,&UART_InitStructure);
UART_Cmd(MDR_UART1,ENABLE);
NVIC_EnableIRQ(UART1_IRQn);
UART_ITConfig(MDR_UART1,UART_IT_RX, ENABLE);
}
int main (void)
{
init_leds();
init_UART();
while (1)
{
if (Recieve_Cnt==7)
{
if (Recieve_buff[0]==0x0A)
{
if (Recieve_buff[1]==0x11)
{
if (Recieve_buff[2]==0x0A)
{
if (Recieve_buff[3]==0x15)
{
if (Recieve_buff[5]==0x85)
{
if (Recieve_buff[6]==0x41)
{
if (Recieve_buff[4]>=0x0 && Recieve_buff[4]<=0x3F)
{
D_number=1;
}
else
{
if (Recieve_buff[4]>=0x40 && Recieve_buff[4]<=0x60)
{
D_number=2;
}
else
{
if (Recieve_buff[4]>=0x61 && Recieve_buff[4]<=0x80)
{
D_number=3;
}
else
{
if (Recieve_buff[4]>=0x81 && Recieve_buff[4]<=0xFF)
{
D_number=4;
}
}
}
}
}
}
}
}
}
}
}
switch (D_number)
{
case 1 :
PORT_SetBits(MDR_PORTA, PORT_Pin_0);
PORT_SetBits(MDR_PORTA, PORT_Pin_1);
PORT_SetBits(MDR_PORTA, PORT_Pin_2);
PORT_SetBits(MDR_PORTA, PORT_Pin_3);
Recieve_Rd=0;
Recieve_Cnt=0;
Recieve_Wr=0;
break;
case 2 :
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
PORT_SetBits(MDR_PORTA, PORT_Pin_5);
PORT_SetBits(MDR_PORTA, PORT_Pin_6);
PORT_SetBits(MDR_PORTA, PORT_Pin_7);
Recieve_Rd=0;
Recieve_Cnt=0;
Recieve_Wr=0;
break;
case 3 :
PORT_SetBits(MDR_PORTA, PORT_Pin_0);
PORT_SetBits(MDR_PORTA, PORT_Pin_2);
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
PORT_SetBits(MDR_PORTA, PORT_Pin_6);
Recieve_Rd=0;
Recieve_Cnt=0;
Recieve_Wr=0;
break;
case 4 :
PORT_SetBits(MDR_PORTA, PORT_Pin_1);
PORT_SetBits(MDR_PORTA, PORT_Pin_3);
PORT_SetBits(MDR_PORTA, PORT_Pin_5);
PORT_SetBits(MDR_PORTA, PORT_Pin_7);
Recieve_Rd=0;
Recieve_Cnt=0;
Recieve_Wr=0;
break;
}
Recieve_Rd++;
Recieve_Cnt--;
}
}
Вывод: в ходе данной лабораторной работы было реализовано мигание светодиодами LED1-LED8 переданное по интерфейсу RS-232 с персонального компьютера по протоколу в соответствии с вариантом индивидуального задания.

Приложенные файлы

  • docx 11332758
    Размер файла: 16 kB Загрузок: 0

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