STM32F 系列单片机 调试记录

1、RTC 配置

            调一个 RTC,刚开始运行都正常,设置的时间跟读出的时间一样。但是换了一个芯片出现读出的年不对的情况,调试才发现是RTC设置的时候有些参数漏掉没填导致的。

T_S32 DRIVER_RTC_Ioctl(T_S32 s32Cmd, T_VOID *pvData)
{
	switch(s32Cmd)
	{
		case E_RTC_IOCTL_CMD_SET_WAKE_INT:
		{
			//T_U16 u16Cnt = *((T_U16 *)pvData);

		}
		break;	

		case E_RTC_IOCTL_CMD_READ_TIME:
		{
			S_RtcIoctlRead *pstTime = (S_RtcIoctlRead *)pvData;

			RTC_DateTypeDef stDate;
			RTC_TimeTypeDef stTime;
			
			HAL_RTC_GetTime(&RtcHandle, &stTime, RTC_FORMAT_BCD);
			HAL_RTC_GetDate(&RtcHandle, &stDate, RTC_FORMAT_BCD);
			
			pstTime->u8Year = stDate.Year;
			pstTime->u8Month = stDate.Month;
			pstTime->u8Date = stDate.Date;
			pstTime->u8WeekDay = stDate.WeekDay;
			
			pstTime->u8Hours = stTime.Hours;
			pstTime->u8Minutes = stTime.Minutes;
			pstTime->u8Seconds = stTime.Seconds;
			
		}
		break;	
		case E_RTC_IOCTL_CMD_WRITE_TIME:
		{
			S_RtcIoctlWrite *pstTime = (S_RtcIoctlWrite *)pvData;

			RTC_DateTypeDef stDate;
			RTC_TimeTypeDef stTime;

			stDate.Year = pstTime->u8Year;
			stDate.Month = pstTime->u8Month;
			stDate.Date = pstTime->u8Date;
			stDate.WeekDay = 0x01; //这个参数要设置下 避免不在 1-7的范围里面
			
			stTime.Hours = pstTime->u8Hours;
			stTime.Minutes = pstTime->u8Minutes;
			stTime.Seconds = pstTime->u8Seconds;
			stTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;  //这个参数要设置下
			stTime.StoreOperation = RTC_STOREOPERATION_RESET; //这个参数要设置下
			
			HAL_RTC_SetTime(&RtcHandle, &stTime, RTC_FORMAT_BCD);
			HAL_RTC_SetDate(&RtcHandle, &stDate, RTC_FORMAT_BCD);
			
		}
		break;	

		
	}

	return RET_SUCCESS;
}

 

2、休眠启动

         外设休眠后,启动时重新配置下

 

3、STM32F0系列   二级引导注意事项

            STM32F0系列是M0的内核,没有VTOR的寄存器,所以在应用程序里面的配置还有些不一样

        1)引导程序的KEIL配置

 

      2)引导程序代码

          

/*********************************************
* @Îļþ: main.c
* @×÷Õß: cjx
* @°æ±¾: v1.0.0
* @ʱ¼ä: 2018-06-22
* @µç»°: 18770053277
* @¸ÅÒª:

*********************************************/

#include "ioctrl.h"

//Soft Update Explain
#define BOOT_SOFT_ADDR		0x08000000
#define APP_RUN_ADDR		0x08004000 
#define FACTORY_BIN_ADDR	0x0800E800 
#define VER_INFO_ADDR		0x0801B000 
#define USER_INFO_ADDR		0x0801B800  
#define EXT_APP_BIN_ADDR	0x00002000 

#define APP_BIN_SIZE		(50*1024)

#define FACTORY_VER			1

#define VER_FLAG_NULL		0
#define VER_FLAG_FACTORY	1
#define VER_FLAG_EXT		2

typedef struct{
	T_U32 u32Ver;
	T_U32 u32Flag; 
}S_VerInfo;

S_VerInfo g_VerInfo;
S_FlashRead g_FlashRead;
S_FlashWrite g_FlashWrite;
S_FlashErase g_FlashErase;
S_ExtFlashRead g_ExtFlashRead;
S_ExtFlashWrite g_ExtFlashWrite;
S_ExtFlashErase g_ExtFlashErase;
T_U8 g_u8Cache[2*1024];

void UpdateFromFactory(void)
{
	T_U32 u32i = 0;
	
	//g_FlashErase.u32Addr = APP_RUN_ADDR;
	//g_FlashErase.u32Pages = 18;//APP_BIN_SIZE/FLASH_PAGE_SIZE;
	//DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);

	print_msg("\nErase_Okay!\n");
	
	for(u32i = 0; u32i < (36*1024); u32i += sizeof(g_u8Cache))
	{
		g_FlashRead.u32Addr = FACTORY_BIN_ADDR + u32i;
		g_FlashRead.pu8Data = (T_U8 *)g_u8Cache;
		g_FlashRead.u32Len = sizeof(g_u8Cache);
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead);
		
		g_FlashErase.u32Addr = APP_RUN_ADDR + u32i;;
		g_FlashErase.u32Pages = 1;
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);
		
		g_FlashWrite.u32Addr = APP_RUN_ADDR + u32i;
		g_FlashWrite.pu8Data = (T_U8 *)&g_u8Cache;
		g_FlashWrite.u32Len = sizeof(g_u8Cache);
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
	}
	
	print_msg("\nCopy_Factory_Okay!\n");
	
	g_FlashErase.u32Addr = VER_INFO_ADDR;
	g_FlashErase.u32Pages = 1;
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);
	
	g_VerInfo.u32Ver = FACTORY_VER;
	g_VerInfo.u32Flag = VER_FLAG_NULL;
	
	g_FlashWrite.u32Addr = VER_INFO_ADDR;
	g_FlashWrite.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashWrite.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
	
	print_msg("\nVer_Info_Write_Okay!\n");
}
void UpdateFromExtFlash(void)
{
	T_U32 u32i = 0;
	
	g_FlashErase.u32Addr = APP_RUN_ADDR;
	g_FlashErase.u32Pages = APP_BIN_SIZE/FLASH_PAGE_SIZE;
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashWrite);
	
	for(u32i = 0; u32i < APP_BIN_SIZE; u32i += sizeof(g_u8Cache))
	{
		g_ExtFlashRead.u32Addr = EXT_APP_BIN_ADDR + u32i;
		g_ExtFlashRead.pu8Data = (T_U8 *)g_u8Cache;
		g_ExtFlashRead.u32Len = sizeof(g_u8Cache);
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_ExtFlashRead);
		
		g_FlashWrite.u32Addr = APP_RUN_ADDR + u32i;
		g_FlashWrite.pu8Data = (T_U8 *)&g_u8Cache;
		g_FlashWrite.u32Len = sizeof(g_u8Cache);
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
	}
	
	g_FlashRead.u32Addr = VER_INFO_ADDR;
	g_FlashRead.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashRead.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead);
	
	//g_VerInfo.u32Ver = FACTORY_VER;
	g_VerInfo.u32Flag = VER_FLAG_NULL;
	
	g_FlashWrite.u32Addr = VER_INFO_ADDR;
	g_FlashWrite.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashWrite.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
}

typedef  void (*pFunction)(void);	
void Jump_Address(void)
{
	if (((*(volatile u32*)APP_RUN_ADDR) & 0x2FFE0000 ) == 0x20000000)
	{
		T_U32 test,JumpAddress;
		pFunction Jump_To_Application;
		
		test = (*(volatile u32*)APP_RUN_ADDR);
		JumpAddress = *(volatile u32*) (APP_RUN_ADDR + 4);
		Jump_To_Application = (pFunction) JumpAddress;
		
		print_msg("\nGoto_App!=0x%4x\n", JumpAddress);
		
		__set_MSP(*(volatile u32*) APP_RUN_ADDR);
		Jump_To_Application();
		print_msg("\nNULL\n");
	}
}
int main(void)
{
	DRIVER_SYS_Open();
	DRIVER_FLASH_Open();
	DRIVER_EXTFLASH_Open();
	DRIVER_SYS_EnableInterrupt();
	//while(1);
	T_U32 u32Delay = 1000000;
	while(u32Delay--);
	
	g_FlashRead.u32Addr = VER_INFO_ADDR;
	g_FlashRead.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashRead.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead);
	
	print_msg("\nBoot_Start!\n");

	if(100 == g_VerInfo.u32Flag){
		
	}else if(VER_FLAG_FACTORY == g_VerInfo.u32Flag){
		UpdateFromFactory();
	}else if(VER_FLAG_EXT == g_VerInfo.u32Flag){
		UpdateFromExtFlash();
	}else{
		UpdateFromFactory();
	}
	
	Jump_Address();
	
	while(1);
	
	return 0;
}

