基于 STM32 的电动车控制器软件源代码.docx

上传人:b****3 文档编号:27481260 上传时间:2023-07-02 格式:DOCX 页数:47 大小:25.37KB
下载 相关 举报
基于 STM32 的电动车控制器软件源代码.docx_第1页
第1页 / 共47页
基于 STM32 的电动车控制器软件源代码.docx_第2页
第2页 / 共47页
基于 STM32 的电动车控制器软件源代码.docx_第3页
第3页 / 共47页
基于 STM32 的电动车控制器软件源代码.docx_第4页
第4页 / 共47页
基于 STM32 的电动车控制器软件源代码.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

基于 STM32 的电动车控制器软件源代码.docx

《基于 STM32 的电动车控制器软件源代码.docx》由会员分享,可在线阅读,更多相关《基于 STM32 的电动车控制器软件源代码.docx(47页珍藏版)》请在冰豆网上搜索。

基于 STM32 的电动车控制器软件源代码.docx

基于STM32的电动车控制器软件源代码

/*包含头文件----------------------------------------------------------------*/

#include"stm32f1xx_hal.h"

#include"led/bsp_led.h"

#include"usart/bsp_usartx.h"

#include"spiflash/bsp_spiflash.h"

#include"string.h"

#include"key/bsp_key.h"

/*私有类型定义--------------------------------------------------------------*/

/*私有宏定义----------------------------------------------------------------*/

/*私有变量------------------------------------------------------------------*/

uint8_taRxBuffer[FLASH_SECTOR_SIZE*2];

__IOuint32_tDeviceID=0;

__IOuint32_tFlashID=0;

__IOuint8_twrite_finish=0;

/*扩展变量------------------------------------------------------------------*/

/*私有函数原形--------------------------------------------------------------*/

voidSystemClock_Config(void);

/*函数体--------------------------------------------------------------------*/

/**

*函数功能:

主函数.

*输入参数:

*返回值:

*说明:

*/

intmain(void)

