历史上的今天
今天是:2025年04月22日(星期二)
2019年04月22日 | STM32程序移植的一些注意方法
2019-04-22 来源:eefocus
一,步骤
建立需要的子函数及将对应的函数在所有子函数之前声明。另一种方法是:新建一个子函数(.c)文件和头文件库(.h)文件,分别保存在用户文件夹中(这个文件夹是主函数所在的文件夹),将刚刚保存的子函数文件添加到程序文件夹中(保存在主函数所在的文件夹并不表示包含到了函数里,因此要在编程软件(即开发环境)添加,添加方法详见http://blog.csdn.net/ambizxzh/article/details/74324288)
移植的方法也可以参照上面这个链接。
二,注意
1,在配置子函数文件时,当出现多个结构体时结构体要在任何结构体元素赋值之前,也就是说对于A结构体,它必须放在A结构体、B结构体、C…等结构体的结构体元素赋值之前否则会出现错误
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//端口映射,详见STM32中文参考手册p119
//定时器初始化
TIM_TimeBaseStruct.TIM_Period=899;//初值(在72M下,计数900个(内部自动加1,所以899))
TIM_TimeBaseStruct.TIM_Prescaler=0;/预分频为0,位系统频率72M
TIM_TimeBaseStruct.TIM_ClockDivision=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);
//pwm 初始化
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//模式1下,小于寄存器设定值(占空比)为高,大于为低,输出电平不同
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出为低电平
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载寄存器,以可以多次使用
TIM_Cmd(TIM3,ENABLE);//定时器标志位打开
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//子函数配置时,引脚结构体初始化,然后才能对应引脚时钟配置
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2,主函数在调用子函数文件时,要注意死循环,应为前面使用这类循环之后,在后面调用的子函数都得不到执行,可以看到下面的主函数先后调用了两个含有死循环的子函数,在这种情况下,只有放在前面的子函数会不断的在自己的死循环中执行,不会跳出去,因此,后面的部分不会起作用,因此,不管两者的位置如何调换,总有在这死循环后面的函数无法执行。
如:主函数
int main(void)
{
u16 n=0;
OLED_Init(); //初始化OLED
OLED_Clear();
RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();//端口初始化 TIM3_Configuration();//定时器和pwm配置
PWM_Out();
OLED_Print();
}
1
2
3
4
5
6
7
8
9
10
子函数void PWM_Out(void);
void PWM_Out(void)
{
u8 led_fx=1;
u16 led_dt=0;
while(1)//死循环
{
delay_ms(10);
if(led_fx==1)
{
led_dt++;
}
else
{
led_dt--;
}
if(led_dt>300) led_fx=0;
if(led_dt==0) led_fx=1;
TIM_SetCompare2(TIM3,led_dt);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
子函数void OLED_Print(void);
void OLED_Print(void)
{
u32 ad=0;
u8 i=0;
u8 k=10;
u16 n=0;
u32 temp=0;
float temp1=0;
float da=0;
ad=0;
for(i=0;i<50;i++)
{ ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
ad=ad+ADC_GetConversionValue(ADC1);
}
ad=ad/50;
OLED_Clear();
temp=ad*(3.3/4095);
temp1=ad*(3.3/4095);
temp1=(temp1-temp)*1000;
OLED_ShowString(0,1,"ad =");
OLED_ShowString(0,3,"U = . V");
OLED_ShowNum(30,1,ad,4,16);
OLED_ShowNum(50,3,temp1,3,16);
OLED_ShowNum(20,3,temp,2,16);
OLED_ShowString(20,5,"2017.07.03");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
OLED_Clear();
OLED_ShowString(0,1,"da =");
OLED_ShowNum(30,1,da,4,16);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
while(1)//死循环
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)
{
n++;
da=n*49;
DAC_SetChannel1Data(DAC_Align_12b_R,da);
printf("da=%f vrn",3.3*(da/4095));
OLED_ShowString(0,1,"da =");
OLED_ShowNum(30,1,da,4,16);
OLED_ShowString(0,3,"Voutda =");
OLED_ShowNum(60,3,3.3*(da/4095),4,16);
delay_ms(500);
if (da>4095)
{
n=0,da=0;
}
}
else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==Bit_RESET)
{
n--;
da=n*49;
DAC_SetChannel1Data(DAC_Align_12b_R,da);
printf("da=%f vrn",3.3*(da/4095));
OLED_ShowString(0,1,"da =");
OLED_ShowNum(30,1,da,4,16);
OLED_ShowString(0,3,"Voutda =");
OLED_ShowNum(60,3,3.3*(da/4095),4,16);
delay_ms(500);
if (da<0)
{
n=0,da=0;
}
}
}
}
上一篇: STM32F103 中断优先级理解
下一篇:外部中断EXTI的配置注意事项
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 02:54 编辑 包括测试程序,原理图,是买的一块开发板上给的。 [ 本帖最后由 chbaaic 于 2008-10-30 11:52 编辑 ] … 查看全部问答> |
|
百利通公司总部设在硅谷,是Nasdaq上市公司,在晶体振荡器领域位居世界前十大。百利通公司在香港和美国都设有研发中心,拥有一批经验丰富的专业设计人员。随着产品线的扩充和区域市场的成熟,先后在台湾、香港、上海设立公司,凭借其遍布全球的销售 ...… 查看全部问答> |
|
采用生物识别技术的门禁系统在安防行业应用已经越来越多,包括银行、监狱、部队等单位已经采用生物识别的门禁系统来加强其管理的安全性和使用的方便性。由于生物识别技术已经开始达到大规模的应用水平,包括产品价格、品质和技术都已经相对成熟 ...… 查看全部问答> |
|
大家好: 请教大家一个问题: 在微软window mobile 的windows media player下的右软键菜单下添加一个菜单项,该怎么添加? 微软是否提供相应的接口? 有谁知道 ...… 查看全部问答> |
|
程序大概这样的,一个试图列表里显示了CF卡中所有的文件,鼠标焦点可以放在文件上,但现在想做一个选取功能,就是,当鼠标单击了一个文件就能直接或按另一个按钮读出他的名字,这样好去CF卡中查找这个文件并对这个文件操作。问题是,怎么读出文件的 ...… 查看全部问答> |
|
公司名称: Carrier Access 公司网址: http://www.carrieraccess.com 电子邮箱: lshi@carrieraccess.com,简历请注明信息出处 工作地点: 上海 外语要求: 英文良好 简历接收方式: 英文及中文 学历: 本科以上 职位描述: -Candidates will ha ...… 查看全部问答> |
|
void FloatToByte(float floatNum,unsigned char* byteArry){ char* pchar=(char*)&floatNum; for(int i=0;i<sizeof(float);i++) { &nb ...… 查看全部问答> |




