瀏覽代碼

更新MCU工程(iram版本和sram-nos版本)
1.优化串口驱动中存在的问题(调整uart3的fifo大小、UART_close的逻辑问题和uart_demo优先级),并实现串口中断处理函数。
2.优化osdtest.c文件中的编译警告问题。

helen 3 月之前
父節點
當前提交
82f0bf1644

+ 4 - 28
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/osdtest.c

@@ -17,6 +17,7 @@
 #include "update.h"
 #include "sfud.h"
 
+u8 compblk, crcblk;
 typedef struct image_info {
 	u32 addr;
 	u32 size;
@@ -192,8 +193,6 @@ void osd_display_image(IMAGE_INFO *image, u32 blk, u32 cx, u32 cy)
 	OSD_SetBlockEn(blk, 1);
 }
 
-static u8 pblk, sblk, bblk, oblk;
-u8 compblk, crcblk;
 void osd_display(void)
 {
 	u32 osd_odd_even_mode = 0;
@@ -266,21 +265,20 @@ void osd_display(void)
 
 	power = rand() % 100;
 	speed = rand() % 100;
-	pblk = blk;
+
 	osd_display_image(&images[IMG_ICON_02 + power / 10], blk++, 446, 328);
 	osd_display_image(&images[IMG_ICON_02 + power % 10], blk++, 518, 328);
 	osd_display_image(&images[IMG_ICON_36], blk++, 486, 448);
 
 	osd_display_image(&images[IMG_ICON_43], blk++, 828, 368);
 
-	sblk = blk;
 	osd_display_image(&images[IMG_ICON_02 + speed / 10], blk++, 1328, 328);
 	osd_display_image(&images[IMG_ICON_02 + speed % 10], blk++, 1400, 328);
 	osd_display_image(&images[IMG_ICON_37], blk++, 1360, 448);
 
 	osd_display_image(&images[IMG_ICON_41], blk++, 628, 548);
 	battery = rand() % 100;
-	bblk = blk;
+
 	osd_display_image(&images[IMG_ICON_13 + battery / 10], blk++, 686, 548);
 	osd_display_image(&images[IMG_ICON_13 + battery % 10], blk++, 714, 548);
 	osd_display_image(&images[IMG_ICON_39], blk++, 748, 548);
@@ -289,7 +287,7 @@ void osd_display(void)
 
 	osd_display_image(&images[IMG_ICON_40], blk++, 1108, 548);
 	oil = rand() % 100;
-	oblk = blk;
+
 	osd_display_image(&images[IMG_ICON_13 + oil / 10], blk++, 1166, 548);
 	osd_display_image(&images[IMG_ICON_13 + oil % 10], blk++, 1194, 548);
 	osd_display_image(&images[IMG_ICON_39], blk++, 1228, 548);
@@ -302,28 +300,6 @@ void osd_display(void)
 	OSD_Sync();
 }
 
-void osd_refresh(void)
-{
-	u32 power, speed, battery, oil;
-
-	for (;;) {
-		power = (power + 1) % 100;
-		speed = (speed + 1) % 100;
-		battery = (battery + 1) % 100;
-		oil = (oil + 1) % 100;
-		OSD_SetBlkAddr(pblk, images[IMG_ICON_02 + power / 10].addr >> 2);
-		OSD_SetBlkAddr(pblk + 1, images[IMG_ICON_02 + power % 10].addr >> 2);
-		OSD_SetBlkAddr(sblk, images[IMG_ICON_02 + speed / 10].addr >> 2);
-		OSD_SetBlkAddr(sblk + 1, images[IMG_ICON_02 + speed % 10].addr >> 2);
-		OSD_SetBlkAddr(bblk, images[IMG_ICON_13 + battery / 10].addr >> 2);
-		OSD_SetBlkAddr(bblk + 1, images[IMG_ICON_13 + battery % 10].addr >> 2);
-		OSD_SetBlkAddr(oblk, images[IMG_ICON_13 + oil / 10].addr >> 2);
-		OSD_SetBlkAddr(oblk + 1, images[IMG_ICON_13 + oil % 10].addr >> 2);
-		OSD_Sync();
-		vTaskDelay(100);
-	}
-}
-
 void osd_test(void)
 {
 	OSD->PAL_TEST_EN = 0x101;

+ 58 - 44
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_uart.c

@@ -239,30 +239,6 @@ void UART_SendChar(UART_TypeDef *uartx, u8 ch)
 	while (!(uartx->USR & (1 << 2)));
 }
 
