Commit 6d59e9d9 authored by 张金硕's avatar 张金硕

feat:按照一部代码填加串口rx的DMA功能

parent 6ddf8a84
......@@ -9,7 +9,7 @@ LR_IROM1 0x0000C400 0x00073C00 { ; load region size_region
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x0000FF00 { ; RW data
RW_IRAM1 0x20000400 0x0000FF00 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x2000FF00 0x00000100 { ; RW data
......
#include "AMT630H.h"
#include <stdint.h>
#include "UartProtocol.h"
#include "Components.h"
#include "PicBin.h"
#include "GpioUser.h"
__align(4) /* 四字节对齐 */
......@@ -198,6 +197,76 @@ void Delay_Time_Ctrl(unsigned long Tms)
Delay_Time_Set = 0;
}
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
uint8_t UartRevBuff[MCU_RX_630_UART_BUF_SIZE] = { 0 };
uint8_t UartRevBuff1[MCU_RX_630_UART_BUF_SIZE] = { 0 };
uint32_t UartRevPos = 0;
uint32_t UartLastCnt = 0;
uint32_t UartRevCnts = 0;
uint32_t rx_flag = 0;
uint32_t textError = 0;
uint8_t err_type = 0;
uint32_t EnterErrorCnts = 0;
uint32_t AddressError = 0;
uint32_t textLastAddressError = 0x40041512;
void mwAmt630hUartDMA_RecvData(void)
{
uint32_t rxCnt = 0;
uint32_t tmpCnt = 0;
uint8_t overFlowFlag = 0;
// accumulate receive Counts
rxCnt = DMAVEC->CTRL[USE_DMA_AREA].DMRLD - DMAVEC->CTRL[USE_DMA_AREA].DMACT;
if (rxCnt > MCU_RX_630_UART_BUF_SIZE)
{
rxCnt = UartLastCnt;
}
if (rxCnt != UartLastCnt)
{
rx_flag = 1;
if (rxCnt > UartLastCnt)
{
tmpCnt = rxCnt - UartLastCnt;
}
else
{
tmpCnt = MCU_RX_630_UART_BUF_SIZE - UartLastCnt;
overFlowFlag = 1;
}
UartLastCnt = rxCnt;
}
if (rx_flag == 1)
{
if (overFlowFlag == 0)
{
memcpy(&UartRevBuff[UartRevCnts],&UartRevBuff1[UartRevCnts],tmpCnt);
UartRevCnts += tmpCnt;
if (UartRevCnts >= MCU_RX_630_UART_BUF_SIZE)
{
UartRevCnts = 0;
}
}
else
{
memcpy(&UartRevBuff[UartRevCnts],&UartRevBuff1[UartRevCnts],tmpCnt);
UartRevCnts = 0;
memcpy(&UartRevBuff[UartRevCnts],&UartRevBuff1[UartRevCnts],rxCnt);
overFlowFlag = 0;
UartRevCnts += rxCnt;
}
rx_flag = 0;
}
}
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
uint8_t UartRevBuff[0x1000] = { 0 };
uint32_t UartRevCnts = 0;
void Amt630hUartRecvData(uint16_t u16UARTData)
......@@ -208,6 +277,7 @@ void Amt630hUartRecvData(uint16_t u16UARTData)
UartRevCnts = 0;
}
}
#endif
void AMT630H_RstCtrl(void)
{
RTE_GPIO_Set_Level(VCC_33_EN_MCU, 0);//630
......
#ifndef AMT_630H_H
#define AMT_630H_H
#include <stdint.h>
#include "Components.h"
typedef enum
{
EM_FLASH_CHECK_RESULT_NO_ACT = 0,
......@@ -27,9 +27,17 @@ typedef struct __attribute__((aligned(4)))
(((AMT630H_ANIMATION_TIME) / AMT630H_ANIMATION_PIC_NUM) - 5))
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
void Amt630hUartRecvData(uint16_t u16UARTData);
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
extern uint8_t UartRevBuff1[MCU_RX_630_UART_BUF_SIZE];
extern void mwAmt630hUartDMA_RecvData(void);
#endif
void AMT630H_Timer(unsigned char Tms);
void Delay_Time_Ctrl(unsigned long Tms);
void Amt630hUartRecvData(uint16_t u16UARTData);
void AMT630H_Animation_PlayProc(uint16_t PicIndex);
void AMT630H_RstCtrl(void);
void Amt630hInit(void);
......
......@@ -5,14 +5,26 @@
#include "UDS_ISO14229_Services.h"
#include "flash.h"
#include "Device\Cmsemicon\BAT32A279\RTE\UART\RTE_UART.h"
#include "Components.h"
#define NULL 0
extern uint8_t UartRevBuff[0x1000];
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
extern uint8_t UartRevBuff[0x1000];
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
extern uint8_t UartRevBuff[MCU_RX_630_UART_BUF_SIZE];
#endif
extern uint32_t UartRevCnts;
uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos)
{
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
*UartRecvBufLen = 0x1000;
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
*UartRecvBufLen = MCU_RX_630_UART_BUF_SIZE;
#endif
*UartRecvPos = UartRevCnts;
return UartRevBuff;
}
......
#ifndef COMPONENTS_H__
#define COMPONENTS_H__
/* mcu receive 630 data mode */
#define MCU_RX_630_MODE_UART_INTERRUPT 0
#define MCU_RX_630_MODE_UART_DMA 1
#define MCU_RX_630_MODE MCU_RX_630_MODE_UART_DMA
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
#define MCU_RX_630_UART_BUF_SIZE 0x800
#define UART_USE_DMA 1
#define USE_DMA_AREA 4
#endif
#include "Simulated_IIC_master\Simulated_IIC_master.h"
#include "System_Monitor\System_Monitor.h"
#include "Key\Key_user.h"
......
......@@ -2,6 +2,7 @@
#include "Components.h"
#include "FaultCode.h"
#include "System_Monitor\System_Monitor_User.h"
#include "dma.h"
RTC_Information_st_t g_stRTCInformation;
......@@ -46,9 +47,34 @@ static void Power_KL30_Init(void)
loc_config.u32UARTChEn = 1U;
loc_config.u32UARTbps = 500000U;
loc_config.pfnUARTConfirmCallBack = NULL;
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
loc_config.pfnUARTReadMsgCallBack = Amt630hUartRecvData;
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
loc_config.pfnUARTReadMsgCallBack = NULL;
#endif
UART_DeInit(UART2); //50us
RTE_UART_Init(UART_CH2, &loc_config); //68.35ms
DMA_InitTypeDef DMA_InitTypeDef_Struct;
DMA_InitTypeDef_Struct.DMA_Vector = DMA_VECTOR_SR2;//指定串口2为启动源
DMA_InitTypeDef_Struct.DMA_CtrlId = 4;//指定启动源在DMA控制数据区的ID
DMA_InitTypeDef_Struct.DMA_SrcAddr =(uint32_t)&SCI1->SCI.RXD2 /*0x40041512*/;//传送源地址
DMA_InitTypeDef_Struct.DMA_DstAddr = (uint32_t)UartRevBuff1;//传送目标地址
DMA_InitTypeDef_Struct.DMA_BufferSize = MCU_RX_630_UART_BUF_SIZE;//0x800的buffer,也是DMA重复循环一轮传输数据的次数
DMA_InitTypeDef_Struct.DMA_SrcInc = 0;//传送源地址不自增,DMACR寄存器,MODE位为“1”(重复模式)并且RPTSEL位为“1”(传送源为重复区)时,SAMOD位的设置无效。
DMA_InitTypeDef_Struct.DMA_DstInc = 0;//传送目标地址自增,DMACR寄存器,MODE位为“1”(重复模式)并且RPTSEL位为“0”(传送目标为重复区)时,SAMOD位的设置无效。
DMA_InitTypeDef_Struct.DMA_DataSize = DMA_DataSize_Byte;//传送数据长度为8位
DMA_InitTypeDef_Struct.DMA_Mode = DMA_Mode_Repeat;//重复模式
DMA_InitTypeDef_Struct.DMA_RepeatAreaAddr = DMA_RepeatAreaAddr_Dst;//DMACR寄存器,RPTSEL位为“0”(传送目标为重复区)
DMA_InitTypeDef_Struct.DMA_RepeatInt = DMA_RepeatInt_Disable;//禁止发生中断
DMA_InitTypeDef_Struct.DMA_ChainTrans = DMA_ChainTrans_None;//禁止链传送
DMA_Init(&DMA_InitTypeDef_Struct);
DMA_Start(DMA_VECTOR_SR2);
Common_DataInit(); //50us
Analog_Signal_Conv_Init(); //150us
Sys_KL30_Init(); //275.55ms
......@@ -110,7 +136,13 @@ static void Power_Wakeup_Init(void)
loc_config.u32UARTChEn = 1U;
loc_config.u32UARTbps = 115200U;
loc_config.pfnUARTConfirmCallBack = NULL;
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_INTERRUPT)
loc_config.pfnUARTReadMsgCallBack = Amt630hUartRecvData;
#endif
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
loc_config.pfnUARTReadMsgCallBack = NULL;
#endif
UART_DeInit(UART2);
RTE_UART_Init(UART_CH2, &loc_config); /* 配置串口,630H上电发送0x0D,但是底板没回复 */
Amt630hInit();
......
......@@ -201,7 +201,7 @@ uint32_t RTE_UART_Init(UART_Channel_en_t enUARTCh, UART_Channel_Config_st_t *pen
stUARTCh2Cfg.pfnUARTReadMsgCallBack = penUARTCfg->pfnUARTReadMsgCallBack;
ISR_Register(ST2_IRQn, UART_CH2_TX_ISR); //串口2发送中断服务路径注册
ISR_Register(SR2_IRQn, UART_CH2_RX_ISR); //串口2接收中断服务路径注册
// ISR_Register(SR2_IRQn, UART_CH2_RX_ISR); //串口2接收中断服务路径注册
ret = UART_Init(UART2, &stUART_InitStruct);
break;
......
......@@ -12,6 +12,9 @@ void Sys_Pseudo_Real_Time_Tasks(void)
Power_Management_Service();
DoCAN_Communication_Service();
UDS_Server_Application_Service();
#if (MCU_RX_630_MODE == MCU_RX_630_MODE_UART_DMA)
mwAmt630hUartDMA_RecvData();
#endif
}
void Sys_2ms_Tasks(void)
......@@ -20,7 +23,7 @@ void Sys_2ms_Tasks(void)
Sys_Status_Update_Service();
Analog_Signal_Conv_Service();
AMT630H_Main();
Check_MCU_Info_in_630H();
// Check_MCU_Info_in_630H();
DoCAN_Timer_Update(2000u);
//Can_Write_Fun(&CAN_CH0_CanMsgTxOp, 2000u);无外发
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment