Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микроконтроллеры с ядром Cortex-M3 в системах управления и автоматики. Учебное пособие
.pdf
int main (void)
{
frq_init();
UART2_init();
while (1)
{
send_string2("команда запроса чтения");
// чтение порта
}
}
По результатам работы оформить отчет.
Содержание отчета:
//преобразование в unsigned long для
//вывода на дисплей
// вывод на дисплей
1. Титульный лист, содержащий название работы, номер варианта индивидуального
задания, фамилия, имя, отчество номер группы.
2. Цель работы.
3. Краткие теоретические сведения.
4. Электрическая принципиальная схема устройства.
5. Код программы.
6. Выводы.
71

СПИСОК ЛИТЕРАТУРЫ
1. Ермак, М. Российские микроконтроллеры с ядром Cortex-M3 и пример реализации
проекта / М. Ермак // Компоненты и технологии. — 2010. — № 9. — С. 74–77.
2. Шумилин, С. Новая серия отечественных 32 разрядных высокопроизводительных
микроконтроллеров семейства 1986 на базе процессорного ядра ARM CortexM3 /
С. Шумилин // Компоненты и технологии. — 2008. — № 10. — С. 92–96.
3. Отладочный комплект для микроконтроллера 1986ВЕ92У [Электронный
ресурс]. — М. : ЗАО «ПКК Миландр», 2019. Режим доступа : https://ic.milandr.ru/products/
programmno_otladochnye_sredstva/otladochnye_komplekty/otladochnyy_komplekt_dlya_mikroko
ntrollera_1986ve92u_k1986ve92qi.
4. Комплект инструментальных средств для микроконтроллеров ЗАО «ПКК
Миландр» 1986ВЕ91. Быстрый старт. — М. : ЗАО «ПКК Миландр», 2010. — 14 с.
5. Спецификация на серию 1986ВЕ9x (Версия 3.16.0 от 06.03.2019) [Электронный
ресурс]. — М. : ЗАО «ПКК Миландр», 2019. — 533 с. — Режим доступа : https://ic.milandr.ru/
products/mikrokontrollery_i_protsessory/1986ve92u/#docs_tab.
6. Спецификация на серию 1986ВЕ9х errata [Электронный ресурс]. — М. : ЗАО «ПКК
Миландр», 2016. — 56 с. — Режим доступа : https://ic.milandr.ru/products/mikrokontrollery_i_
protsessory/1986ve92u/#docs_tab.
7. Standard Peripherals Library (Версия от 06.10.2015) [Электронный ресурс]. — М. :
ЗАО «ПКК Миландр», 2015. — Режим доступа : https://ic.milandr.ru/products/
mikrokontrollery_i_protsessory/32_razryadnye_mikrokontrollery/1986ve9kh_yadro_arm_cortex_m
3/1986ve92u1/#tests_tab.
8. Software pack для Keil MDK 5 для МК 1986ВЕ9х,1Т,3Т,4У (Версия 1.51 от
19.02.2019) [Электронный ресурс]. — М. : ЗАО «ПКК Миландр», 2019. Режим доступа :
https://ic.milandr.ru/products/mikrokontrollery_i_protsessory/32_razryadnye_mikrokontrollery/198
6ve9kh_yadro_arm_cortex_m3/1986ve92u1/#tests_tab.
9. Средства разработки для микроконтроллеров 1986ВЕ1Т, 1986ВЕ91Т, 1986ВЕ92У,
1986ВЕ93У и ARM [Электронный ресурс]. — М. : ООО «КБ Фитон», 2019. — Режим
доступа : http://www.phyton.ru/development-tools/1986ve1t.
10. Жидкокристаллический модуль MT-12864J. Спецификация (версия 1.5 от
29.05.2008) [Электронный ресурс]. — М. : ООО «МЭЛТ», 2008. — 9 с. — Режим доступа :
http://www.melt.com.ru/docs (файл MT-12864J.pdf).
11. Каталог продукции группы компаний «Миландр» [Электронный ресурс]. — М. :
ЗАО «ПКК Миландр», 2018. — 121 с. — Режим доступа : www.milandr.ru.
12. Огородников, И. Н. Микропроцессорная техника. Введение в Cortex-M3
[Электронный ресурс] : учебное пособие / И. Н. Огородников. — Екатеринбург : Уральский
федеральный университет, ЭБС АСВ, 2015. — 116 c. — Режим доступа :
http://www.iprbookshop.ru/68351.html.
72