-void UART0_IrqHandler(void)
-{
-}
-
-void UART2_IrqHandler(void)
-{
-
-}
-
-void UART3_IrqHandler(void)
-{
-
-}
-
-static void UART_StopTx(UartPort_t *uap)
-{
-	uap->uartx->DLH_IER &= ~(1 << 1);
-}
-
-static void UART_StartTx(UartPort_t *uap)
-{
-	uap->uartx->DLH_IER |= 1 << 1;
-}
-
 static int UART_RxChars(UartPort_t *uap)
 {
 	u32 lsr;
@@ -294,6 +270,16 @@ static int UART_RxChars(UartPort_t *uap)
 
 }
 
+static void UART_StartTx(UartPort_t *uap)
+{
+	uap->uartx->DLH_IER |= 1 << 1;
+}
+
+static void UART_StopTx(UartPort_t *uap)
+{
+	uap->uartx->DLH_IER &= ~(1 << 1);
+}
+
 /* Returns true if tx interrupts have to be (kept) enabled  */
 static BaseType_t UART_TxChars(UartPort_t *uap, int from_irq)
 {
@@ -318,29 +304,50 @@ static BaseType_t UART_TxChars(UartPort_t *uap, int from_irq)
 	return pdTRUE;
 }
 
-void UART1_IrqHandler(void)
+static void UART_IRQHandler(UartPort_t *uap)
 {
-	UartPort_t *uap = pxUartPort[1];
 	u32 iir;
 	u32 status;
 
-	iir = uap->uartx->IIR_FCR;
-	switch (iir & UART_IIR_IID_MASK) {
-	case UART_IIR_IID_THR_EMPTY:
-		UART_TxChars(uap, 1);
-		break;
-	case UART_IIR_IID_REV_DATA_AVAIL:
-	case UART_IIR_IID_REV_LINE_STATUS:
-	case UART_IIR_IID_CHAR_TIMEOUT:
-		UART_RxChars(uap);
-		break;
-	case UART_IIR_IID_BUSY_DETECT:
-		status = uap->uartx->USR;
-		printf("busy status 0x%x.\n", status);
-		break;
+	if (uap) {
+		iir = uap->uartx->IIR_FCR;
+		switch (iir & UART_IIR_IID_MASK) {
+		case UART_IIR_IID_THR_EMPTY:
+			UART_TxChars(uap, 1);
+			break;
+		case UART_IIR_IID_REV_DATA_AVAIL:
+		case UART_IIR_IID_REV_LINE_STATUS:
+		case UART_IIR_IID_CHAR_TIMEOUT:
+			UART_RxChars(uap);
+			break;
+		case UART_IIR_IID_BUSY_DETECT:
+			status = uap->uartx->USR;
+			printf("busy status 0x%x.\n", status);
+			break;
+		}
 	}
 }
 
+void UART0_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[0]);
+}
+
+void UART2_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[2]);
+}
+
+void UART3_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[3]);
+}
+
+void UART1_IrqHandler(void)
+{
+	UART_IRQHandler(pxUartPort[1]);
+}
+
 UartPort_t *UART_Open(eUartID id)
 {
 	UART_TypeDef *uartx = NULL;
@@ -400,7 +407,10 @@ UartPort_t *UART_Open(eUartID id)
 	configASSERT(uap->xSend);
 
 	uap->uartx = uartx;
-	uap->fifosize = 128;
+	if (id == UART_ID3)
+		uap->fifosize = 64;
+	else
+		uap->fifosize = 128;
 
 	return pxUartPort[id] = uap;
 
@@ -424,22 +434,26 @@ void UART_Close(UartPort_t *uap)
 	uap->rxbuf.tail = uap->rxbuf.head =  0;
 	vPortFree(uap->txbuf.buf);
 	uap->rxbuf.tail = uap->rxbuf.head =  0;
-	vPortFree(uap);
 #ifdef _UART0
 	if (uap->uartx == UART0)
 		pxUartPort[0] = NULL;
 #endif
 #ifdef _UART1
+	if (uap->uartx == UART1)
 		pxUartPort[1] = NULL;
 #endif
 
 #ifdef _UART2
+	if (uap->uartx == UART2)
 		pxUartPort[2] = NULL;
 #endif
 
 #ifdef _UART3
+	if (uap->uartx == UART3)
 		pxUartPort[3] = NULL;
 #endif
+
+	vPortFree(uap);
 }
 
 int UART_Write(UartPort_t *uap, u8 *buf, size_t len, TickType_t xBlockTime)
