zoukankan      html  css  js  c++  java
  • STM32 Keil C++编写单片机程序

      C++ 属于面向对象的编程语言,OOP的思想不必多说,特别对于复杂的软件工程来说,利用OOP绝对是事半功倍,相对于传统的C来说;

    当然用C来写单片机程序无可厚非,已经延续了一个传统,从大学时学的开始到工作岗位,好多人都是一直用C来做,但是既然Keil支持C++编译,

    可以用C++来编写你的代码,可以利用高级语言来结构化,清晰化你的程序,为嘛不用呢!哈哈,个人看法!下面进入正题:

      C++ 兼容C,所以STM32的库都是可以被C++使用的,既然这样,那就简单了!在建立好新的STM32工程时候,那就可以直接进行C++编程了;

    利用C++的方式,建立好文件,我写的一个Demo:

    .h文件--
    #ifndef __PLED__
    #define __PLED__
    
    #include "stm32f10x.h"
    
    class PLed
    {
        public:
            PLed();
            ~PLed();
        public:
            void LED_GPIO_Config(void);
            void TurnOn(uint16_t port,bool status);
          
        private:
    };
    #endif
    
    
    .cpp文件--
    #include "PLed.h"
    PLed::PLed(){LED_GPIO_Config();}
    PLed::~PLed(){}
    void PLed::LED_GPIO_Config()
    {
         GPIO_InitTypeDef GPIO_InitStructure;
    
    
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    
                                                                   
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_5;    
    
    
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
    
       
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    
         GPIO_Init(GPIOE, &GPIO_InitStructure);
         
    
         GPIO_SetBits(GPIOE,GPIO_Pin_5);   
           GPIO_SetBits(GPIOE,GPIO_Pin_6); 
    }
    
    void PLed::TurnOn(uint16_t port,bool status)
    {
      if(status)
            GPIO_SetBits(GPIOE,port);
        else
            GPIO_ResetBits(GPIOE,port);
    }

    main文件--
    #include "stm32f10x.h"
    #include "misc.h"
    #include "stdio.h"
    #include "PSysTick.h"
    #include "PLed.h"
    
    int main(void)
    {        
        
            PSysTick pst;
        pst.SysTick_Init();
    
        PLed pled;
        
        while (1)
        {
    
            pled.TurnOn(GPIO_Pin_5,true);
            pled.TurnOn(GPIO_Pin_6,false);
       
            pst.Delay(500);
            
    
            pled.TurnOn(GPIO_Pin_5,false);
            pled.TurnOn(GPIO_Pin_6,true);
            
            pst.Delay(500);
            
        }
    }
    Systick 文件
    #ifndef __PDELAY_H
    #define __PDELAY_H 
    #include "stm32f10x.h"
    
    class PSysTick
    {
    
        public:
            PSysTick();
          ~PSysTick();
        public:
            void Delay(u32 nTime);
        void SysTick_Init();
            static u32 TimingDelayx;
    };
    #endif
    
    #include "PsysTick.h"
    PSysTick::PSysTick()
    {}
    PSysTick::~PSysTick()
    {}
        
    void PSysTick::Delay(u32 nTime)
    {
        TimingDelayx = nTime;
      while(TimingDelayx != 0);
    }
    
    void PSysTick::SysTick_Init()
    {
    while(SysTick_Config( SystemCoreClock  / 1000));        
    }
    
    u32 PSysTick::TimingDelayx=0;
    中断函数:
    extern "C"
    {
    void SysTick_Handler(void)
    {
        if(PSysTick::TimingDelayx!=0x00)
        {
          PSysTick::TimingDelayx--;
        }
        else
            PUsart::SendData('E');
    }
    }

    整个工程C++代码如上,直接进行编译即可;当然如果你的main还是用.c,也可以不用修改后缀,直接在main.c的属性里修改为C++sourcefile 即可,用到了中断文件,那中断文件也同样要改为C++类型的,

    这样编译之后,和正常的C编写一样,下载文件到单片机即可;

    差不多就这样了!以后有问题,继续研究!



  • 相关阅读:
    树莓派更新镜像源于镜像源推荐
    树莓派安装系统并设置中文界面
    查询linux文件的MD5值
    iOS安全攻防(二十三):Objective-C代码混淆
    【v2.x OGE教程 20】粒子效果
    JNI_最简单的Java调用C/C++代码
    JavaScript面向对象精要(一)
    频繁模式挖掘apriori算法介绍及Java实现
    hdu1573X问题(不互素的中国剩余定理)
    hive优化之自己主动合并输出的小文件
  • 原文地址:https://www.cnblogs.com/yeshuimaowei/p/6949642.html
Copyright © 2011-2022 走看看