13. Романенко, А. В. Основы программирования для автоматизированных систем
проектирования и управления инновациями [Электронный ресурс] : учебное пособие для
студентов, обучающихся по направлению подготовки бакалавров «Инноватика» /
А. В. Романенко, А. И. Попов. — Тамбов : Тамбовский государственный технический
университет, ЭБС АСВ, 2014. — 96 c. — Режим доступа : http://www.iprbookshop.ru/63886.html.
14. Благодаров, А. В. Программирование микроконтроллеров семейства 1986ВЕ9Х
компании Миландр / А. В. Благодаров. — М. : Горячая линия-Телеком, 2016. — 230 с.
15. Огородников, И. Н. Микропроцессорная техника: введение в Cortex-M3 /
И. Н. Огородников. — Екатеринбург : Изд-во Урал. ун-та, 2015. — 116 с.
16. Дьяков, И. А. Микропроцессорные системы. Архитектура микроконтроллеров
семейства MCS-51 [Электронный ресурс] : учебное пособие / И. А. Дьяков. — Тамбов :
Тамбовский государственный технический университет, ЭБС АСВ, 2014. — 79 c. — Режим
доступа : http://www.iprbookshop.ru/64120.html.
17. Протокол управления преобразователями частоты серии E2-8300 по
последовательной линии связи MODBUS [Электронный ресурс]. — М. : Компания «Веспер»,
2017. — 33 с. — Режим доступа : http://www.vesper.ru/info/driver.
18. Руководство по эксплуатации преобразователя E2-8300 [Электронный ресурс]. —
М. : Компания «Веспер», 2017. — 95 с. — Режим доступа : http://www.vesper.ru/info/
documentation-manual.
19. Каталог применений E2-8300 [Электронный ресурс]. — М. : Компания «Веспер»,
2017. — 94 с. — Режим доступа : http://www.vesper.ru/catalog/invertors/e2-8300.
20. Приборы щитовые цифровые электроизмерительные ЩК96, ЩК120. Руководство
по эксплуатации [Электронный ресурс]. — Чебоксары : ОАО «Электроприбор», 2009. —
77 с. — Режим доступа : https://www.elpribor.ru/documentation/manuals.
21. Руководство по эксплуатации АС3-М [Электронный ресурс]. — М. : Компания
«ОВЕН», 2010. — 2 с. — Режим доступа : https://www.owen.ru/manuals.
73

ПРИЛОЖЕНИЕ
Пример программы работы интерфейсов контроллера,
разработанный сотрудниками «Миландр»
/**
******************************************************************************
* @file Examples/UART/Example1/main.c
* @author Phyton Application Team
* @version V1.0.0
* @date 16.06.2010
* @brief Main program body.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING
CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR
THEM TO SAVE
* TIME. AS A RESULT, PHYTON SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY
CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY
CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR
PRODUCTS.
*
* <h2><center>© COPYRIGHT 2010 Phyton</center></h2>
*/
/* Includes ------------------------------------------------------------------*/
#include "1986be9x_config.h"
#include "1986BE9x.h"
#include "1986BE9x_uart.h"
#include "1986BE9x_port.h"
#include "1986BE9x_rst_clk.h"
#include "1986BE9x_it.h"
#include "mlt_lcd.h"
//#include "font.h"
#include "MilFlash.h"
/** @addtogroup __1986BE9x_StdPeriph_Examples 1986BE9x StdPeriph Examples
* @{
*/
/** @addtogroup PORT_Example PORT Example
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define Ram
74

#define BLINK_NUM 50
#define BLINK_DELAY 20000
#define LED1 PORT_Pin_0
#define LED2 PORT_Pin_1
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
int count_title = 0;
int MenuMainItem = 0;
int CursorPosItem = 0;
char TestLedDone = 0;
char UartFlag = 0;
char Can1Flag = 0;
char Can2Flag = 0;
char LedFlag = 0;
static PORT_InitTypeDef PortInit;
static UART_InitTypeDef UART_InitStructure;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
void LEDOn(uint32_t LED_Num)
{
PORT_SetBits(PORTC, LED_Num);
}
void LEDOff(uint32_t LED_Num)
{
PORT_ResetBits(PORTC, LED_Num);
}
void BlinkLED1(uint32_t num, uint32_t del,uint32_t LED_Num)
{
uint32_t cnt;
for ( cnt = 0; cnt < num; cnt++)
{
LEDOn(LED_Num);
Delay(del);
LEDOff(LED_Num);
Delay(del);
}
}
void Uart2PinCfg(void)
{
75

/* Fill PortInit structure*/
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_OVERRID;
PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
/* Configure PORTF pins 0 (UART2_RX) as input */
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_Pin = PORT_Pin_0;
PORT_Init(PORTF, &PortInit);
/* Configure PORTF pins 1 (UART2_TX) as output */
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_Pin = PORT_Pin_1;
PORT_Init(PORTF, &PortInit);
}
void Can2PinCfg(void)
{
/* Fill PortInit structure*/
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;
/* Configure PORTA pins 7 (CAN2_RX) as input */
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_Pin = PORT_Pin_7;
PORT_Init(PORTA, &PortInit);
/* Configure PORTA pins 6 (CAN2_TX) as output */
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_Pin = PORT_Pin_6;
PORT_Init(PORTA, &PortInit);
}
void MltPinCfg (void)
{
/* Fill PortInit structure*/
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;
/* Configure PORTA pins 0..5 for mlt inout data */
PortInit.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1 | PORT_Pin_2 | PORT_Pin_3 |
PORT_Pin_4 | PORT_Pin_5);
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
76

PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(PORTA, &PortInit);
/* Configure PORTF pins 2,3 for mlt inout data */
PortInit.PORT_Pin = (PORT_Pin_2 | PORT_Pin_3);
PORT_Init(PORTF, &PortInit);
/* Configure PORTB pins 7..10 for mlt output */
PortInit.PORT_Pin = (PORT_Pin_7 | PORT_Pin_8 | PORT_Pin_9 | PORT_Pin_10);
PortInit.PORT_OE = PORT_OE_OUT;
PORT_Init(PORTB, &PortInit);
/* Configure PORTC pins 0,1 for mlt output */
PortInit.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1);
PORT_Init(PORTC, &PortInit);
}
void LedPinGfg (void)
{
/* Configure PORTC pins 0,1 for output to switch LEDs on/off */
PortInit.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1);
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(PORTC, &PortInit);
}
void ButtonPinGfg (void)
{
/* Configure PORTB pins 5,6 for input Buttons */
PortInit.PORT_Pin = (PORT_Pin_5 | PORT_Pin_6);
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(PORTB, &PortInit);
/* Configure PORTC pins 2 for input Buttons */
PortInit.PORT_Pin = (PORT_Pin_2);
PORT_Init(PORTC, &PortInit);
/* Configure PORTE pins 1,3 for input Buttons */
PortInit.PORT_Pin = (PORT_Pin_1 | PORT_Pin_3);
PORT_Init(PORTE, &PortInit);
}
void Uart2Setup(void)
{
77

/* Select HSI/2 as CPU_CLK source*/
RST_CLK_CPU_PLLconfig (RST_CLK_CPU_PLLsrcHSIdiv2,0);
/* Enables the CPU_CLK clock on UART2 */
RST_CLK_PCLKcmd(RST_CLK_PCLK_UART2, ENABLE);
/* Set the HCLK division factor = 1 for UART2*/
UART_BRGInit(UART2, UART_HCLKdiv1);
UART_InitStructure.UART_BaudRate = 12000;
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;
/* Configure UART2 parameters*/
UART_Init (UART2,&UART_InitStructure);
/* Enables UART2 peripheral */
UART_Cmd(UART2,ENABLE);
}
void Can2Setup(int rate)
{
//* Select HSE/2 as CPU_CLK source
RST_CLK_CPU_PLLconfig
(RST_CLK_CPU_PLLsrcHSEdiv1,RST_CLK_CPU_PLLmul4);
RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
RST_CLK_CPU_PLLcmd(ENABLE);
while (RST_CLK_CPU_PLLstatus() == 0)//wait ready PLL
RST_CLK_CPU_PLLuse(ENABLE);
RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);
/* Enables the CPU_CLK clock on CAN1 */
RST_CLK_PCLKcmd(RST_CLK_PCLK_CAN1, ENABLE);
/* */
RST_CLK->CAN_CLOCK = 0x01000000;
/* Timing setup */
if (rate == 1) CAN1->BITTMNG = 1 << 27 | (3 << 25) | ((5 - 1) << 22) | ((5 - 1) << 19) | ((2
- 1) << 16) | 4; //125
if (rate == 2) CAN1->BITTMNG = 1 << 27 | ((2-1)<<25) | ((2-1)<<22) | ((3-1)<<19) | ((2-
1)<<16) | (2-1); //500
/* TX buffer 1*/
CAN1->BUF_01_CON = 0x00000000;
CAN1->BUF_01_MASK = 0x00000000;
CAN1->BUF_01_FILTER = 0x00000000;
/* RX buffer 2*/
CAN1->BUF_02_CON = 0x00000003;
CAN1->BUF_02_ID = 0x00000000;
CAN1->BUF_02_DLC = 0x00000000;
CAN1->BUF_02_DATAL = 0x00000000;
CAN1->BUF_02_DATAH = 0x00000000;
CAN1->BUF_02_MASK = 0x00000000;
78