@@ -541,8 +555,8 @@ int uart_demo(eUartID id)
 	snprintf(taskname, 16, "uartdemo%d", id);
 
 	/* Create a task to process uart rx data */
-	if (xTaskCreate(uart_demo_thread, taskname, configMINIMAL_STACK_SIZE, uap,
-		configMAX_PRIORITIES / 3, NULL) != pdPASS) {
+	if (xTaskCreate(uart_demo_thread, taskname, configMINIMAL_STACK_SIZE , uap,
+		(tskIDLE_PRIORITY + 1) | portPRIVILEGE_BIT, NULL) != pdPASS) {
 		printf("create uart rx demo task fail.\n");
 		return -1;
 	}

+ 6 - 4
amt630hv160-mcu/amt630hv160-mcu-iram/src/main.c

@@ -629,11 +629,13 @@ retry:
 	}
 	printf("Update finished! Please change the bootmode and repower.\n");
 #else
-#if defined(_UART0) && PRINT_UART != UART0
-	uart_demo(UART_ID0);
+#if defined(_UART0)
+	if(PRINT_UART != UART0)
+		uart_demo(UART_ID0);
 #endif
-#if defined(_UART1) && PRINT_UART != UART1
-	uart_demo(UART_ID1);
+#if defined(_UART1)
+	if(PRINT_UART != UART1)
+		uart_demo(UART_ID1);
 #endif
 
 #ifdef DCIC_FAULT_DETECT

+ 4 - 6
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/App/osdtest.c

@@ -16,6 +16,7 @@
 #include "amt630hv160_lib.h"
 #include "update.h"
 #include "sfud.h"
+u8 compblk, crcblk;
 
 typedef struct image_info {
 	u32 addr;
@@ -192,8 +193,6 @@ void osd_display_image(IMAGE_INFO *image, u32 blk, u32 cx, u32 cy)
 	OSD_SetBlockEn(blk, 1);
 }
 
