这里之所以有8 个启动文件,是因为对于不同容量的芯片启动文件不一样。对于 103 系列,主要是用其中3 个启动文件:
startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx
startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx, STM32F103xx
startup_stm32f10x_hd_vl.s 大容量的STM32F100xx
startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_ld_vl.s 小容量的STM32F100xx
startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_md_vl.s 中容量的STM32F100xx
startup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s 大容量的STM32F100xx
ps:
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128hd:高密度产品,FLASH大于128
项目场景:
使用中断前,清除相应中断标志位(定时向上更新中断)
/*------使用更新中断前,清除中断标志位,避免错误-------*/
问题描述
void TIM5_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
/*------使用更新中断前,清除中断标志位,避免错误-------*/
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
项目场景:
在数据间进行赋值时,注意被赋值的数据组是否大于赋值的数组。如下图若 rfid[8] 的值大于17,则在赋值 ICA_rfid[] 时,会出现地址越界
问题描述
int Init_Casepart_para(u8 name, update_casedata *Update_casedata, cJSON *Casepart)
{
u8 ICA_i;
u8 ICA_rfid[17]={0};
u8 ICA_c =rfid[8]; //若 rfid[8] 的值大于17,则在赋值 ICA_rfid[] 时,会出现地址越界
if (ICA_c > 8) { ICA_c = 8; }
for (ICA_i = 0; ICA_i < ICA_c; ICA_i++)
{
ICA_rfid[ICA_i * 2] = ICA_a;
ICA_rfid[ICA_i * 2 + 1] = ICA_b;
}
return 0;
}
STM32F103C8--CAN设置:
STM32F103C8--CAN设置:
u32 ext_id =0x00000000 | sw_in;
/**************50K**************/
can1.CAN_SJW = CAN_SJW_1tq; //f1的can时钟为36M
can1.CAN_BS1 = CAN_BS1_6tq;
can1.CAN_BS2 = CAN_BS2_8tq;
can1.CAN_Prescaler = 4*12; //分频系数 36/((8+6+1)*48) = 0.010M=50k --- 波特率
/**************250K**************/
can2.CAN_SJW = CAN_SJW_1tq; /* f1的can时钟为36M */
can2.CAN_BS1 = CAN_BS1_7tq;
can2.CAN_BS2 = CAN_BS2_8tq;
can2.CAN_Prescaler = 9; /* 36/((8+7+1)*9) = 0.25M=250k ---波特率 */
/**************500K**************/
can1.CAN_Mode = mode; //=1 //工作模式为环回模式 CAN_Mode_Normal=0
can1.CAN_SJW = CAN_SJW_1tq; //f1的can时钟为36M
can1.CAN_BS1 = CAN_BS1_6tq;
can1.CAN_BS2 = CAN_BS2_1tq;
can1.CAN_Prescaler = 9; //分频系数 36/((1+6+1)*9) = 0.10M=500k --- 波特率(采样率87.5)
//我们还需要设置APB1的时钟频率,STM32F1通常为36MHz (外部8M晶振)
can_filter.CAN_FilterNumber=0; //使用筛选器0,范围为0~13
can_filter.CAN_FilterMode=CAN_FilterMode_IdMask; //设置过滤器组0为屏蔽模式
can_filter.CAN_FilterScale=CAN_FilterScale_32bit; //设置过滤器组0位宽为32位
/**************扩展帧--29位标识符**************/
can_filter.CAN_FilterIdHigh=((ext_id<<3) >>16) &0xffff; //32位ID筛选器的标识符
can_filter.CAN_FilterIdLow=((u16)(ext_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//只接收标
识符ID是0x0002的数据
/**************标准帧--11位标识符**************/
can_filter.CAN_FilterIdHigh=(ext_id<<5) &0xFFE0; //32位ID筛选器的标识符
can_filter.CAN_FilterIdLow=(CAN_ID_STD|CAN_RTR_DATA)&0xFFFF; //只接收标识符ID是
0x0002的数据
can_filter.CAN_FilterMaskIdHigh=0xffff; //32位Mask筛选器的标识符
can_filter.CAN_FilterMaskIdLow=0xffff;