历史上的今天
返回首页

历史上的今天

今天是: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;

     }

     }


}

}



推荐阅读

史海拾趣

Gemmy Electronics Co Ltd公司的发展小趣事
使用电子捕鼠器应遵守当地法律法规和规定,不得在禁止使用的场所使用。
D3 Semiconductor公司的发展小趣事

在全球化的大背景下,D3 Semiconductor积极拓展国际市场。除了与贸泽电子的合作外,公司还与多家国际知名的电子企业建立了合作关系,将产品推向全球各地。同时,D3 Semiconductor还加强了在国际市场的营销和品牌建设,提高了公司的知名度和美誉度。这一系列的努力使D3 Semiconductor在国际市场上取得了显著的成绩,也为公司的未来发展奠定了坚实的基础。

COTO TECHNOLOGY公司的发展小趣事

随着电子行业的不断发展,小型化、集成化成为产品设计的趋势。COTO TECHNOLOGY紧跟时代潮流,于1983年成功研发出史上首款表面贴装干簧继电器。这一技术的突破不仅提高了产品的生产效率,更使得COTO的产品在小型化方面走在了行业前列。这一创新不仅增强了COTO在市场上的竞争力,也进一步巩固了其在干簧继电器领域的领导地位。

Bourns公司的发展小趣事

Bourns公司的卓越表现得到了全球知名代理商TTI, Inc.的认可。Bourns连续多年获得TTI全球运营卓越奖,这一奖项是对Bourns全球绩效的最高认可。这一成就不仅彰显了Bourns在全球电子组件市场的领导地位,也反映了其持续提供优质产品和服务的承诺。

General Electric Company公司的发展小趣事
能够输出较大的电流,以满足高压驱动或负载的需求。
Diconex公司的发展小趣事

随着环保意识的不断提高,电子行业的环保要求也越来越高。Diconex公司积极响应环保号召,将环保理念融入生产全过程。公司采用环保材料和工艺进行生产,降低生产过程中的污染排放。同时,公司还建立了完善的废弃物处理机制,确保废弃物得到合理处理和资源化利用。这种环保理念的实施不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

AD9852资料(程序,原理图)

本帖最后由 paulhyde 于 2014-9-15 02:54 编辑 包括测试程序,原理图,是买的一块开发板上给的。 [ 本帖最后由 chbaaic 于 2008-10-30 11:52 编辑 ]  …

查看全部问答>

石英振荡体名企诚招 研发部总工

百利通公司总部设在硅谷,是Nasdaq上市公司,在晶体振荡器领域位居世界前十大。百利通公司在香港和美国都设有研发中心,拥有一批经验丰富的专业设计人员。随着产品线的扩充和区域市场的成熟,先后在台湾、香港、上海设立公司,凭借其遍布全球的销售 ...…

查看全部问答>

光敏电阻

哪位仁兄介绍个好点的光敏电阻? 功率可调…

查看全部问答>

隔离器选型要点

隔离器选型要点 一.共模干扰抑制能力,隔离器优势先决条件。 隔离器在独有行业范围内,无论是温度隔离变送器、信号分配器、隔离配电器及电流、电压变送器等产品内,它们共有特点是端口之间要绝对电气隔离,也就是一次仪表、电源及采集设备之间没有任 ...…

查看全部问答>

如何选择生物识别产品?

  采用生物识别技术的门禁系统在安防行业应用已经越来越多,包括银行、监狱、部队等单位已经采用生物识别的门禁系统来加强其管理的安全性和使用的方便性。由于生物识别技术已经开始达到大规模的应用水平,包括产品价格、品质和技术都已经相对成熟 ...…

查看全部问答>

LM3S系列电源管理方式

本文以TI 公司的cortex M3芯片为例,说明了如何降低其功耗 …

查看全部问答>

window media player下添加菜单

大家好:      请教大家一个问题:      在微软window mobile 的windows media player下的右软键菜单下添加一个菜单项,该怎么添加? 微软是否提供相应的接口?      有谁知道 ...…

查看全部问答>

怎样读出试图列表里文件的名,用OnClickList么?

程序大概这样的,一个试图列表里显示了CF卡中所有的文件,鼠标焦点可以放在文件上,但现在想做一个选取功能,就是,当鼠标单击了一个文件就能直接或按另一个按钮读出他的名字,这样好去CF卡中查找这个文件并对这个文件操作。问题是,怎么读出文件的 ...…

查看全部问答>

美企招聘Java Engineer (SW 6#)

公司名称: 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 ...…

查看全部问答>