-static u8 pblk, sblk, bblk, oblk;
-u8 compblk, crcblk;
 void osd_display(void)
 {
 	u32 osd_odd_even_mode = 0;
@@ -266,21 +265,20 @@ void osd_display(void)
 
 	power = rand() % 100;
 	speed = rand() % 100;
-	pblk = blk;
+
 	osd_display_image(&images[IMG_ICON_02 + power / 10], blk++, 446, 328);
 	osd_display_image(&images[IMG_ICON_02 + power % 10], blk++, 518, 328);
 	osd_display_image(&images[IMG_ICON_36], blk++, 486, 448);
 
 	osd_display_image(&images[IMG_ICON_43], blk++, 828, 368);
 
-	sblk = blk;
 	osd_display_image(&images[IMG_ICON_02 + speed / 10], blk++, 1328, 328);
 	osd_display_image(&images[IMG_ICON_02 + speed % 10], blk++, 1400, 328);
 	osd_display_image(&images[IMG_ICON_37], blk++, 1360, 448);
 
 	osd_display_image(&images[IMG_ICON_41], blk++, 628, 548);
 	battery = rand() % 100;
-	bblk = blk;
+
 	osd_display_image(&images[IMG_ICON_13 + battery / 10], blk++, 686, 548);
 	osd_display_image(&images[IMG_ICON_13 + battery % 10], blk++, 714, 548);
 	osd_display_image(&images[IMG_ICON_39], blk++, 748, 548);
@@ -289,7 +287,7 @@ void osd_display(void)
 
 	osd_display_image(&images[IMG_ICON_40], blk++, 1108, 548);
 	oil = rand() % 100;
-	oblk = blk;
+
 	osd_display_image(&images[IMG_ICON_13 + oil / 10], blk++, 1166, 548);
 	osd_display_image(&images[IMG_ICON_13 + oil % 10], blk++, 1194, 548);
 	osd_display_image(&images[IMG_ICON_39], blk++, 1228, 548);

+ 4 - 4
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/ArkmicroFiles/libcpu-amt630hv160/include/amt630hv160_uart.h

@@ -18,10 +18,10 @@
 #include "amt630hv160_map.h"
 #include "circ_buf.h"
 
-#define UART0_INT_PRIORITY	(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 3)
-#define UART1_INT_PRIORITY	(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 3)
-#define UART2_INT_PRIORITY	(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 3)
-#define UART3_INT_PRIORITY	(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 3)
+#define UART0_INT_PRIORITY	(MAX_INTERRUPT_PRIORITY + 5)
+#define UART1_INT_PRIORITY	(MAX_INTERRUPT_PRIORITY + 5)
+#define UART2_INT_PRIORITY	(MAX_INTERRUPT_PRIORITY + 5)
+#define UART3_INT_PRIORITY	(MAX_INTERRUPT_PRIORITY + 5)
 
 typedef enum UART_ID {UART_ID0 = 0, UART_ID1, UART_ID2, UART_ID3} eUartID;
 

+ 56 - 42
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_uart.c

@@ -238,30 +238,6 @@ void UART_SendChar(UART_TypeDef *uartx, u8 ch)
 	while (!(uartx->USR & (1 << 2)));
 }
 
-void UART0_IrqHandler(void)
-{
-}
-
-void UART2_IrqHandler(void)
-{
-
-}
-
-void UART3_IrqHandler(void)
-{
-
-}
-
-static void UART_StopTx(UartPort_t *uap)
-{
-	uap->uartx->DLH_IER &= ~(1 << 1);
-}
-
-static void UART_StartTx(UartPort_t *uap)
-{
-	uap->uartx->DLH_IER |= 1 << 1;
-}
-
 static int UART_RxChars(UartPort_t *uap)
 {
 	u32 lsr;
@@ -293,6 +269,16 @@ static int UART_RxChars(UartPort_t *uap)
 
 }
 
+static void UART_StartTx(UartPort_t *uap)
+{
+	uap->uartx->DLH_IER |= 1 << 1;
+}
+
+static void UART_StopTx(UartPort_t *uap)
+{
+	uap->uartx->DLH_IER &= ~(1 << 1);
+}
+
 /* Returns true if tx interrupts have to be (kept) enabled  */
 static uint32_t UART_TxChars(UartPort_t *uap, int from_irq)
 {
@@ -317,29 +303,50 @@ static uint32_t UART_TxChars(UartPort_t *uap, int from_irq)
 	return pdTRUE;
 }
 
