@@ -63,7 +63,7 @@ void sys_MCU_Init_Seq(void)
6363 #if SYSTEM_CRC_ENABLE
6464 sys_CRC_ENABLE ();
6565 if (HAL_CRC_Accumulate (& hcrc , (uint32_t * )aDataBuffer , BUFFER_SIZE ) == uwExpectedCRCValue )
66- {}else {FaultASSERT ("AT : CRC init" );}
66+ {}else {FaultASSERT ("CRC init" , 1 , flag_Warning );}
6767 #endif
6868
6969 #if SYSTEM_RNG_ENABLE
@@ -131,6 +131,8 @@ void sys_MCU_Init_Seq(void)
131131/*__________器件外设初始化,并开机自检_____________*/
132132void sys_Device_Init_Seq (void )
133133{
134+ u8 init_return ;
135+
134136 /*用户应用的Device初始化序列——开始*/
135137
136138 /*用户IO初始化,可选择初始化某个特定器件或者所有器件(ALL_Index)*/
@@ -147,6 +149,40 @@ void sys_Device_Init_Seq(void)
147149 LCD_Init_no_FSMC ();
148150 #endif
149151
152+ /*FATFS ff14 初始化*/
153+ #if SYSTEM_FATFS_ENABLE
154+ init_return = FATFS_Init (); if (init_return != 0 ){ FaultASSERT ("FATFS_Init()" ,init_return ,flag_Fault );}
155+
156+ // init_return = f_mount(fs[0],"DEV_ExFLASH:",1); //挂载外部SPI FLASH
157+ // if(init_return == 0X0D) //外部SPI FLASH磁盘的FAT文件系统错误,重新格式化
158+ // {
159+ // MKFS_PARM mkf_opts = //格式化选项
160+ // { .fmt = FM_SFD //FM_FAT32 还是 FM_SFD 不清楚,后者为没有引导区
161+ // //其他都保持默认就好~
162+ // };
163+ // init_return = f_mkfs("DEV_ExFLASH:",&mkf_opts,NULL,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
164+ // if(init_return==0)
165+ // {
166+ // f_setlabel((const TCHAR *)"0:DEV_ExFLASH"); //设置Flash磁盘的名字
167+ // }else FaultASSERT("f_mkfs DEV_ExFLASH",init_return,flag_Warning); //格式化失败
168+ // HAL_Delay(1000);
169+ // }
170+
171+ // init_return = f_mount(fs[1],"DEV_SD:",1); //挂载SDIO驱动的SD卡
172+ // if(init_return != 0){ FaultASSERT("f_mount fs[1]",init_return,flag_Warning);}
173+
174+ // init_return = f_mount(fs[2],"DEV_USB:",1); //挂载USB文件设备
175+ // if(init_return != 0){ FaultASSERT("f_mount fs[2]",init_return,flag_Warning);}
176+
177+ // init_return = f_mount(fs[3],"DEV_SPI_SD:",1); //挂载SPI驱动的SD卡
178+ // if(init_return != 0){ FaultASSERT("f_mount fs[3]",init_return,flag_Warning);}
179+ #endif
180+
181+ /*LWIP 2.1.2 初始化*/
182+ #if SYS_SUPPORT_LWIP
183+
184+ #endif
185+
150186 /*OLED初始化*/
151187// OLED_Init();
152188
@@ -197,28 +233,56 @@ void sys_Device_Init_Seq(void)
197233 #if SYSTEM_IWDG_ENABLE
198234 sys_IWDG_ENABLE ();
199235 #endif
236+
237+
200238 buzzer_bibi_once ; //响一声表示初始化结束
201239 printf_uart (UART1 ,"System init over\r\n" );
202240}
203241
204242/*____________运行错误提示和打印______________________________*/
205243/********************************
206244*描述:表示某步骤运行有问题,串口提示,灯提示,声提示
207- *参数: FaultMessage:错误提示信息字符串
245+ *参数: 错误或者警告信息
246+ 故障代号
247+ 错误类别(可选flag_Fault或flag_Warning)
208248*返回值: 1、NULL
209249********************************/
210- void FaultASSERT (char * FaultMessage )
250+ void FaultASSERT (char * FaultMessage , u8 code , u8 flag )
211251{
212- /*往串口1发送数据*/
213- printf_uart (UART1 ,"Fault Message : %s\r\n" ,FaultMessage );
214- printf_uart (UART1 ,"File&Line : %s,%d\r\n" ,__FILE__ ,__LINE__ );
215- LCD_ShowString (5 ,0 ,16 ,(u8 * )FaultMessage );
216- //灯提示,声提示
217- buzzer_bibi_on ;
218- for (;;)
252+ char * faultMessage_buf = (char * )mymalloc (InrRAM ,100 * sizeof (char ));
253+
254+ switch (flag )
219255 {
220-
256+ case flag_Fault :
257+ sprintf_ (faultMessage_buf ,"Fault: %s, code:%d\r\n" ,FaultMessage ,code );
258+
259+ /*往串口1发送数据*/
260+ printf_uart (UART1 ,"%s" ,faultMessage_buf );
261+ printf_uart (UART1 ,"File&Line: %s,%d\r\n" ,__FILE__ ,__LINE__ );
262+ POINT_COLOR = RED ;
263+ LCD_ShowString (5 ,0 ,16 ,(u8 * )faultMessage_buf );
264+
265+ myfree (InrRAM ,faultMessage_buf );
266+ //灯提示,声提示
267+ buzzer_bibi_on ;
268+ for (;;)
269+ {
270+ //在错误的道路上,奔跑也没用,停止就是进步
271+ }
272+ case flag_Warning :
273+ sprintf_ (faultMessage_buf ,"Warning: %s, code:%d\r\n" ,FaultMessage ,code );
274+
275+ printf_uart (UART1 ,"%s\r\n" ,faultMessage_buf );
276+ printf_uart (UART1 ,"File&Line: %s,%d\r\n" ,__FILE__ ,__LINE__ );
277+ POINT_COLOR = YELLOW ;
278+ LCD_ShowString (5 ,0 ,16 ,(u8 * )faultMessage_buf );
279+
280+ myfree (InrRAM ,faultMessage_buf );
281+ buzzer_bibi_once ;
282+ break ;
283+ default :break ;
221284 }
285+ myfree (InrRAM ,faultMessage_buf );
222286}
223287
224288/*_____________获取系统运行的时间________________________*/
@@ -355,6 +419,15 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
355419 static u8 is_runOnce4biOnce = 0 ;
356420 #endif
357421
422+ #if SYSTEM_UseTIM5ForTiming_ENABLE
423+ if (htim == (& TIM5_Handler ))
424+ {
425+ //每 0.065536s中断一次
426+ TIM5_InterruptTimes ++ ; //u16类型
427+ //0.065536 * 65536 = 4,294.967296s,TIM5_InterruptTimes溢出
428+ }
429+ #endif
430+
358431 /*注意:不要写入太多程序从而占用时间!*/
359432 if (htim == (& TIM4_Handler ))
360433 {
@@ -566,6 +639,19 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
566639 #endif
567640 }
568641 #endif
642+
643+ #if SYSTEM_UseTIM5ForTiming_ENABLE
644+ if (htim -> Instance == TIM5 )
645+ {
646+ __HAL_RCC_TIM5_CLK_ENABLE (); //使能TIM5时钟
647+
648+ __HAL_TIM_CLEAR_IT (& TIM5_Handler , TIM_IT_UPDATE ); // 清除更新中断标志位
649+ __HAL_TIM_SET_COUNTER (& TIM5_Handler ,0 ); //清零TIM5定时器的计数器值
650+
651+ HAL_NVIC_SetPriority (TIM5_IRQn ,1 ,0 ); //设置中断优先级,抢占优先级1
652+ HAL_NVIC_EnableIRQ (TIM5_IRQn ); //开启ITM5中断
653+ }
654+ #endif
569655}
570656
571657/*__________定时器PWM初始化底层配置函数_____________*/
@@ -1044,6 +1130,56 @@ void TIM3_IRQHandler(void)
10441130
10451131
10461132
1133+ #if SYSTEM_UseTIM5ForTiming_ENABLE
1134+
1135+ u16 TIM5_InterruptTimes = 0 ;
1136+
1137+ TIM_HandleTypeDef TIM5_Handler ;
1138+
1139+ void sys_TIM5_ENABLE (void )
1140+ {
1141+ TIM_ClockConfigTypeDef sClockSourceConfig = {0 };
1142+ TIM_MasterConfigTypeDef sMasterConfig = {0 };
1143+
1144+ TIM5_Handler .Instance = TIM5 ; //通用定时器5
1145+ TIM5_Handler .Init .Prescaler = (84 - 1 ); //分频系数 计数频率1Mkz,即1us
1146+ TIM5_Handler .Init .CounterMode = TIM_COUNTERMODE_UP ; //向上计数器 0.065536s溢出一次
1147+ TIM5_Handler .Init .Period = (65536 - 1 ); //自动装载值
1148+ TIM5_Handler .Init .ClockDivision = TIM_CLOCKDIVISION_DIV1 ; //时钟分频因子
1149+ // TIM5_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
1150+ HAL_TIM_Base_Init (& TIM5_Handler );
1151+
1152+ sClockSourceConfig .ClockSource = TIM_CLOCKSOURCE_INTERNAL ;
1153+ HAL_TIM_ConfigClockSource (& TIM5_Handler , & sClockSourceConfig );
1154+
1155+ sMasterConfig .MasterOutputTrigger = TIM_TRGO_RESET ;
1156+ sMasterConfig .MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE ;
1157+ HAL_TIMEx_MasterConfigSynchronization (& TIM5_Handler , & sMasterConfig );
1158+
1159+ HAL_TIM_Base_Start_IT (& TIM5_Handler ); //使能定时器5和定时器5更新中断:TIM_IT_UPDATE
1160+ }
1161+
1162+ //定时器5中断服务函数
1163+ void TIM5_IRQHandler (void )
1164+ {
1165+ HAL_TIM_IRQHandler (& TIM5_Handler );
1166+ }
1167+
1168+ //测量(*FunctionForTiming)()函数运行时间,返回单位为us的运行时间,没有超时退出机制,不适合在有操作系统的环境中用
1169+ //最长可测量约4290s,0.065536 * 65536 = 4,294.967296s,TIM5_InterruptTimes溢出
1170+ u32 Timing (void (* FunctionForTiming )())
1171+ {
1172+ u32 FunctionRunTime_us ;
1173+
1174+ TIM5_InterruptTimes = 0 ;
1175+ __HAL_TIM_SET_COUNTER (& TIM5_Handler ,0 );
1176+ (* FunctionForTiming )();
1177+ FunctionRunTime_us = (u32 )__HAL_TIM_GET_COUNTER (& TIM5_Handler ) + (u32 )TIM5_InterruptTimes * 65536 ;
1178+
1179+ return FunctionRunTime_us ;
1180+ }
1181+
1182+ #endif
10471183#if SYSTEM_UART1_ENABLE || SYSTEM_UART2_ENABLE || SYSTEM_UART3_ENABLE
10481184
10491185UART_HandleTypeDef UART1_Handler ,UART2_Handler ,UART3_Handler ; //UART句柄
@@ -1598,7 +1734,7 @@ void sys_RTC_Enable(void)
15981734{
15991735 RTC_TimeTypeDef sTime = {0 };
16001736 RTC_DateTypeDef sDate = {0 };
1601- RTC_AlarmTypeDef sAlarm = {0 };
1737+ // RTC_AlarmTypeDef sAlarm = {0};
16021738
16031739 RTC_Handler .Instance = RTC ;
16041740 RTC_Handler .Init .HourFormat = RTC_HOURFORMAT_24 ;
@@ -1627,19 +1763,18 @@ void sys_RTC_Enable(void)
16271763 sDate .WeekDay = RTC_Get_Week (((u16 )BCD2HEX (sDate .Year ) + 1970 ),BCD2HEX (sDate .Month ),BCD2HEX (sDate .Date ));
16281764 HAL_RTC_SetDate (& RTC_Handler , & sDate , RTC_FORMAT_BCD );
16291765
1630- /** Enable the Alarm A
1631- */
1632- sAlarm .AlarmTime .Hours = 0x23 ; //直接BCD格式写
1633- sAlarm .AlarmTime .Minutes = 0x31 ;
1634- sAlarm .AlarmTime .Seconds = 0x29 ;
1635- sAlarm .AlarmTime .DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
1636- sAlarm .AlarmTime .StoreOperation = RTC_STOREOPERATION_RESET ;
1637- sAlarm .AlarmMask = RTC_ALARMMASK_SECONDS ; //可选mask时分秒和所有
1638- sAlarm .AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE ; //可选日期和星期
1639- sAlarm .AlarmDateWeekDay = 0x1 ; //不懂..
1640- sAlarm .Alarm = RTC_ALARM_A ;
1641- HAL_RTC_SetAlarm_IT (& RTC_Handler , & sAlarm , RTC_FORMAT_BCD );
1642- HAL_RTC_DeactivateAlarm (& RTC_Handler ,RTC_ALARM_A );
1766+ /* Enable the Alarm A*/
1767+ // sAlarm.AlarmTime.Hours = 0x23; //直接BCD格式写
1768+ // sAlarm.AlarmTime.Minutes = 0x31;
1769+ // sAlarm.AlarmTime.Seconds = 0x29;
1770+ // sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
1771+ // sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
1772+ // sAlarm.AlarmMask = RTC_ALARMMASK_SECONDS; //可选mask时分秒和所有
1773+ // sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; //可选日期和星期
1774+ // sAlarm.AlarmDateWeekDay = 0x1; //不懂..
1775+ // sAlarm.Alarm = RTC_ALARM_A;
1776+ // HAL_RTC_SetAlarm_IT(&RTC_Handler, &sAlarm, RTC_FORMAT_BCD); //默认不开启闹钟
1777+ // HAL_RTC_DeactivateAlarm(&RTC_Handler,RTC_ALARM_A);
16431778
16441779 HAL_RTCEx_BKUPWrite (& RTC_Handler ,RTC_BKP_DR1 ,0X5050 );//标记已经初始化过了
16451780
@@ -1810,6 +1945,23 @@ int myatoi(const char *str)
18101945}
18111946
18121947
1948+ /* 实现伪随机数的支持*/
1949+ unsigned int Curl_rand (void )
1950+ {
1951+ static unsigned int gtimes = 0 ; //记录被调用了多少次
1952+ static unsigned int randseed = 50 ; //随机数种子
1953+
1954+ if (++ gtimes > (randseed & 0x000f )) //当被调用(randseed & 0x000f)次后更新一下随机数种子
1955+ {
1956+ sys_GetsysRunTime (NULL ,NULL ,(u16 * )& randseed );
1957+ gtimes = 0 ;
1958+ }
1959+
1960+ /* 返回一个无符号32位整型的伪随机数. */
1961+ randseed = randseed * 3971038 ;
1962+ return (randseed << 7 ) | ((randseed >> 7 ) & 0xFFFF );
1963+ }
1964+
18131965//THUMB指令不支持汇编内联
18141966//采用如下方法实现执行汇编指令WFI
18151967void WFI_SET (void )
0 commit comments