{

uint8_tj;

/*复位所有外设,初始化Flash接口和系统滴答定时器*/

HAL_Init();

/*配置系统时钟*/

SystemClock_Config();

KEY_GPIO_Init();

/*LED灯初始化*/

LED_GPIO_Init();

/*初始化串口并配置串口中断优先级*/

MX_USARTx_Init();

/*调用格式化输出函数打印输出数据*/

printf("这是一个4Mbyte串行flash(W25Q32)读写测试实验\r\n");

printf("步骤:

1.打开sscom串口调试助手并且配置好参数\r\n");

printf("2.按下KEY1开始擦除串行flash扇区空间,并且必须等待擦除完成\r\n");

printf("3.点击sscom串口调试助手发送烧写字库文件\r\n");

printf("4.漫长的等待烧写完成过程\r\n");

printf("5.烧写完成后按下KEY2读取验证\r\n");

MX_SPIFlash_Init();

DeviceID=SPI_FLASH_ReadDeviceID();

HAL_Delay(100);

FlashID=SPI_FLASH_ReadID();

/*ChecktheSPIFlashID*/

if(FlashID==SPI_FLASH_ID)/*#definesFLASH_ID0XEF4018*/

{

printf("检测到华邦串行flashW25Q32!

\n");

}

else

{

while

(1)

{

printf("获取不到W25Q32ID!

\n");

LED1_TOGGLE;

HAL_Delay(1000);

}

}

while(KEY1_StateRead()==KEY_UP);

while(KEY1_StateRead()==KEY_DOWN);

printf("开始擦除FLASH\n");

for(j=0;j

{

SPI_FLASH_SectorErase(FLASH_UNIGBK_ADDR+j*FLASH_SECTOR_SIZE);

}

printf("擦除扇区完成\r\n");

/*使用DMA传输数据到电脑端*/

__HAL_UART_CLEAR_IDLEFLAG(&husartx);

__HAL_UART_ENABLE_IT(&husartx,UART_IT_IDLE);

HAL_UART_Receive_DMA(&husartx,aRxBuffer,FLASH_SECTOR_SIZE*2);

//write_finish=1;

/*无限循环*/

while

(1)

{

if(write_finish)

{

__HAL_UART_DISABLE_IT(&husartx,UART_IT_IDLE);

printf("字库烧写完成,按下KEY2读取验证\r\n");

while(KEY2_StateRead()==KEY_UP);

while(KEY2_StateRead()==KEY_DOWN);

for(j=0;j

{

SPI_FLASH_BufferRead(aRxBuffer,FLASH_UNIGBK_ADDR+j*FLASH_SECTOR_SIZE,10);

printf("%04x-%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",j*FLASH_SECTOR_SIZE,\

aRxBuffer[0],aRxBuffer[1],aRxBuffer[2],aRxBuffer[3],aRxBuffer[4],\

aRxBuffer[5],aRxBuffer[6],aRxBuffer[7],aRxBuffer[8],aRxBuffer[9]);

HAL_Delay(100);

}

write_finish=0;

LED1_OFF;

LED2_OFF;

while

(1)

{

LED1_TOGGLE;

LED2_TOGGLE;

HAL_Delay(1000);

}

}

}

}

/**

*函数功能:

系统时钟配置

*输入参数:

*返回值:

*说明:

*/

voidSystemClock_Config(void)

{

RCC_OscInitTypeDefRCC_OscInitStruct;

RCC_ClkInitTypeDefRCC_ClkInitStruct;

RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;//外部晶振,8MHz

RCC_OscInitStruct.HSEState=RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue=RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL=RCC_PLL_MUL9;//9倍频,得到72MHz主时钟

HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//系统时钟:

72MHz

RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB时钟:

72MHz

RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;//APB1时钟:

36MHz

RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;//APB2时钟:

72MHz

HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2);

//HAL_RCC_GetHCLKFreq()/10001ms中断一次

//HAL_RCC_GetHCLKFreq()/10000010us中断一次

//HAL_RCC_GetHCLKFreq()/10000001us中断一次

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);//配置并启动系统滴答定时器

/*系统滴答定时器时钟源*/

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/*系统滴答定时器中断优先级配置*/

HAL_NVIC_SetPriority(SysTick_IRQn,2,0);

}

#include"stm32f1xx_hal.h"

/*USERCODEBEGIN0*/

/*USERCODEEND0*/

/**

*InitializestheGlobalMSP.

*/

voidHAL_MspInit(void)

{

/*USERCODEBEGINMspInit0*/

/*USERCODEENDMspInit0*/

__HAL_RCC_AFIO_CLK_ENABLE();

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);

/*Systeminterruptinit*/

/*MemoryManagement_IRQninterruptconfiguration*/

HAL_NVIC_SetPriority(MemoryManagement_IRQn,0,0);

/*BusFault_IRQninterruptconfiguration*/

HAL_NVIC_SetPriority(BusFault_IRQn,0,0);

/*UsageFault_IRQninterruptconfiguration*/

HAL_NVIC_SetPriority(UsageFault_IRQn,0,0);

/*DebugMonitor_IRQninterruptconfiguration*/

HAL_NVIC_SetPriority(DebugMonitor_IRQn,0,0);

/*SysTick_IRQninterruptconfiguration*/

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

/*USERCODEBEGINMspInit1*/

/*USERCODEENDMspInit1*/

}

/*USERCODEBEGIN1*/

/*USERCODEEND1*/

/**

*@}

*/

/**

*@}

*/

/*Includes------------------------------------------------------------------*/

#include"stm32f1xx_hal.h"

#include"stm32f1xx.h"

#include"stm32f1xx_it.h"

#include"usart/bsp_usartx.h"

#include"led/bsp_led.h"

/*USERCODEBEGIN0*/

#include"spiflash/bsp_spiflash.h"

/*USERCODEEND0*/

/*Externalvariables--------------------------------------------------------*/

#defineUNIGBK_FILE_SIZE174344

uint8_tWrite_Sector_Count=0;

externuint8_taRxBuffer[FLASH_SECTOR_SIZE*2];

extern__IOuint8_twrite_finish;

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

/*Cortex-M3ProcessorInterruptionandExceptionHandlers*/

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

/**

*@briefThisfunctionhandlesNonmaskableinterrupt.

*/

voidNMI_Handler(void)

{

/*USERCODEBEGINNonMaskableInt_IRQn0*/

/*USERCODEENDNonMaskableInt_IRQn0*/

/*USERCODEBEGINNonMaskableInt_IRQn1*/

/*USERCODEENDNonMaskableInt_IRQn1*/

}

/**

*@briefThisfunctionhandlesHardfaultinterrupt.

*/

voidHardFault_Handler(void)

{

/*USERCODEBEGINHardFault_IRQn0*/

/*USERCODEENDHardFault_IRQn0*/

while

(1)

{

}

/*USERCODEBEGINHardFault_IRQn1*/

/*USERCODEENDHardFault_IRQn1*/

}

/**

*@briefThisfunctionhandlesMemorymanagementfault.

*/

voidMemManage_Handler(void)

{

/*USERCODEBEGINMemoryManagement_IRQn0*/

/*USERCODEENDMemoryManagement_IRQn0*/

while

(1)

{

}

/*USERCODEBEGINMemoryManagement_IRQn1*/

/*USERCODEENDMemoryManagement_IRQn1*/

}

/**

*@briefThisfunctionhandlesPrefetchfault,memoryaccessfault.

*/

voidBusFault_Handler(void)

{

/*USERCODEBEGINBusFault_IRQn0*/

/*USERCODEENDBusFault_IRQn0*/

while

(1)

{

}

/*USERCODEBEGINBusFault_IRQn1*/

/*USERCODEENDBusFault_IRQn1*/

}

/**

*@briefThisfunctionhandlesUndefinedinstructionorillegalstate.

*/

voidUsageFault_Handler(void)

{

/*USERCODEBEGINUsageFault_IRQn0*/

/*USERCODEENDUsageFault_IRQn0*/

while

(1)

{

}

/*USERCODEBEGINUsageFault_IRQn1*/

/*USERCODEENDUsageFault_IRQn1*/

}

/**

*@briefThisfunctionhandlesDebugmonitor.

*/

voidDebugMon_Handler(void)

{

/*USERCODEBEGINDebugMonitor_IRQn0*/

/*USERCODEENDDebugMonitor_IRQn0*/

while

(1)

{

}

/*USERCODEBEGINDebugMonitor_IRQn1*/

/*USERCODEENDDebugMonitor_IRQn1*/

}

/**

*@briefThisfunctionhandlesSystemticktimer.

*/

voidSysTick_Handler(void)

{

/*USERCODEBEGINSysTick_IRQn0*/

/*USERCODEENDSysTick_IRQn0*/

HAL_IncTick();

HAL_SYSTICK_IRQHandler();

/*USERCODEBEGINSysTick_IRQn1*/

/*USERCODEENDSysTick_IRQn1*/

}

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

/*STM32F1xxPeripheralInterruptHandlers*/

/*AddheretheInterruptHandlersfortheusedperipherals.*/

/*Fortheavailableperipheralinterrupthandlernames,*/

/*pleaserefertothestartupfile(startup_stm32f1xx.s).*/

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

/*USERCODEBEGIN1*/

voidUSARTx_IRQHANDLER(void)

{

/*USERCODEBEGINUSART1_IRQn0*/

/*USERCODEENDUSART1_IRQn0*/

//HAL_UART_IRQHandler(&husartx);

/*USERCODEBEGINUSART1_IRQn1*/

if(__HAL_UART_GET_IT_SOURCE(&husartx,USART_IT_IDLE)!

=RESET)

{

if(Write_Sector_Count)

{

LED2_ON;

if(Write_Sector_Count%2)

{

LED1_OFF;

SPI_FLASH_BufferWrite(&aRxBuffer[FLASH_SECTOR_SIZE],FLASH_UNIGBK_ADDR+Write_Sector_Count*FLASH_SECTOR_SIZE,UNIGBK_FILE_SIZE-Write_Sector_Count*FLASH_SECTOR_SIZE);

}

else

{

LED1_ON;

SPI_FLASH_BufferWrite(aRxBuffer,FLASH_UNIGBK_ADDR+Write_Sector_Count*FLASH_SECTOR_SIZE,UNIGBK_FILE_SIZE-Write_Sector_Count*FLASH_SECTOR_SIZE);

}

printf("NumberSector:

%d\r\n",Write_Sector_Count);

HAL_UART_DMAStop(&husartx);

write_finish=1;

__HAL_UART_CLEAR_IDLEFLAG(&husartx);

__HAL_UART_DISABLE_IT(&husartx,UART_IT_IDLE);

}

}

/*USERCODEENDUSART1_IRQn1*/

}

voidUSARTx_DMAx_CHANNELn_IRQHANDLER(void)

{

/*USERCODEBEGINDMA1_Channel4_IRQn0*/

/*USERCODEENDDMA1_Channel4_IRQn0*/

//HAL_DMA_IRQHandler(&hdma_usartx_rx);

/*USERCODEBEGINDMA1_Channel4_IRQn1*/

if(__HAL_DMA_GET_FLAG(hdma,__HAL_DMA_GET_HT_FLAG_INDEX(&hdma_usartx_rx))!

=RESET)

{

if(__HAL_DMA_GET_IT_SOURCE(&hdma_usartx_rx,DMA_IT_HT)!

=RESET)

{

/*Clearthehalftransfercompleteflag*/

__HAL_DMA_CLEAR_FLAG(hdma,__HAL_DMA_GET_HT_FLAG_INDEX(&hdma_usartx_rx));

LED2_ON;

SPI_FLASH_BufferWrite(aRxBuffer,FLASH_UNIGBK_ADDR+Write_Sector_Count*FLASH_SECTOR_SIZE,FLASH_SE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1