-void UART1_IrqHandler(void)
+static void UART_IRQHandler(UartPort_t *uap)
 {
-	UartPort_t *uap = pxUartPort[1];
 	u32 iir;
 	u32 status;
 
-	iir = uap->uartx->IIR_FCR;
-	switch (iir & UART_IIR_IID_MASK) {
-	case UART_IIR_IID_THR_EMPTY:
-		UART_TxChars(uap, 1);
-		break;
-	case UART_IIR_IID_REV_DATA_AVAIL:
-	case UART_IIR_IID_REV_LINE_STATUS:
-	case UART_IIR_IID_CHAR_TIMEOUT:
-		UART_RxChars(uap);
-		break;
-	case UART_IIR_IID_BUSY_DETECT:
-		status = uap->uartx->USR;
-		printf("busy status 0x%x.\n", status);
-		break;
+	if (uap) {
+		iir = uap->uartx->IIR_FCR;
+		switch (iir & UART_IIR_IID_MASK) {
+		case UART_IIR_IID_THR_EMPTY:
+			UART_TxChars(uap, 1);
+			break;
+		case UART_IIR_IID_REV_DATA_AVAIL:
+		case UART_IIR_IID_REV_LINE_STATUS:
+		case UART_IIR_IID_CHAR_TIMEOUT:
+			UART_RxChars(uap);
+			break;
+		case UART_IIR_IID_BUSY_DETECT:
+			status = uap->uartx->USR;
+			printf("busy status 0x%x.\n", status);
+			break;
+		}
 	}
 }
 
+void UART0_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[0]);
+}
+
+void UART2_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[2]);
+}
+
+void UART3_IRQHandler(void)
+{
+	UART_IRQHandler(pxUartPort[3]);
+}
+
+void UART1_IrqHandler(void)
+{
+	UART_IRQHandler(pxUartPort[1]);
+}
+
 UartPort_t *UART_Open(eUartID id)
 {
 	UART_TypeDef *uartx = NULL;
@@ -390,7 +397,10 @@ UartPort_t *UART_Open(eUartID id)
 	}
 
 	uap->uartx = uartx;
-	uap->fifosize = 128;
+	if (id == UART_ID3)
+		uap->fifosize = 64;
+	else
+		uap->fifosize = 128;
 
 	return pxUartPort[id] = uap;
 
@@ -411,22 +421,26 @@ void UART_Close(UartPort_t *uap)
 	uap->rxbuf.tail = uap->rxbuf.head =  0;
 	vPortFree(uap->txbuf.buf);
 	uap->rxbuf.tail = uap->rxbuf.head =  0;
-	vPortFree(uap);
 #ifdef _UART0
 	if (uap->uartx == UART0)
 		pxUartPort[0] = NULL;
 #endif
 #ifdef _UART1
+	if (uap->uartx == UART1)
 		pxUartPort[1] = NULL;
 #endif
 
 #ifdef _UART2
+	if (uap->uartx == UART2)
 		pxUartPort[2] = NULL;
 #endif
 
 #ifdef _UART3
+	if (uap->uartx == UART3)
 		pxUartPort[3] = NULL;
 #endif
+
+	vPortFree(uap);
 }
 
 int UART_Write(UartPort_t *uap, u8 *buf, size_t len, TickType_t xBlockTime)

+ 16 - 9
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/main.c

@@ -34,7 +34,13 @@ extern void MediaUpdateReceiveDemo(void);
 
 extern  void KeyTask(void);
 extern void DisplayTask(void);
+extern void uart_demo(eUartID id);
+
+#ifdef DCIC_FAULT_DETECT
 extern void dcic_crc_handler(void);
+void fault_detect(void);
+#endif
+
 #if RTC_DEMO
 extern void rtc_sleep_demo(void);
 extern void rtc_wakeup_demo(void);
@@ -287,6 +293,16 @@ retry:
 	UPDATE_ReadImageHeader();
 	ReadSysInfo();
 	StartCpu();
+
+#if defined(_UART0)
+		if(PRINT_UART != UART0)
+			uart_demo(UART_ID0);
+#endif
+#if defined(_UART1)
+		if(PRINT_UART != UART1)
+			uart_demo(UART_ID1);
+#endif
+
 #ifdef DCIC_FAULT_DETECT
 	fault_detect();
 #endif
@@ -317,15 +333,6 @@ retry:
 #ifdef CPU_ACCESS_MODULE_SUPPORT
 		DetectCpuAccessModule();
 #endif
-
-#if defined(_UART0)
-		if(PRINT_UART != UART0)
-			uart_demo(UART_ID0);
-#endif
-#if defined(_UART1)
-		if(PRINT_UART != UART1)
-			uart_demo(UART_ID1);
-#endif
 #endif
 
 #ifdef DCIC_FAULT_DETECT