3)应用程序的配置

这里机的把RAM编译的起始地址也改下,预留前面一段用来存中断向量地址

4)应用程序代码

/*********************************************
* @Îļþ: main.c
* @×÷Õß: cjx
* @°æ±¾: v1.0.0
* @ʱ¼ä: 2018-06-22
* @µç»°: 18770053277
* @¸ÅÒª:

*********************************************/

#include "apll.h"
#include "ioctrl.h"

int main(void)
{	
	memcpy((uint32_t*)0x20000000, (uint32_t*)0x08004000, 48*4);
	RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
	
	uint32_t tmpctrl;
	
	tmpctrl = SYSCFG->CFGR1;
	tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);
	tmpctrl |= (uint32_t) 0x03;
	SYSCFG->CFGR1 |= tmpctrl;
	
	T_VOID *pvAllHandle = T_NULL;
	
	if(RET_SUCCESS != ALL_Init(&pvAllHandle))
	{	
		return -1;
	}
	
	ALL_Run(pvAllHandle);

	ALL_DeInit(pvAllHandle);
}

5)Keil生成bin

          方法

          fromelf.exe --bin -o "$L@L.bin" "#L"

          

6)bin合并工具

         链接工具

7)合并

 

4、基于xmodem协议的串口升级代码

         1)main.c

  

*********************************************
* @文件: main.c
* @作者: cjx
* @版本: v1.0.0
* @时间: 2018-06-22
* @电话: 18770053277
* @概要:

*********************************************/
#include "ioctrl.h"
#include "xmodem.h"

//Soft Update Explain
#define BOOT_RUN_ADDR		0x08000000 //引导代码地址
#define APP_RUN_ADDR		0x08002800 //程序运行地址
#define OTA_STORE_ADDR		0x0800D800 //升级固件存储地址
#define VER_INFO_ADDR		0x0801B000 //信息存储地址

#define APP_BIN_SIZE		(44*1024)

#define VER_INFO_RENEW_FLG		0xF4F3F2F1
#define VER_INFO_NO_RENEW_FLG	0xF1F2F3F4

typedef struct{
	T_U32 u32Flg; //VER_INFO_FLG
	T_U32 u32Ver;
	T_U32 u32Addr; 
}S_VerInfo;

S_VerInfo g_VerInfo;
S_FlashRead g_FlashRead;
S_FlashWrite g_FlashWrite;
S_FlashErase g_FlashErase;

T_U8 g_u8Cache[FALSH_BLOCK_SIZE];