CAN1->BUF_02_FILTER = 0x00000000;
/* Enable CAN1 */
CAN1->CONTROL = 0x00000001;
}
void Tim1Setup(void)
{
// vu16 TIMx_ARR, TIMx_CNT, TIMx_PSG, TIMx_CNTRL;
// vu16 value;
// vu16 TIMx_CCRy[4];
/* Enables the clock on TIMER1*/
RST_CLK_PCLKcmd(RST_CLK_PCLK_TIMER1, ENABLE);
RST_CLK->TIM_CLOCK = 0x07000000;
TIMER1->CNTRL = 0x00000000;
TIMER1->CNT = 0x00000000; //start count value
TIMER1->PSG = 0x0000003F; //div main clk
TIMER1->ARR = 0x0000FFFF; //end count value
TIMER1->CH1_CNTRL = 0x00000000;
TIMER1->CH2_CNTRL = 0x00000000;
TIMER1->CH3_CNTRL = 0x00000000;
TIMER1->CH4_CNTRL = 0x00000000;
TIMER1->CH1_CNTRL1 = 0x00000000;
TIMER1->CH2_CNTRL1 = 0x00000000;
TIMER1->CH3_CNTRL1 = 0x00000000;
TIMER1->CH4_CNTRL1 = 0x00000000;
TIMER1->STATUS = 0x00000000;
TIMER1->IE = 0x00000002;
TIMER1->CNTRL |= 0x00000001;
}
int UartTest (void)
{
uint8_t DataByte;
Uart2PinCfg();
Uart2Setup();
while(1)
{
/* Check RXFF flag*/
do
{
if (PORT_ReadInputDataBit(PORTE,PORT_Pin_3) == 0)
{
goto exit;
}
} while (UART_GetFlagStatus (UART2, UART_FLAG_RXFF)!= SET);
/* Recive data*/
79

DataByte = UART_ReceiveData (UART2);
/* Check TXFE flag*/
while (UART_GetFlagStatus (UART2, UART_FLAG_TXFE)!= SET);
/* Send Data */
UART_SendData (UART2,DataByte);
}
exit: return 0;
}
void Can1Test (void)
{
uint32_t DataL,DataH;
DataL = 0x55555555;
DataH = 0x55555555;
Can2PinCfg();
Can2Setup(1);
while(1)
{
do
{
if (PORT_ReadInputDataBit(PORTE,PORT_Pin_3) == 0)
{
goto exitC1;
}
} while ((CAN1->BUF_02_DLC & 0x00000008) != 0x00000008);
DataL = CAN1->BUF_02_DATAL;
DataH = CAN1->BUF_02_DATAH;
//clear RX buf
CAN1->BUF_02_CON = 0x00000000;
CAN1->BUF_02_ID = 0x00000000;
CAN1->BUF_02_DLC = 0x00000000;
CAN1->BUF_02_DATAL = 0x00000000;
CAN1->BUF_02_DATAH = 0x00000000;
//send packet
CAN1->BUF_01_ID = 0x15AA0067;
CAN1->BUF_01_DLC = 0x8 | (1<<9) | (1<<11) | (1<<12);
CAN1->BUF_01_DATAL = DataL;
CAN1->BUF_01_DATAH = DataH;
CAN1->BUF_01_CON = 0x1 | (1<<5);
while ((CAN1->BUF_01_CON & 0x00000020) != 0x00000000);
CAN1->BUF_01_CON = 0x00000000;//disable TX buffer
CAN1->BUF_02_CON = 0x00000003;//disable RX buffer
}
exitC1:
/* Prepare HSI clk */
RST_CLK_HSIcmd(ENABLE);
RST_CLK_HSIstatus();
RST_CLK_CPUclkSelection(RST_CLK_CPUclkHSI);
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
