
Лаб_2 Головков И.Е. 12002108
.docxФЕДЕРАЛЬНОЕ Государственное АВТОНОМНОЕ образовательное УЧРЕЖДЕНИЕ ВЫСШЕГО образования
«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
Кафедра информационных и робототехнических систем
Отчет по лабораторной работе №2 Тема работы «Изучение принципов организации обмена данными по последовательному интерфейсу USB между микроконтроллерам MSP430F1611 и ПЭВМ» по дисциплине «Микроконтроллеры и микроконтроллерные системы»
студента очного отделения
3 курса 12002108 группы
Головкова Игоря Евгеньевича
Проверил:
Шамраев А.А.
Белгород 2024
Цель работы: изучить возможности сопряжения лабораторного стенда на базе микроконтроллера MSP430F1611 и ПЭВМ с помощью последовательного интерфейса USB, принципы программного управления двунаправленным обменом данных по последовательному интерфейсу USB.
Задание Вариант 4: Разработать программу передачи 10 чисел (от 0 до 9) из микроконтроллера MSP430F1611 в ПЭВМ по интерфейсу USB в соответствие с протоколом: модуль USART0, скорость обмена данными 14400 бит/с, режим обмена асинхронный, 7 битов данных без бита четности.
Ход работы:
Рисунок 1 – Результат выполнения работы программы на микроконтроллере MSP430F1611
Листинг программы:
Файл main.c:
#include <msp430.h>
#include "stdio.h"
#include "system_define.h"
#include "system_variable.h"
#include "function_prototype.h"
#include "main.h"
/*
* main.c
*/
void main(void) {
WDTCTL = WDTPW | WDTHOLD;
Init_System_Clock();
Init_System();
UART_init(3,7,1,0,0);
int i;
for(i=0;i<10;i++)
{
UART_sendbyte(i);
}
while(1);
}
Вывод: в ходе лабораторной работы были изучены возможности сопряжения лабораторного стенда на базе микроконтроллера MSP430F1611 и ПЭВМ с помощью последовательного интерфейса USB, а также изучены принципы программного управления двунаправленным обменом данных по последовательному интерфейсу USB.
Приложение А
// инициализация системы тактирования
void Init_System_Clock()
{
volatile byte i;
BCSCTL1 &= ~XT2OFF; // включение осцилятора XT2
// MCLK = XT2, SMCLK = XT2
do // ожидание запуска кварца
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 | SELS; // установка внешнего модуля тактирования
}
// инициализация портов системы
void Init_System()
{
P1DIR |= (nSS + nWR_nRST + MCU_SEL_0 + MCU_SEL_1); // установка направления портов на вывод
DB_DIR = 0x00; // шина данных настроена на ввод
}
void UART_init(byte speed, byte databits, byte stopbits, byte parity, byte iface)
{
P3SEL |= BIT6 | BIT7; // выбор функции USART1
U1CTL = 0; // инициализация состояния USART
ME2 |= UTXE1 + URXE1; // включить приемник и передатчик USART1
if (databits == 7) U1CTL &= ~CHAR; // 7-разрядная длинна символа
if (databits == 8) U1CTL |= CHAR; // 8-разрядная длинна символа
if (stopbits == 1) U1CTL &= ~SPB; // 1 стоповый бит
if (stopbits == 2) U1CTL |= SPB; // 1 стоповых бита
if (parity == 0) U1CTL &= ~PENA; // контроль четности отключен
if (parity == 1) U1CTL = (U1CTL & ~PEV) | PENA; // контроль четности, нечетный
if (parity == 2) U1CTL |= PENA | PEV; // контроль четности, четный
P5DIR |= BIT0; // переключение мультиплексора на USB/оптику
if (iface == 0)
P5OUT |= BIT0;
if (iface == 1)
P5OUT &= ~BIT0;
U1TCTL |= SSEL1; // BRCLK = SMCLK
U1BR0 = 69; // 8Mhz / 115200 = 69.44 (по-умолчанию)
if (speed == 0) U1BR0 = 208; // 8МГц / 38400 = 208.33
if (speed == 1) U1BR0 = 139; // 8МГц / 57600 = 138,89
if (speed == 3) U1BR0 = 0x2b; // 8МГц / 14400 = 0x2b (43)
U1BR1 = 0x02;
U1MCTL = 0x55; // модуляция
}
// передача байта
void UART_sendbyte(char byte)
{
while (!(IFG2 & UTXIFG1)); // проверка готовности буфера передачи USART1
U1TXBUF = byte; // передача байта
}
/******************************************************************************/
#ifndef __SYSTEM_DEFINE_H__
#define __SYSTEM_DEFINE_H__
/******************************************************************************/
#include <msp430.h>
/******************************************************************************/
#ifndef __BYTE_H__
#define __BYTE_H__
typedef unsigned char byte; // 8-bit value
typedef unsigned int word; // 16-bit value
#endif
// output
// Дешифратор DD7 __
#define nSS BIT0 /* P1.0 => сигнал SS - сиглал выборки микросхемы */
// __
#define Set_nSS() P1OUT |= nSS /* сигнал SS = 1 */
// __
#define Reset_nSS() P1OUT &= ~nSS /* сигнал SS = 0 */
// __ ___
#define nWR_nRST BIT2 /* P1.2 => сигнал WR/RST - сигнал записи/сброса */
// __ ___
#define Set_nWR_nRST() P1OUT |= nWR_nRST /* сигнал WR/RST = 1 */
// __ ___
#define Reset_nWR_nRST() P1OUT &= ~nWR_nRST /* сигнал WR/RST = 0 */
//
#define MCU_SEL_0 BIT3 /* P1.3 => сигнал MCU_SEL_0 - младший бит адреса дешифратора */
#define Set_MCU_SEL_0() P1OUT |= MCU_SEL_0 /* сигнал MCU_SEL_0 = 1 */
#define Reset_MCU_SEL_0() P1OUT &= ~MCU_SEL_0 /* сигнал MCU_SEL_0 = 0 */
//
#define MCU_SEL_1 BIT4 /* P1.4 => сигнал MCU_SEL_1 - старший бит адреса дешифратора */
#define Set_MCU_SEL_1() P1OUT |= MCU_SEL_1 /* сигнал MCU_SEL_1 = 1 */
#define Reset_MCU_SEL_1() P1OUT &= ~MCU_SEL_1 /* сигнал MCU_SEL_1 = 0 */
// Адресные линии для модуля ETHERNET xxx7010xx
#define A0 BIT0 /* P2.0 => сигнал A0 - младший бит адреса для модуля ETHERNET */
//
#define A1 BIT1 /* P2.1 => сигнал A1 - старший бит адреса для модуля ETHERNET */
// Шина данных
// direction
#define DB_DIR P4DIR /* Порт P4 <=> двунаправленная шина данных */
// output
#define DB_OUT P4OUT /* Сигналы DB0-DB7 подключены к порту P4 */
// input
#define DB_IN P4IN
// Сигналы управления ЖКИ
// _
#define D_nC_LCD BIT4 /* P3.4 => сигнал D/C_LCD (задает режим обмена между МК и ЖКИ - 1-данные, 0-команда для LCD) */
// _
#define Set_D_nC_LCD() P3OUT |= D_nC_LCD /* сигнал D/C_LCD = 1 */
// _
#define Reset_D_nC_LCD() P3OUT &= ~D_nC_LCD /* сигнал D/C_LCD = 0 */
//
#define EN_LCD BIT5 /* P3.5 => сигнал EN_LCD (разрешение обращений к модулю LCD (а также строб данных)) */
//
#define Set_EN_LCD() P3OUT |= EN_LCD /* сигнал EN_LCD = 1 */
//
#define Reset_EN_LCD() P3OUT &= ~EN_LCD /* сигнал EN_LCD = 0 */
#endif