typedef  void (*pFunction)(void);	
void Jump_Address(unsigned int addr)
{
	if (((*(volatile u32*)addr) & 0x2FFE0000 ) == 0x20000000)
	{
		unsigned int JumpAddress;
		
		pFunction Jump_To_Application;
		
		JumpAddress = *(volatile T_U32 *) (addr + 4);
		Jump_To_Application = (pFunction) JumpAddress;
		
		printf("\r\nGoto App=0x%4x!\r\n", (unsigned int)JumpAddress);
		
		__set_MSP(*(volatile u32*) addr);
		Jump_To_Application();
		printf("\r\nGoto App Fail!\r\n");
	}
}
void UpdateVerInfo(T_U32 u32Flg, T_U32 u32Ver)
{
	g_FlashErase.u32Addr = VER_INFO_ADDR;
	g_FlashErase.u32Pages = 1;
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);
	
	g_VerInfo.u32Ver = u32Ver;
	g_VerInfo.u32Flg = u32Flg;
	g_VerInfo.u32Addr = APP_RUN_ADDR;
	
	g_FlashWrite.u32Addr = VER_INFO_ADDR;
	g_FlashWrite.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashWrite.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
}
void UpdateFromOTA(void)
{
	T_U32 u32i = 0;
	
	//g_FlashErase.u32Addr = APP_RUN_ADDR;
	//g_FlashErase.u32Pages = (APP_BIN_SIZE/FALSH_BLOCK_SIZE);
	//DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);

	//print_msg("\nErase_Okay!\n");
	
	for(u32i = 0; u32i < APP_BIN_SIZE; u32i += FALSH_BLOCK_SIZE)
	{
		g_FlashRead.u32Addr = OTA_STORE_ADDR + u32i;
		g_FlashRead.pu8Data = (T_U8 *)g_u8Cache;
		g_FlashRead.u32Len = FALSH_BLOCK_SIZE;
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead);
		
		g_FlashErase.u32Addr = APP_RUN_ADDR + u32i;
		g_FlashErase.u32Pages = 1;
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);
		
		g_FlashWrite.u32Addr = APP_RUN_ADDR + u32i;
		g_FlashWrite.pu8Data = (T_U8 *)&g_u8Cache;
		g_FlashWrite.u32Len = FALSH_BLOCK_SIZE;
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite);
	}
	
	printf("\r\nCopy OTA Okay!\r\n");
	
	UpdateVerInfo(VER_INFO_NO_RENEW_FLG, 1);
	
	printf("\r\nVer Info Write Okay!\r\n");
}
void EraseOTA(void)
{
	T_U32 u32i = 0;
	
	for(u32i = 0; u32i < APP_BIN_SIZE; u32i += FALSH_BLOCK_SIZE)
	{
		g_FlashErase.u32Addr = OTA_STORE_ADDR + u32i;
		g_FlashErase.u32Pages = 1;
		DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase);
	}
}
int main(void)
{
	char RxData;
	char RxBuf[10];
	unsigned char RxCnt = 0;
	
	unsigned int nowTick = 0, oldTick = 0;
	
	DRIVER_SYS_Open();
	DRIVER_FLASH_Open();
	DRIVER_UART_Open();
	DRIVER_SYS_EnableInterrupt();
	
	printf("\r\nBOOT RUN ADDR=0x%4x!\r\n", (unsigned int)BOOT_RUN_ADDR);
	printf("\r\nAPP RUN ADDR=0x%4x!\r\n", (unsigned int)APP_RUN_ADDR);
	printf("\r\nOTA STORE ADDR=0x%4x!\r\n", (unsigned int)OTA_STORE_ADDR);
	printf("\r\nVER INFO ADDR=0x%4x!\r\n", (unsigned int)VER_INFO_ADDR);
	
	printf("\r\nPlease Input 666 Into Update, Wait 3S!\r\n");
	
	oldTick = HAL_GetTick();
	while(1)
	{
		if(UART_RevByteNoClog((unsigned char*)&RxData))
		{
			RxBuf[RxCnt++] = RxData;
			if(RxCnt >= 3)
			{
				if(0 == memcmp(RxBuf, "666", 3))
				{
					EraseOTA();
					printf("\r\nInto Update!\r\n");
					if(1 == xmodem(OTA_STORE_ADDR, OTA_STORE_ADDR+APP_BIN_SIZE))
					{
						UpdateVerInfo(VER_INFO_RENEW_FLG, 1);
					}
					
					break;
				}
			}
		}
		
		nowTick = HAL_GetTick();
		
		if(nowTick > oldTick + 3000)
		{
			break;
		}
	}
	
	
	
	g_FlashRead.u32Addr = VER_INFO_ADDR;
	g_FlashRead.pu8Data = (T_U8 *)&g_VerInfo;
	g_FlashRead.u32Len = sizeof(g_VerInfo);
	DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead);
	
	if(VER_INFO_RENEW_FLG == g_VerInfo.u32Flg)
	{
		UpdateFromOTA();
		Jump_Address(APP_RUN_ADDR);
	}else if(VER_INFO_NO_RENEW_FLG == g_VerInfo.u32Flg)
	{
		Jump_Address(APP_RUN_ADDR);
	}
	
	printf("\r\nNo App!\r\n");
	
	//while(1);
	
	return 0;
}

2) xmodem.c

#include <stdio.h>
#include "ioctrl.h"
#include "xmodem.h"

#define xputc(data)		UART_SendByte(data)
#define xgetc()			UART_RevByte()
#define xkbhit(data)	UART_RevByteNoClog(data)

static unsigned int gRawBuf[2][sizeof(XMODEM_PACKET_TYPE)>>2];

