#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;//объявление структуры PortInit
static UART_InitTypeDef UART_InitStructure;//объявление
структуры UART_InitStructure
uint8_t Recieve_buff[256]; //объявление массива Recieve_buff,
выполняющего роль буфера для приема
uint8_t Recieve_Wr = 0, Recieve_Rd = 0, Recieve_Cnt =
0;//Recieve_Wr – счетчик при записи элемента в массив, Recieve_Rd
– счетчик при чтении элемента из массива, Recieve_Cnt – общий
счетчик обработанных элементов массива.
// Обработчик прерывания UART
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_buff
Recieve_Wr++; //увеличитьRecieve_Wr
Recieve_Cnt++; //увеличить Recieve_Cnt
}
}
//Функция инициализации светодиодов (см.4.1, 4.2)
void init_leds(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTF, ENABLE);
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_FAST;
PORT_Init(MDR_PORTF, &PortInit);
}
//Функция инициализации UART (см. 4.3)
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 = 115000;
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
UART_ITConfig(MDR_UART1,UART_IT_RX, ENABLE);//включить
прерывания по приходу нового пакета вUART
}
int main (void)
{
init_leds(); //инициализация светодиодов
init_UART();// инициализацияUART
while (1) //бесконечный цикл
{
if(Recieve_Cnt> 0) //если общий счетчик больше 0, т.е. в массиве
Recieve_buff есть необработанные данные, выполнить обработку в
машине состояний switch-case в соответствии с таблицей 4.
{
switch(Recieve_buff[Recieve_Rd]){
case 0x0A : PORT_SetBits(MDR_PORTF, PORT_Pin_0); break;
case 0x1A : PORT_ResetBits(MDR_PORTF, PORT_Pin_0); break;
case 0x0B : PORT_SetBits(MDR_PORTF, PORT_Pin_1); break;
case 0x1B : PORT_ResetBits(MDR_PORTF, PORT_Pin_1); break;
case 0xAA : PORT_SetBits(MDR_PORTF, PORT_Pin_0|PORT_Pin_1);
break;
case 0x11 : PORT_ResetBits(MDR_PORTF,
PORT_Pin_0|PORT_Pin_1); break;
default : break;
}
Recieve_Rd++; //увеличить Recieve_Rd
Recieve_Cnt--;// уменьшить Recieve_Cnt
}
}
}