STM32F030中断言的使用分享

前言 

最近在写一个程序中,想对存到FLASH中的结构体分配的大小做控制,希望分配的大小偶数字节大小。(因为读时是按16位读,如果奇数就可能读超了)如果结构体大小为奇数,就跳到断言处。

分析

    STM32F030的标准库有使用断言 在stm32f0xx_conf.h文件中进行了定义是否开启

图片

其中去掉下面这一行的注释,使能它就可以使用了。

图片

使用方法

图片

附记

  原来是打算在编译时,如果发现分配的结构体大小不对,最好能报错,而实际上是只有在运行仿真时,才会跳转到断言,如果大家有更好的方法,可以一起交流。

#include"userpar.h" #include"userflash.h" #include"bitband.h" #include"math.h" #include"usersys.h" #include"string.h" #include"useruart_inter.h" #define CTL_TEMP_UP_LIMIT 15//µ¥Î»1¡æ #define CTL_TEMP_DOWN_LIMIT 13//µ¥Î»1¡æ #define WARN_TEMP_UP_LIMIT 70//µ¥Î»1¡æ #define VOL_UP_LIMIT 32.0f// #define VOL_DOWN_LIMIT 22.0 // #define CURR_UP_LIMIT 60.0f//µ¥Î»0.1A typedef struct { uint16_t FPGA_AD[20] ; float rd_power ; //·´Ïò¹¦ÂÊAD float fd_power ; //ÕýÏòÏò¹¦ÂÊAD float vol_a; float curr ; float fan_curr1 ; float fan_curr2 ; int8_t temp ; uint8_t pa_att_set,pa_att_ack; uint8_t pa_ctl_soft_set,pa_ctl_soft_ack;//ÓÐÈí¼þ¿ØÖƹ¦·Å¿ªÆô¹Ø±Õʱ,±ØÐëpanel_bon´ò¿ª²ÅÐÐ uint8_t vol_warn ;//1 ¸æ¾¯ 0Õý³£ uint8_t curr_warn ;//1 ¸æ¾¯ 0Õý³£ uint8_t temp_warn ;//1 ¸æ¾¯ 0Õý³£ // uint8_t in_power_warn ;//1 ¸æ¾¯ 0Õý³£ uint8_t swr_state,swr_warn;//1 ¸æ¾¯ 0Õý³£ uint8_t pwm_state,pwm_warn;//1 ¸æ¾¯ 0Õý³£ uint8_t fan_ctl_set;//ͨ¹ýζÈÅжÏÊÇ·ñ¿ªÆô·ç»ú,Óɵ¥Æ¬»úÖ÷¶¯ uint8_t fan_ctl_ack;//FPGAÓ¦´ð uint8_t pa_warn_mcu;//(¹¦·Å1µçÔ´µçѹ ¹¦·Å1µçÔ´µçÁ÷ ¹¦·Å1ζÈ)Òì³£ÐèÒªÖ÷¶¯¹Ø±Õ¹¦·Å ÓÉMCUÖ÷¶¯ uint8_t pa_warn_fpga;//FPGAÓ¦´ð uint8_t panel_bon ;//0Çå³ý±¨¾¯×´Ì¬ 1 ±£³Ö±¨¾¯×´Ì¬ //uint8_t pa_sw; uint8_t pa_warn; //uint8_t fd_power_bfb; //uint8_t alc_wt_set,alc_wt_ack; //float in_power; //float knob_detec; uint32_t CH1Freq; uint8_t workmode; uint8_t is_valid_vol_data; uint8_t data_Refresh; }ModuParType; ModuParType ModuPar; typedef struct { uint32_t flag_s; uint32_t pa_sw_timer_1s; uint32_t flag_e; }Powerdown_saveparType; Powerdown_saveparType Powerdown_savepar; #define min_power_input_dbm_ch1 -40 #define max_power_input_dbm_ch1 10 #define min_power_output_dbm_ch1 0 #define max_power_output_dbm_ch1 58 #define step_power_input_ch1 1 #define step_power_output_ch1 1 #define input_dbm_ch1_db_len (((max_power_input_dbm_ch1-min_power_input_dbm_ch1)/step_power_input_ch1 ) + 1) #define output_dbm_ch1_db_len (((max_power_output_dbm_ch1-min_power_output_dbm_ch1)/step_power_output_ch1) + 1) typedef struct { uint32_t flag_s; float ch1_jb_fd_power[100]; float ch1_jb_dlt[100]; uint32_t flag_e; }swrpar_Type; swrpar_Type swrpar; typedef struct { uint32_t flag_s; float ch1_input__power_vol[50][100]; float ch1_output_power_vol[50][100]; uint32_t flag_e; }powercalpar_Type; powercalpar_Type powercalpar; float tmp_power_vol_ch1_input[100]; float tmp_power_vol_ch1_output[100]; #define det_len 10 typedef struct { float fd_power[det_len]; float rd_power[det_len]; // float in_power[det_len]; float avg_fd,avg_rd; float sum_fd,sum_rd; uint32_t cnt; }powerdetType; powerdetType powerdet; #define vol_curr_avg_len 40 typedef struct { float vol_a_code[vol_curr_avg_len]; //float vol_b_code[vol_curr_avg_len]; float curr_code[vol_curr_avg_len]; float fun_curr_code[vol_curr_avg_len]; float avg_vol_a,avg_curr,avg_fun_curr; float sum_vol_a,sum_curr,sum_fun_curr; uint32_t cnt; }volcurr_detType; volcurr_detType volcurr_det; //void userpar_SetPASw(uint8_t tmp) //{ // if(ModuPar.pa_warn > 0) // { // ModuPar.pa_sw = 0; // } // else // { // ModuPar.pa_sw = tmp; // } //} //uint8_t userpar_GetPASw(void) //{ // return ModuPar.pa_sw; //} void userpar_SetPACtl_Soft(uint8_t tmp) { ModuPar.pa_ctl_soft_set = tmp; ModuPar.pa_warn_mcu = 0; ModuPar.vol_warn = 0; ModuPar.curr_warn = 0; ModuPar.temp_warn = 0; ModuPar.pa_warn = 0; ModuPar.swr_warn = 0; ModuPar.pwm_warn = 0; ModuPar.pa_ctl_soft_ack = ModuPar.pa_ctl_soft_set + 1; useruart_inter_Set(cmd02,ModuPar.pa_ctl_soft_set); } void userpar_SetPAAtt_Soft(uint8_t tmp) { if(tmp > MAX_ATT) { tmp = MAX_ATT; } ModuPar.pa_att_set = tmp; } uint8_t userpar_GetPAAtt_Soft(void) { return ModuPar.pa_att_set; } void userpar_AckPAAtt_Soft(uint8_t tmp) { ModuPar.pa_att_ack = tmp; } uint8_t userpar_Get_AckPAAtt_Soft(void) { return ModuPar.pa_att_ack; } uint8_t userpar_GetPACtl_Soft(void) { return ModuPar.pa_ctl_soft_set; } void userpar_AckPACtl_Soft(uint8_t tmp) { ModuPar.pa_ctl_soft_ack = tmp; } uint8_t userpar_Get_AckPACtl_Soft(void) { return ModuPar.pa_ctl_soft_ack; } void userpar_SetPanle_Bon(uint8_t Bon) { if(Bon == 1) { ModuPar.pa_warn_mcu = 0; ModuPar.vol_warn = 0; ModuPar.curr_warn = 0; ModuPar.temp_warn = 0; ModuPar.swr_warn = 0; ModuPar.pwm_warn = 0; ModuPar.pa_ctl_soft_set = 0; ModuPar.pa_ctl_soft_ack = 0; ModuPar.pa_warn = 0; } // else // { // if((ModuPar.panel_bon == 0) && (Bon == 1)) // { // ModuPar.pa_ctl_soft_set = 1; // } // } ModuPar.panel_bon = Bon; } uint8_t userpar_GetPanle_Bon(void) { return ModuPar.panel_bon; } uint16_t userpar_GetFD_Power(void) { return ModuPar.fd_power*10; } uint16_t userpar_GetRD_Power(void) { return ModuPar.rd_power*10; } uint16_t userpar_GetPA_Vol(void) { // if(ModuPar.vol_a > ModuPar.vol_b) // { // return ModuPar.vol_a*10; // } // else // { // return ModuPar.vol_b*10; // } return ModuPar.vol_a*10.0f; } uint16_t userpar_GetPA_Curr(void) { return ModuPar.curr*10; } uint8_t userpar_GetPA_State(void) { return (ModuPar.swr_state << 4) | (ModuPar.pwm_state << 3) | (ModuPar.vol_warn << 2) | (ModuPar.curr_warn << 1) | (ModuPar.temp_warn << 0); } int8_t userpar_GetTemp(void) { return ModuPar.temp; } uint8_t userpar_GetFun1_Curr(void) { return ModuPar.fan_curr1*10; } uint8_t userpar_GetFun2_Curr(void) { return ModuPar.fan_curr1*10; } uint8_t userpar_Get_Ack_PAState(void) { return ModuPar.pa_warn_fpga; } uint8_t userpar_Get_Set_PAState(void) { return ModuPar.pa_warn_mcu; } uint8_t userpar_Get_Ack_FunCtl(void) { return ModuPar.fan_ctl_ack; } uint8_t userpar_Get_Set_FunCtl(void) { return ModuPar.fan_ctl_set; } void userpar_Ack_PACtl(uint8_t tmp) { ModuPar.pa_warn_fpga = tmp; } void userpar_Ack_FunCtl(uint8_t tmp) { ModuPar.fan_ctl_ack = tmp; } void userpar_Init(void) { userpar_loadCfg(); userpar_SetFreq(100); ModuPar.fan_ctl_set = 1; ModuPar.pa_warn_mcu = 0; ModuPar.fan_ctl_ack = ModuPar.fan_ctl_set + 1; ModuPar.pa_warn_fpga = ModuPar.pa_warn_mcu + 1; ModuPar.panel_bon = 1; ModuPar.swr_warn = 0; ModuPar.pwm_warn = 0; ModuPar.vol_warn = 0; ModuPar.curr_warn = 0; ModuPar.temp_warn = 0; ModuPar.pa_warn = 0; ModuPar.pa_ctl_soft_set = 0; ModuPar.pa_ctl_soft_ack = ModuPar.pa_ctl_soft_set + 1; ///ModuPar.in_power_warn = 0; //ModuPar.alc_wt_set = 0; // ModuPar.alc_wt_ack = ModuPar.alc_wt_set + 1; ModuPar.data_Refresh = FALSE; userpar_Set_workmode(normal_work_mode); userpar_loadCfg_powerdownpar(); userpar_Erase_powerdownpar(); UserTimer_SetPeroid(TIMER_PA_OPEN_PERIOD,TIMER_PA_OPEN_OPT); UserTimer_SetPeroid(TIMER_ABNORMAL_PERIOD,TIMER_ABNORMAL_OPT); ModuPar.is_valid_vol_data = FALSE; } void userpar_SetFPGA_AD(uint8_t ad_index,uint16_t AD_Value) { ModuPar.FPGA_AD[ad_index] = AD_Value; if(ad_index == 13) { ModuPar.data_Refresh = TRUE; } } void userpar_Set_FPGA_ACK_state(uint8_t swr_state,uint8_t pwm_state) { //ModuPar.swr_state = 0; //ModuPar.pwm_state = 0; } void userpar_SetTemp(int8_t temp) { //ModuPar.temp = temp; } //uint8_t *userpar_advol_input_ch1(void) //{ // return (uint8_t*)&powerdet.avg_in; //} uint8_t *userpar_advol_output_ch1(void) { return (uint8_t*)&powerdet.avg_fd; } void userpar_AbNormal_Handle(void) { double vol = ModuPar.vol_a; if(UserTimer_InqIsTrigger(TIMER_ABNORMAL_OPT) == TRUE) { ModuPar.is_valid_vol_data = TRUE; } if(ModuPar.is_valid_vol_data == FALSE) { return; } // if(ModuPar.pa_sw == 0) // { // return; // } if(ModuPar.temp > CTL_TEMP_UP_LIMIT) { ModuPar.fan_ctl_set = 1; } else if(ModuPar.temp < CTL_TEMP_DOWN_LIMIT) { ModuPar.fan_ctl_set = 0; } if(vol >= VOL_UP_LIMIT) { ModuPar.vol_warn = 1; ModuPar.pa_warn_mcu = 1; } else if(vol <= VOL_DOWN_LIMIT) { ModuPar.vol_warn = 1; ModuPar.pa_warn_mcu = 1; } if(ModuPar.temp >= WARN_TEMP_UP_LIMIT) { ModuPar.temp_warn = 1; ModuPar.pa_warn_mcu = 1; } if(ModuPar.pwm_state > 0) { ModuPar.pwm_warn = 1; ModuPar.pa_warn_mcu = 1; } // if(ModuPar.in_power >= IN_POWER_MAX) // { // ModuPar.in_power_warn = 1; // ModuPar.pa_warn_mcu = 1; // } if(ModuPar.swr_state > 0) { ModuPar.swr_warn = 1; ModuPar.pa_warn_mcu = 1; } if(ModuPar.pa_warn_mcu > 0) { ModuPar.pa_ctl_soft_set = 0; ModuPar.pa_ctl_soft_ack = 0; } ModuPar.pa_warn = (ModuPar.vol_warn<<4) | (ModuPar.curr_warn<<3) | (ModuPar.temp_warn << 2) | (ModuPar.pwm_warn << 1) | (ModuPar.swr_warn << 0); } uint8_t userpar_getPaState(void) { return ModuPar.pa_warn; } void userpar_ParCal_Handle(void) { float vol; //float dlt_bfb; uint16_t curr_code; uint32_t i =0; if(ModuPar.data_Refresh == FALSE) { return; } ModuPar.data_Refresh = FALSE; ModuPar.temp = (ModuPar.FPGA_AD[11]*2.5f*2.0f/4095.0f - 0.5f)/0.01f; if(powerdet.cnt >= det_len) { for(i = 0;i < (det_len - 1);i++) { powerdet.fd_power[i] = powerdet.fd_power[i+1]; powerdet.rd_power[i] = powerdet.rd_power[i+1]; } powerdet.fd_power[(det_len - 1)] = ModuPar.FPGA_AD[9]; powerdet.rd_power[(det_len - 1)] = ModuPar.FPGA_AD[8]; } else { powerdet.fd_power[powerdet.cnt] = ModuPar.FPGA_AD[9]; powerdet.rd_power[powerdet.cnt] = ModuPar.FPGA_AD[8]; powerdet.cnt++; } powerdet.sum_fd = 0; powerdet.sum_rd = 0; for(i = 0;i < powerdet.cnt;i++) { powerdet.sum_fd = powerdet.sum_fd + powerdet.fd_power[i]; powerdet.sum_rd = powerdet.sum_rd + powerdet.rd_power[i]; } powerdet.avg_fd = powerdet.sum_fd*2.5f/4095.0f/powerdet.cnt; powerdet.avg_rd = powerdet.sum_rd*2.5f/4095.0f/powerdet.cnt; ModuPar.fd_power = userpar_compute_outputpower_ch1(powerdet.avg_fd); ModuPar.rd_power = userpar_compute_outputpower_ch1(powerdet.avg_rd); uint8_t *pcal_fd; uint8_t *pcal_dlt_thr; pcal_fd = userpar_correct_ch1_jb_fd_power(); pcal_dlt_thr = userpar_correct_ch1_jb_dlt(); if((ModuPar.fd_power > (*pcal_fd)) && (ModuPar.fd_power < (ModuPar.rd_power + (*pcal_dlt_thr)))) { ModuPar.swr_state = 1; } curr_code = ModuPar.FPGA_AD[0] + ModuPar.FPGA_AD[1] + ModuPar.FPGA_AD[2] + ModuPar.FPGA_AD[3] + ModuPar.FPGA_AD[4] + ModuPar.FPGA_AD[5] + ModuPar.FPGA_AD[6] + ModuPar.FPGA_AD[7]; if(volcurr_det.cnt >= vol_curr_avg_len) { for(i = 0;i < (vol_curr_avg_len - 1);i++) { volcurr_det.vol_a_code[i] = volcurr_det.vol_a_code[i+1]; //volcurr_det.vol_b_code[i] = volcurr_det.vol_b_code[i+1]; volcurr_det.curr_code[i] = volcurr_det.curr_code[i+1]; volcurr_det.fun_curr_code[i] = volcurr_det.fun_curr_code[i+1]; } volcurr_det.vol_a_code[(vol_curr_avg_len - 1)] = ModuPar.FPGA_AD[10]; //volcurr_det.vol_b_code[(vol_curr_avg_len - 1)] = ModuPar.FPGA_AD[6]; volcurr_det.curr_code[(vol_curr_avg_len - 1)] = curr_code;//ModuPar.FPGA_AD[0]; volcurr_det.fun_curr_code[(vol_curr_avg_len - 1)] = ModuPar.FPGA_AD[12]; } else { volcurr_det.vol_a_code[volcurr_det.cnt] = ModuPar.FPGA_AD[10]; //volcurr_det.vol_b_code[volcurr_det.cnt] = ModuPar.FPGA_AD[6]; volcurr_det.curr_code[volcurr_det.cnt] = curr_code;//ModuPar.FPGA_AD[0]; volcurr_det.fun_curr_code[volcurr_det.cnt] = ModuPar.FPGA_AD[12]; volcurr_det.cnt++; } volcurr_det.sum_vol_a = 0; //volcurr_det.sum_vol_b = 0; volcurr_det.sum_curr = 0; volcurr_det.sum_fun_curr = 0; for(i = 0;i < volcurr_det.cnt;i++) { volcurr_det.sum_vol_a = volcurr_det.sum_vol_a + volcurr_det.vol_a_code[i]; //volcurr_det.sum_vol_b = volcurr_det.sum_vol_b + volcurr_det.vol_b_code[i]; volcurr_det.sum_curr = volcurr_det.sum_curr + volcurr_det.curr_code[i]; volcurr_det.sum_fun_curr = volcurr_det.sum_fun_curr + volcurr_det.fun_curr_code[i]; } volcurr_det.avg_vol_a = volcurr_det.sum_vol_a/volcurr_det.cnt; //volcurr_det.avg_vol_b = volcurr_det.sum_vol_b/volcurr_det.cnt; volcurr_det.avg_curr = volcurr_det.sum_curr/volcurr_det.cnt; volcurr_det.avg_fun_curr = volcurr_det.sum_fun_curr/volcurr_det.cnt; vol = (volcurr_det.avg_curr*2.5f/4095.f); vol = vol*6.0f;//2.0f·Öѹ±¶Êý if(vol >= 19.968f)//19.52f->8¸öͨµÀ0µçÁ÷µçѹ(AD²É¼¯µçѹ*2(·Öѹ±¶Êý)*8(8ͨµÀ)) { ModuPar.curr = (vol - 19.968f)*1.166f/0.1f; } else { ModuPar.curr = 0; } ModuPar.fan_curr1 = volcurr_det.avg_fun_curr*2.5f/4095; if(ModuPar.fan_curr1 > 1.229f) { ModuPar.fan_curr1 = (ModuPar.fan_curr1 - 1.229f)*2/0.18f; } else { ModuPar.fan_curr1 = 0; } ModuPar.curr = ModuPar.curr + ModuPar.fan_curr1; ModuPar.vol_a = (volcurr_det.avg_vol_a*2.5f/4095.0f) * 37.0f; } void userpar_pa_open_handle(void) { if(UserTimer_InqIsTrigger(TIMER_PA_OPEN_OPT) == TRUE) { UserTimer_SetPeroid(TIMER_PA_OPEN_PERIOD,TIMER_PA_OPEN_OPT); if(ModuPar.pa_ctl_soft_set == 1) { Powerdown_savepar.pa_sw_timer_1s++; } } } uint32_t userpar_get_pa_run_timer_1s(void)//0.1Сʱ { return Powerdown_savepar.pa_sw_timer_1s/360;//0.1Сʱ } void userpar_handle(void) { userpar_pa_open_handle(); userpar_ParCal_Handle(); userpar_compute_inputpower_ch1_base_vol(); userpar_compute_outputpower_ch1_base_vol(); userpar_AbNormal_Handle(); } void userpar_SavePower_vol(void) { userflash_Erase(CORRECT_DATA_SAVESECTOR_CAL_5); userflash_Write(0,(uint8_t*)&powercalpar,sizeof(powercalpar_Type),CORRECT_DATA_SAVEADDR_CAL_5); } #define MIN_FREQ 18000 #define MAX_FREQ 40000 void userpar_SetFreq(uint32_t freq) { if((freq < MIN_FREQ) || (freq > MAX_FREQ)) { return; } ModuPar.CH1Freq = freq; } uint32_t userpar_GetFreq(void) { return ModuPar.CH1Freq; } uint32_t userpar_freqindex_correct(void) { uint32_t freq_index; if((ModuPar.CH1Freq < 150) && (ModuPar.CH1Freq >= 100)) { freq_index = 0; } else if((ModuPar.CH1Freq < 200) && (ModuPar.CH1Freq >= 150)) { freq_index = 1; } else if((ModuPar.CH1Freq < 500) && (ModuPar.CH1Freq >= 200)) { freq_index = 2; } else if((ModuPar.CH1Freq < 1000) && (ModuPar.CH1Freq >= 500)) { freq_index = 3; } else if((ModuPar.CH1Freq < 5000) && (ModuPar.CH1Freq >= 1000)) { freq_index = 4; } else if((ModuPar.CH1Freq < 10000) && (ModuPar.CH1Freq >= 5000)) { freq_index = 5; } else if((ModuPar.CH1Freq < 20000) && (ModuPar.CH1Freq >= 10000)) { freq_index = 6; } else if((ModuPar.CH1Freq < 50000) && (ModuPar.CH1Freq >= 20000)) { freq_index = 7; } else if((ModuPar.CH1Freq < 100000) && (ModuPar.CH1Freq >= 50000)) { freq_index = 8; } else if((ModuPar.CH1Freq < 200000) && (ModuPar.CH1Freq >= 100000)) { freq_index = 9; } else if((ModuPar.CH1Freq < 300000) && (ModuPar.CH1Freq >= 200000)) { freq_index = 10; } else if((ModuPar.CH1Freq < 400000) && (ModuPar.CH1Freq >= 300000)) { freq_index = 11; } else { freq_index = 12; } return freq_index; } uint8_t *userpar_correct_detectvol_inputpower_ch1(int8_t power_dbm) { uint16_t freq_index,power_index; freq_index = userpar_freqindex_correct(); power_index = (power_dbm-min_power_input_dbm_ch1)/step_power_input_ch1; return (uint8_t*)&powercalpar.ch1_input__power_vol[freq_index][power_index]; } uint8_t *userpar_correct_detectvol_outputpower_ch1(int8_t power_dbm) { uint16_t freq_index,power_index; freq_index = userpar_freqindex_correct(); power_index = (power_dbm-min_power_output_dbm_ch1)/step_power_output_ch1; return (uint8_t*)&powercalpar.ch1_output_power_vol[freq_index][power_index]; } void userpar_compute_inputpower_ch1_base_vol(void) { uint16_t index,i; float vol_cal; double Divide_0_freq; double step_freq = 1; index = userpar_freqindex_correct(); for(i = 0;i < input_dbm_ch1_db_len;i++) { if(index == 0) { Divide_0_freq = 100.0f; step_freq = 50.0f; } else if(index == 1) { Divide_0_freq = 150.0f; step_freq = 50.0f; } else if(index == 2) { Divide_0_freq = 200.0f; step_freq = 300.0f; } else if(index == 3) { Divide_0_freq = 500.0f; step_freq = 500.0f; } else if(index == 4) { Divide_0_freq = 1000.0f; step_freq = 4000.0f; } else if(index == 5) { Divide_0_freq = 5000.0f; step_freq = 5000.0f; } else if(index == 6) { Divide_0_freq = 10000.0f; step_freq = 10000.0f; } else if(index == 7) { Divide_0_freq = 20000.0f; step_freq = 30000.0f; } else if(index == 8) { Divide_0_freq = 50000.0f; step_freq = 50000.0f; } else if(index == 9) { Divide_0_freq = 100000.0f; step_freq = 100000.0f; } else if(index == 10) { Divide_0_freq = 200000.0f; step_freq = 100000.0f; } else if(index == 11) { Divide_0_freq = 300000.0f; step_freq = 100000.0f; } else if(index == 12) { Divide_0_freq = 400000.0f; step_freq = 0; } if(index == 12) { vol_cal = powercalpar.ch1_input__power_vol[index][i]; } else { vol_cal = powercalpar.ch1_input__power_vol[index][i] + (powercalpar.ch1_input__power_vol[index + 1][i] - powercalpar.ch1_input__power_vol[index][i])*(ModuPar.CH1Freq-Divide_0_freq)/step_freq; } tmp_power_vol_ch1_input[i] = vol_cal; } } void userpar_compute_outputpower_ch1_base_vol(void) { uint16_t index,i; float vol_cal; double Divide_0_freq; double step_freq = 1; index = userpar_freqindex_correct(); for(i = 0;i < output_dbm_ch1_db_len;i++) { if(index == 0) { Divide_0_freq = 100.0f; step_freq = 50.0f; } else if(index == 1) { Divide_0_freq = 150.0f; step_freq = 50.0f; } else if(index == 2) { Divide_0_freq = 200.0f; step_freq = 300.0f; } else if(index == 3) { Divide_0_freq = 500.0f; step_freq = 500.0f; } else if(index == 4) { Divide_0_freq = 1000.0f; step_freq = 4000.0f; } else if(index == 5) { Divide_0_freq = 5000.0f; step_freq = 5000.0f; } else if(index == 6) { Divide_0_freq = 10000.0f; step_freq = 10000.0f; } else if(index == 7) { Divide_0_freq = 20000.0f; step_freq = 30000.0f; } else if(index == 8) { Divide_0_freq = 50000.0f; step_freq = 50000.0f; } else if(index == 9) { Divide_0_freq = 100000.0f; step_freq = 100000.0f; } else if(index == 10) { Divide_0_freq = 200000.0f; step_freq = 100000.0f; } else if(index == 11) { Divide_0_freq = 300000.0f; step_freq = 100000.0f; } else if(index == 12) { Divide_0_freq = 400000.0f; step_freq = 0.0f; } if(index == 12) { vol_cal = powercalpar.ch1_output_power_vol[index][i]; } else { vol_cal = powercalpar.ch1_output_power_vol[index][i] + (powercalpar.ch1_output_power_vol[index + 1][i] - powercalpar.ch1_output_power_vol[index][i])*(ModuPar.CH1Freq-Divide_0_freq)/step_freq; } tmp_power_vol_ch1_output[i] = vol_cal; } } float userpar_compute_inputpower_ch1(float detect_vol) { uint16_t i; float power_dbm,dlt_db; if(detect_vol >= tmp_power_vol_ch1_input[input_dbm_ch1_db_len-1]) { power_dbm = max_power_input_dbm_ch1; } else if(detect_vol <= tmp_power_vol_ch1_input[0]) { power_dbm = min_power_input_dbm_ch1; } else { for(i = 0;i < (input_dbm_ch1_db_len - 1);i++) { if((detect_vol <= tmp_power_vol_ch1_input[i+1]) && (detect_vol >= tmp_power_vol_ch1_input[i])) { dlt_db = (detect_vol - tmp_power_vol_ch1_input[i])/(tmp_power_vol_ch1_input[i+1] - tmp_power_vol_ch1_input[i]); power_dbm = min_power_input_dbm_ch1 + i + dlt_db; break; } } } return power_dbm; } float userpar_compute_outputpower_ch1(float detect_vol) { uint16_t i; float power_dbm,dlt_db; if(detect_vol >= tmp_power_vol_ch1_output[output_dbm_ch1_db_len-1]) { power_dbm = max_power_output_dbm_ch1; } else if(detect_vol <= tmp_power_vol_ch1_output[0]) { power_dbm = min_power_output_dbm_ch1; } else { for(i = 0;i < (output_dbm_ch1_db_len - 1);i++) { if((detect_vol <= tmp_power_vol_ch1_output[i+1]) && (detect_vol >= tmp_power_vol_ch1_output[i])) { dlt_db = (detect_vol - tmp_power_vol_ch1_output[i])/(tmp_power_vol_ch1_output[i+1] - tmp_power_vol_ch1_output[i]); power_dbm = min_power_output_dbm_ch1 + i + dlt_db; break; } } } //power_dbm = 12.0f; return power_dbm; } void userpar_loadCfg(void) { uint8_t i,j; userflash_Read(0,(uint8_t*)&powercalpar,sizeof(powercalpar_Type),CORRECT_DATA_SAVEADDR_CAL_5); if((powercalpar.flag_s != 123456789) || (powercalpar.flag_e != 123456789)) { powercalpar.flag_s = 123456789; powercalpar.flag_e = 123456789; for( j = 0;j < 50;j++) { for( i = 0;i < 100;i++) { powercalpar.ch1_input__power_vol[j][i] = 2.5f; powercalpar.ch1_output_power_vol[j][i] = 2.5f; } } } userflash_Read(0,(uint8_t*)&swrpar,sizeof(swrpar_Type),CORRECT_DATA_SAVEADDR_CAL_6); if((swrpar.flag_s != 123456789) || (swrpar.flag_e != 123456789)) { swrpar.flag_s = 123456789; swrpar.flag_e = 123456789; for(j = 0;j < 50;j++) { swrpar.ch1_jb_dlt[j] = 2; swrpar.ch1_jb_fd_power[j] = 43; } } } uint8_t *userpar_correct_ch1_jb_fd_power(void) { uint16_t freq_index; freq_index = 0; return (uint8_t*)&swrpar.ch1_jb_fd_power[freq_index]; } uint8_t *userpar_correct_ch1_jb_dlt(void) { uint16_t freq_index; freq_index = 0; return (uint8_t*)&swrpar.ch1_jb_dlt[freq_index]; } void userpar_Save_swrPar(void) { userflash_Erase(CORRECT_DATA_SAVESECTOR_CAL_6); userflash_Write(0,(uint8_t*)&swrpar,sizeof(swrpar_Type),CORRECT_DATA_SAVEADDR_CAL_6); } void userpar_Erase_mcu_update_pack(void) { userflash_Erase(MCU_UPDATE_PACK_SAVESECTOR); } void userpar_write_mcu_update_pack(uint32_t pack_bytes,uint8_t *buf,uint32_t offset_addr) { userflash_Write(offset_addr,(uint8_t*)buf,pack_bytes,MCU_UPDATE_PACK_SAVEADDR); } void userpar_write_mcu_update_bytes(uint32_t total_pack_bytes,uint32_t offset_addr) { userflash_Write(offset_addr,(uint8_t*)&total_pack_bytes,4,MCU_UPDATE_PACK_SAVEADDR); } void userpar_write_mcu_update_flag_write(uint32_t offset_addr,uint32_t mcu_update_flag) { userflash_Write(offset_addr,(uint8_t*)&mcu_update_flag,4,MCU_UPDATE_PACK_SAVEADDR); } uint8_t userpar_Get_workmode(void) { return ModuPar.workmode; } uint8_t userpar_Set_workmode(uint32_t tmp) { if(tmp == normal_work_mode) { ModuPar.workmode = tmp; return TRUE; } else if(tmp == uddate_work_mode) { ModuPar.workmode = tmp; return TRUE; } return FALSE; } void userpar_loadCfg_powerdownpar(void) { uint16_t i,j; userflash_Read(0,(uint8_t*)&Powerdown_savepar,sizeof(Powerdown_saveparType),CORRECT_DATA_SAVEADDR_CAL_4); if((Powerdown_savepar.flag_s != 123456789) || (Powerdown_savepar.flag_e != 123456789)) { Powerdown_savepar.flag_s = 123456789; Powerdown_savepar.flag_e = 123456789; Powerdown_savepar.pa_sw_timer_1s = 0; } } void userpar_Erase_powerdownpar(void) { userflash_Erase(CORRECT_DATA_SAVESECTOR_CAL_4); } void userpar_SaveCfg_powerdownpar(void) { //userflash_Erase(CORRECT_DATA_SAVESECTOR_CAL_4); userflash_Write(0,(uint8_t*)&Powerdown_savepar,sizeof(Powerdown_saveparType),CORRECT_DATA_SAVEADDR_CAL_4); } void HAL_PWR_PVDCallback(void) { userpar_SaveCfg_powerdownpar(); }分析这段arm单片机代码
最新发布
10-28
<think>首先,用户提供了一个查询:“我想分析一段ARM单片机代码的功能、结构和逻辑 请问分析ARM单片机代码的功能、结构与逻辑,代码包含结构体定义、函数实现及相关配置操作”。用户还提供了几个引用,这些是关于ARM、STM32单片机、ARM架构、代码结构等的引用。 从系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 用户查询的核心是分析ARM单片机代码的功能、结构和逻辑,特别是涉及结构体定义、函数实现和配置操作。用户没有提供具体的代码,所以我需要基于一般知识来回答。 回顾引用: - 引用[1]:介绍ARM公司和ARM架构。 - 引用[2]:STM32微控制器是32位处理器。 - 引用[3]:关于Keil工程中的代码结构,包括CMSIS(Cortex Microcontroller Software Interface Standard)。 - 引用[4]:启动流程、操作模式等。 - 引用[5]:代码命名规范,如避免单字节命名、使用描述性名称等。 尽管引用提供了背景知识,但用户要求分析代码的功能、结构和逻辑。所以,我需要构建一个通用的方法来分析这样的代码。 结构我的回答: - 既然用户没有提供具体代码,我应该先解释分析代码的一般方法。 - 然后,基于引用中的知识点,讨论ARM单片机代码的特点。 - 最后,生成相关问题。 步骤: 1. **引入主题**:解释为什么分析ARM单片机代码很重要,并概述方法。 2. **详细步骤**:逐步解释如何分析代码的功能、结构和逻辑。 - **功能分析**:理解代码的整体目的。 - **结构分析**:查看代码组织,如结构体、函数、配置等。 - **逻辑分析**:深入函数实现,理解控制流。 3. **融入引用**:在适当的地方引用提供的资料。 - 例如,当谈论结构时,提到CMSIS(引用[3])。 - 当谈论命名规范时,引用引用[5]。 - 当谈论ARM架构时,引用引用[1]和[2]。 4. **生成相关问题**:在末尾添加相关问题。 5. **使用中文**:整个回答用中文。 6. **数学格式**:虽然代码分析可能不涉及数学,但如果提到寄存器位操作或其他二进制操作,可能需要数学格式。例如,使用$来表示位操作。 可能的数学部分: - 在ARM代码中,常有位操作,如设置控制寄存器的位。例如,$ \text{REG} \mid= (1 << 5) $ 来设置第5位。 - 保持行内格式。 回答结构: 1. **开头**:确认用户意图,并概述方法。 2. **主体**: - 分析功能:理解代码的整体目的(如初始化外设、处理中断等)。 - 分析结构:讨论代码组织,包括文件结构、结构体定义(如用于配置寄存器)、函数实现(如中断处理函数)。 - 分析逻辑:解释如何阅读函数代码,理解控制逻辑,使用调试工具。 - 结合引用:例如,在结构部分,提到CMSIS提供标准化接口[^3];在逻辑部分,提到启动流程[^4];在命名部分,提到最佳实践[^5]。 3. **结束**:总结,并建议提供具体代码以便更详细分析。 4. **相关问题**:生成几个相关问题。 生成相关问题: - 基于用户查询,问题应该围绕分析ARM代码。 - 例如: 1. 如何调试ARM单片机代码中的错误? 2. CMSIS在代码结构中的作用是什么? 3. 最佳实践用于ARM代码的命名和结构? 确保回答真实可靠: - 基于一般嵌入式系统知识。我是AI,但应避免虚构具体示例;使用通用描述。 - 参考引用:在末尾添加引用标识。 最终回答大纲: - 引言:分析ARM单片机代码的重要性和方法。 - 功能分析:解释代码的目的。 - 结构分析:讨论结构体、函数等。 - 逻辑分析:深入代码逻辑。 - 引用融入。 - 结尾:鼓励提供代码。 - 相关问题。 </think>### ARM单片机代码分析:功能、结构与逻辑 分析ARM单片机代码的功能、结构和逻辑是嵌入式系统开发中的关键任务,尤其当代码涉及结构体定义、函数实现和配置操作时。这种分析有助于理解代码行为、优化性能并确保可靠性。以下我将基于通用ARM架构(如STM32系列)的知识,逐步解释分析方法,并结合您提供的引用内容。整个过程分为功能分析、结构分析和逻辑分析三个部分。请注意,由于您未提供具体代码示例,我将使用典型场景描述;如果您有实际代码,我可以进一步定制分析。 #### 1. **功能分析(理解代码的目的)** 功能分析关注代码的整体目标,即它能完成什么任务。在ARM单片机中,代码通常用于初始化硬件、处理中断或执行特定算法。例如: - **初始化配置**:代码可能设置时钟、GPIO(通用输入输出)或外设(如UART、ADC),通过配置寄存器来定义单片机的行为模式。 - **事件处理**:在中断服务例程(ISR)中响应外部事件,如在接收到传感器数据时触发ADC读取。 - **数据处理**:实现算法(如PID控制或滤波),用于实时系统。 关键要点: - 通过阅读代码中的注释和函数命名,推断功能。例如,名为 `init_UART()` 的函数可能初始化串口通信。 - 在ARM架构中,功能通常依赖于CMSIS(Cortex Microcontroller Software Interface Standard),它提供了标准化的寄存器访问函数,增强了代码可移植性[^3]。 - 引用中提到ARM公司设计IP核,STM32基于Cortex-M内核,数据总线为32位,这意味着代码需处理32位对齐的操作(如寄存器读写)[^2]。 分析步骤: 1. 识别主函数(如 `main()`)和初始化函数,理解启动流程(例如,根据boot引脚映射内存地址)[^4]。 2. 查看配置参数:结构体定义常用于封装寄存器设置(如 `GPIO_InitTypeDef`),这些设置定义了硬件行为。 3. 评估代码对系统资源的影响:例如,检查是否使用了特权模式或双堆栈机制来处理中断[^4]。 如果代码涉及数学计算(如滤波器系数),可能需要位操作数学表达式。例如,设置寄存器第5位:$ \text{CR1} \mid= (1 << 5) $,这表示将控制寄存器的第5位置1。 #### 2. **结构分析(理解代码的组织)** 结构分析关注代码如何组织,包括文件布局、模块划分和数据结构。在ARM单片机代码中,结构体定义常用于简化寄存器配置,函数实现则封装逻辑块。 - **结构体定义**: - 结构体用于分组相关配置参数。例如,定义一个GPIO初始化结构体: ```c typedef struct { uint32_t Pin; // 引脚编号,如 GPIO_PIN_5 uint32_t Mode; // 模式,如 GPIO_MODE_OUTPUT_PP uint32_t Pull; // 上拉下拉,如 GPIO_NOPULL } GPIO_InitTypeDef; ``` 这种结构体允许函数通过参数传递配置,增强可读性和复用性[^5]。 - **函数实现**: - 函数通常分为初始化函数(如 `HAL_GPIO_Init()`)、中断处理函数(如 `USART1_IRQHandler()`)和辅助函数。 - 代码结构常遵守CMSIS规范,确保命名一致性(如使用 `NVIC_EnableIRQ()` 使能中断)[^3]。引用中提到,描述性命名(如 `buttonPressedFlag`)提高可维护性,避免单字节命名(除循环变量)[^5]。 - **配置操作**: - 配置通过写入寄存器实现,例如设置时钟源: ```c RCC->CR |= RCC_CR_HSEON; // 使能外部高速时钟 ``` - 代码结构往往分层:底层是硬件抽象层(HAL),上层是应用逻辑。Keil工程文件中常见启动文件(如 `startup_stm32f4xx.s`)处理初始堆栈和复位向量[^4]。 分析步骤: 1. 检查代码文件结构:.h头文件定义结构体和函数原型,.c源文件实现函数。 2. 识别模块依赖:例如,一个UART发送函数可能依赖GPIO配置函数。 3. 参考命名规范:使用缩写如 `cfg` 表示配置,确保代码易懂[^5]。 #### 3. **逻辑分析(理解代码的执行流程)** 逻辑分析深入代码执行细节,关注控制流、数据流和错误处理。在ARM单片机中,逻辑常涉及中断嵌套、状态机和实时约束。 - **控制流**: - 顺序执行:从 `main()` 开始的一条线性路径(如初始化→主循环)。 - 中断驱动:当中断事件发生时,程序跳转到ISR。例如,定时器中断处理函数: ```c void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_UIF) { // 检查更新中断标志 TIM2->SR &= ~TIM_SR_UIF; // 清除标志 // 执行任务,如更新PWM输出 } } ``` 逻辑需确保快速响应,避免阻塞主循环。 - **数据流**: - 数据通过变量和结构体传递。例如,一个ADC采样函数填充结构体: ```c typedef struct { uint16_t raw_value; float calibrated_value; } ADC_Data; ``` - 位操作数学常见:如提取寄存器特定位:$ \text{status} = (\text{REG} \gg 3) \& 0x01 $,表示获取第3位的值。 - **错误处理**: - 逻辑应包括检查(如NULL指针或寄存器错误标志),使用条件语句或断言。 - 在Cortex-M内核中,错误可能触发硬件异常(如HardFault),需在启动代码中配置处理函数[^4]。 分析步骤: 1. 逐行阅读关键函数,使用调试工具(如Keil uVision)单步执行。 2. 图解状态转换:例如,如果代码实现一个状态机,绘制状态图。 3. 评估实时性:检查中断延迟和函数执行时间是否符合需求。 #### 总结与建议 分析ARM单片机代码时,从功能入手确定整体目标,再解剖结构(结构体、函数、配置),最后深入逻辑(控制流和数据流)。结合您提供的引用: - CMSIS标准化接口简化了结构分析[^3]。 - 命名规范(如使用 `prev` 表示“previous”)提升代码可读性[^5]。 - ARM的32位架构影响数据操作(如寄存器访问需对齐)[^2]。 如果您提供具体代码片段,我可以针对性地分析其功能、结构和逻辑。例如,分享一个包含结构体定义和函数实现的代码段,我会分解其寄存器配置和中断处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mcusun2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值