static unsigned short CRC16E(unsigned char *lpBuf, unsigned short n)
{
    unsigned short crc = 0x0;
    unsigned short i;

    for (i = 0; i < n; i++)
    {
        crc  = (crc >> 8) | (crc << 8);
        crc ^= lpBuf[i];
        crc ^= (crc & 0xff) >> 4;
        crc ^= crc << 12;
        crc ^= (crc & 0xff) << 5;
    }
	
    return crc;
}

static short XMODEM_Verify(XMODEM_PACKET_TYPE *Struct, unsigned char Reference)
{
    if (Struct->Number == Reference)
    {
        unsigned short crc = (Struct->CRCH<<8)|Struct->CRCL;

        if(crc == CRC16E(Struct->Data, XMODEM_DATA_SIZE))
        {
            return 0;
        }
    }

    return -1;
}

static unsigned char XMODEM_Wait(void)
{
	unsigned char firstData;
    unsigned int i;

    while (1)
    {
        xputc(XMODEM_NCG);
        for (i = 0; i < 100000; i++)
        {
            if(xkbhit(&firstData))
            {
                return firstData; 
            }
        }
    }
	
	return 0;
}

int xmodem(unsigned int Base, unsigned int End)
{
    XMODEM_PACKET_TYPE *Struct;
    unsigned int Addr, i;
    unsigned char Sequence = 1;
	unsigned char Flag = 0;
    unsigned char waitReturn = 0;
	
    Addr = Base;
	waitReturn = XMODEM_Wait();
    while (1)
    {
        // Swap buffer for packet buffer.
        Struct = (XMODEM_PACKET_TYPE *)gRawBuf[Sequence & 1];

        // Fetch the first byte of the packet explicitly, as it defines the
        // rest of the packet.
		if(Flag)
		{
			Struct->Header = xgetc();
		}else
		{
			Struct->Header = waitReturn;
		}
		Flag = 1;
		
        // Check for end of transfer.
        if (Struct->Header == XMODEM_EOT)
        {
            // Acknowledget End of transfer.
            xputc(XMODEM_ACK);

			return 1;
        }

        // If the header is not a start of header (SOH), then cancel
        // the transfer.
        if (Struct->Header != XMODEM_SOH)
        {
            return -1;
        }

        // Fill the remaining bytes packet.
        // Byte 0 is padding, byte 1 is header.
        for (i = 2; i < sizeof(XMODEM_PACKET_TYPE); i++)
        {
            ((unsigned char *)Struct)[i] = xgetc();
        }

        /* Packet Verify */
        if(0 != XMODEM_Verify(Struct, Sequence))
        {
            // On a malformed packet, we send a NAK, and start over.
            xputc(XMODEM_NAK);
            return -1;
        }
        Sequence++;

        // Write data to flash.
        if(Addr < End)
        {
            //BSP_FlashWrite(Addr, Struct->Data, XMODEM_DATA_SIZE);
            //memset(Struct->Data, 0x11, XMODEM_DATA_SIZE);
            S_FlashWrite stFlashWrite;
			
			stFlashWrite.u32Addr = Addr;
			stFlashWrite.pu8Data = Struct->Data;
			stFlashWrite.u32Len = XMODEM_DATA_SIZE;
			if(RET_FAILED==DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, &stFlashWrite))
			{
				return -1;
			}
            Addr += XMODEM_DATA_SIZE;
        }

        // Send ACK.
        xputc(XMODEM_ACK);
    }
}

3)driverFlash.c

/*********************************************
* @文件: driverFlash.c
* @作者: cjx
* @版本: v1.0.1
* @时间: 2018-11-09
* @概要: Flash驱动
*********************************************/
#include "baseType.h"
#include "ioctrl.h"

#if(FLASH_TYPE == E_FLASH_TYPE_STM32)

T_VOID Flash_Delay(T_VOID)
{
	T_U32 u32Delay = 100000;
	
	while(u32Delay--);
}
T_VOID Flash_Init(T_VOID)
{
	

}

T_VOID Flash_Read(S_FlashRead *pst)
{
	T_U32 u32i = 0;

	for(u32i = 0; u32i < pst->u32Len; u32i++)
	{
		pst->pu8Data[u32i] = *(T_U8 *)(pst->u32Addr + u32i);
	}
}
T_VOID Flash_Erase(S_FlashErase *pst)
{
	T_U32 PageError = 0;
	FLASH_EraseInitTypeDef EraseInitStruct;
	
	EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.PageAddress = pst->u32Addr;
	EraseInitStruct.NbPages = pst->u32Pages;

	DRIVER_SYS_DisableInterrupt();
	
	HAL_FLASH_Unlock();
	if (HAL_FLASHEx_Erase(&EraseInitStruct, (uint32_t *)&PageError) != HAL_OK)
	{
		print_msg("\nerase_error!\n");
	}
	HAL_FLASH_Lock();
	
	DRIVER_SYS_EnableInterrupt();
}
T_VOID Flash_Write(S_FlashWrite *pst)
{
	T_U32 u32i = 0;
	T_U32 *pu32WriteData = T_NULL;
	
	DRIVER_SYS_DisableInterrupt();
	
	HAL_FLASH_Unlock();
	for(u32i = 0; u32i < pst->u32Len; u32i+=4)
	{
		pu32WriteData = (T_U32 *)&pst->pu8Data[u32i];
		
		if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, pst->u32Addr+u32i, *pu32WriteData) != HAL_OK)
		{
			print_msg("\nwrite_error!\n");
		}
	}
	HAL_FLASH_Lock();
	
	DRIVER_SYS_EnableInterrupt();
	
#if 0
	T_U32 u32i = 0;
	T_U32 *pu32WriteData = T_NULL;
	T_U32 PageError = 0;
	FLASH_EraseInitTypeDef EraseInitStruct;
	
	EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.PageAddress = pst->u32Addr;
	EraseInitStruct.NbPages = 1+(pst->u32Len / FLASH_PAGE_SIZE);

	DRIVER_SYS_DisableInterrupt();
	
	HAL_FLASH_Unlock();
	if (HAL_FLASHEx_Erase(&EraseInitStruct, (uint32_t *)&PageError) != HAL_OK)
	{
		print_msg("\nerase_error!\n");
	}
	
	for(u32i = 0; u32i < pst->u32Len; u32i+=4)
	{
		pu32WriteData = (T_U32 *)&pst->pu8Data[u32i];
		
		if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, pst->u32Addr+u32i, *pu32WriteData) != HAL_OK)
		{
			print_msg("\nwrite_error!\n");
		}
	}
	HAL_FLASH_Lock();
	
    DRIVER_SYS_EnableInterrupt();
#endif	
	
}

#endif

/********************************************
 *功能:打开函数
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 注意:
*********************************************/
T_S32 DRIVER_FLASH_Open(T_VOID)
{
	Flash_Init();
	
	return RET_SUCCESS;
}
/********************************************
 *功能:读取函数
 *输入:输出数据 及 数据长度
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 		或者长度
 注意:
*********************************************/
T_S32 DRIVER_FLASH_Read(T_S8 *ps8DataBuf, T_S32 s32BufLen)
{

	T_S32 s32DataLen = 0;
	
	
	
	return s32DataLen;
}
/********************************************
 *功能:事件标志
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 注意:
*********************************************/
T_S32 DRIVER_FLASH_Pop(T_VOID)
{

	return RET_SUCCESS;
}


/********************************************
 *功能:控制接口
 *输入:s32Cmd :命令类型
 			pvData:控制数据或者返回
 					数据
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
*********************************************/
T_S32 DRIVER_FLASH_Ioctl(T_S32 s32Cmd, T_VOID *pvData)
{
	T_S32 s32Ret = RET_SUCCESS;
	
	switch(s32Cmd)
	{
		case E_FLASH_IOCTL_CMD_ERASE:
		{
			Flash_Erase((S_FlashErase *)pvData);
		}
		break;

		case E_FLASH_IOCTL_CMD_WRITE:
		{			
			Flash_Write((S_FlashWrite *)pvData);
		}
		break;

		case E_FLASH_IOCTL_CMD_READ:
		{
			Flash_Read((S_FlashRead *)pvData);
		}
		break;
		
	}

	return s32Ret;
}

/********************************************
 *功能:写入函数
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 		或者长度
 注意:
*********************************************/
T_S32 DRIVER_FLASH_Write(T_S8 *ps8DataBuf, T_S32 s32BufLen)
{
	
	return s32BufLen;
}

4)driverUart.c

/*********************************************
* @文件: driverUart.c
* @作者: cjx
* @版本: v1.0.1
* @时间: 2020-0103-09
* @概要: Uart驱动
*********************************************/
#include "baseType.h"
#include "ioctrl.h"

#define UART_TX_PORT		GPIOA
#define UART_TX_PIN			GPIO_PIN_0
#define UART_RX_PORT		GPIOA
#define UART_RX_PIN			GPIO_PIN_1

#define UART_BAUD_RATE		115200

UART_HandleTypeDef g_UartHandle;
T_U8 g_u8UartRx = 0;

void UART_SendByte(unsigned char data)
{
	unsigned char  buf[1];
	
	buf[0] = data;
	HAL_UART_Transmit(&g_UartHandle, buf, 1, 5000);
}
unsigned char UART_RevByte(void)
{
	unsigned char  buf[1];
	
	while(HAL_OK != HAL_UART_Receive(&g_UartHandle, buf, 1, 10000))
	{
	}
	
	return buf[0];
}
unsigned char UART_RevStatus(void)
{
	unsigned char  buf[1];
	
	if(HAL_OK == HAL_UART_Receive(&g_UartHandle, buf, 1, 10))
	{
		return 1;
	}
	
	return 0;
}
unsigned char UART_RevByteNoClog(unsigned char *Rx)
{
	unsigned char  buf[1];
	
	if(HAL_OK == HAL_UART_Receive(&g_UartHandle, buf, 1, 0))
	{
		*Rx = buf[0];
		return 1;
	}
	
	return 0;
}
int fputc(int ch, FILE *f)
{
	unsigned char p[1];

	p[0] = ch;
	HAL_UART_Transmit(&g_UartHandle, (uint8_t*)p, 1, 5000);
	
	return (ch);
}
T_VOID UART_Init(T_VOID)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull      = GPIO_PULLUP;
	GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF4_USART4;
	
	GPIO_InitStruct.Pin = UART_TX_PIN;
	HAL_GPIO_Init(UART_TX_PORT, &GPIO_InitStruct);
	GPIO_InitStruct.Pin = UART_RX_PIN;
	HAL_GPIO_Init(UART_RX_PORT, &GPIO_InitStruct);
  
	
	g_UartHandle.Instance        = USART4;

	g_UartHandle.Init.BaudRate   = UART_BAUD_RATE;
	g_UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
	g_UartHandle.Init.StopBits   = UART_STOPBITS_1;
	g_UartHandle.Init.Parity     = UART_PARITY_NONE;
	g_UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
	g_UartHandle.Init.Mode       = UART_MODE_TX_RX;
	g_UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
	if(HAL_UART_DeInit(&g_UartHandle) != HAL_OK)
	{
		Error_Handler();
	}  
	if(HAL_UART_Init(&g_UartHandle) != HAL_OK)
	{
		Error_Handler();
	}
}

/********************************************
 *功能:打开函数
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 注意:
*********************************************/
T_S32 DRIVER_UART_Open(T_VOID)
{
	UART_Init();
	
	return RET_SUCCESS;
}
/********************************************
 *功能:读取函数
 *输入:输出数据 及 数据长度
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 		或者长度
 注意:
*********************************************/
T_S32 DRIVER_UART_Read(T_S8 *ps8DataBuf, T_S32 s32BufLen)
{

	T_S32 s32DataLen = 0;
	
	return s32DataLen;
}
/********************************************
 *功能:事件标志
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 注意:
*********************************************/
T_S32 DRIVER_UART_Pop(T_VOID)
{

	return RET_SUCCESS;
}


/********************************************
 *功能:控制接口
 *输入:s32Cmd :命令类型
 			pvData:控制数据或者返回
 					数据
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
*********************************************/
T_S32 DRIVER_UART_Ioctl(T_S32 s32Cmd, T_VOID *pvData)
{
	T_S32 s32Ret = RET_SUCCESS;
	
	switch(s32Cmd)
	{
		
	}

	return s32Ret;
}

/********************************************
 *功能:写入函数
 *输入:无
 *输出:无
 *条件:无
 *返回:成功:RET_SUCCESS 
 		失败:RET_FAILED 
 		或者长度
 注意:
*********************************************/
T_S32 DRIVER_UART_Write(T_S8 *ps8DataBuf, T_S32 s32BufLen)
{
	
	return s32BufLen;
}

5)升级工具

     Tera Term

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值