اطلاعیه

Collapse
No announcement yet.

شروع برنامه نویسی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    شروع برنامه نویسی

    دوستان سلام. من میخوام از avr به arm برم و کار با این میکرو هارو یاد بگیرم. اولین برنامه ای که نوشتم میخوام با کتابخونه stm32f0xx و بدون کمک Hal بنویسم. منتها 2 تا اخطار دارم که نمیدونم مشکل چیه.
    میخوام LED متصل به پین B0 را روشن کنم
     
    int main(int argc, char* argv[])
    {


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);


    GPIO_Init(GPIOB,GPIO_Pin_0);
    GPIO_Init(GPIOB, GPIO_Mode_OUT);
    GPIO_Init(GPIOB, GPIO_OType_PP);
    GPIO_Init(GPIOB, GPIO_Speed_2MHz);
    GPIO_Init(GPIOB, GPIO_PuPd_NOPULL);



    while (1)
    {
    GPIO_SetBits(GPIOB, GPIO_Pin_0);


    }
    // Infinite loop, never return.
    }

    ممنون میشم راهنماییم کنید.
    اینا ارور هستند:
    in expansion of macro 'GPIO_Pin_0'
    warning: passing argument 2 of 'GPIO_Init' makes pointer from integer without a cast [-Wint-conversion] ( در قسمت GPIO_Init(GPIOB, GPIO_Mode_OUT); این ارور میاد)

    #2
    پاسخ : شروع برنامه نویسی

    نوشته اصلی توسط nm272 نمایش پست ها
    دوستان سلام. من میخوام از avr به arm برم و کار با این میکرو هارو یاد بگیرم. اولین برنامه ای که نوشتم میخوام با کتابخونه stm32f0xx و بدون کمک Hal بنویسم. منتها 2 تا اخطار دارم که نمیدونم مشکل چیه.
    میخوام LED متصل به پین B0 را روشن کنم
     
    int main(int argc, char* argv[])
    {


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);


    GPIO_Init(GPIOB,GPIO_Pin_0);
    GPIO_Init(GPIOB, GPIO_Mode_OUT);
    GPIO_Init(GPIOB, GPIO_OType_PP);
    GPIO_Init(GPIOB, GPIO_Speed_2MHz);
    GPIO_Init(GPIOB, GPIO_PuPd_NOPULL);



    while (1)
    {
    GPIO_SetBits(GPIOB, GPIO_Pin_0);


    }
    // Infinite loop, never return.
    }

    ممنون میشم راهنماییم کنید.
    اینا ارور هستند:
    in expansion of macro 'GPIO_Pin_0'
    warning: passing argument 2 of 'GPIO_Init' makes pointer from integer without a cast [-Wint-conversion] ( در قسمت GPIO_Init(GPIOB, GPIO_Mode_OUT); این ارور میاد)
    سلام
    یه تابع و این همه کار؟ مگه داریم؟ مگه میشه؟
    دوست عزیز توابعی که برای initialize واحدهای جانبی به کار میرن، معمولا توی ورودی خودشون یه استراکچر میگیرن. یعنی شما تنظیمات رو روی استراکچر اعمال میکنید، بعد استراکچر به تابع مخصوص میدید تا واحد جانبی رو از روی اون استراکچر تنظیم کنه. از اونجایی که استراکچرها بسته به داده های داخلشون خیلی بزرگ میشن، مرسومه که توی ارجاع اونها به تابع، ارجاع به صورت پوینتری صورت بگیره که پردازنده رو کمتر درگیر کنه. یعنی شما آدرس استراکچر رو به تابع میدید.
    الآن این چیزی که شما بهش میگید ارور، ارور نیست؛ اخطاره! داره میگه تابع از شما آدرس میخواد، ولی شما بهش عدد ثابت دادید! اصلا به طور کلی دارید به غلط از این تابع استفاده میکنید و انتظار نداشته باشید خروجی مناسب بگیرید. بهتره روی موضوع بیشتر مطالعه کنید.

    دیدگاه


      #3
      پاسخ : شروع برنامه نویسی

      نخست اینکه ترجیحا از stdPeriph استفاده نکنید. با اینکه HAL هم چندان خوب نیس، ولی حداقل پرتابله و مث stdPeriph از سمت ارایه دهنده منسوخ نشده.
      نخست به توابع نگاه کنید :
      کد:
      void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
      void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
      void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      
      /* GPIO Read and Write functions **********************************************/
      uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
      uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
      void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
      void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

      همونطور که میبینید باید از یه استراکچر استفاده کنید، اگر میخواید از این توابع استفاده کنید :
      کد:
      typedef struct
      {
        uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.
                                             This parameter can be any value of [MENTION=129099]ref[/MENTION] GPIO_pins_define */
                                             
        GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.
                                             This parameter can be a value of [MENTION=129099]ref[/MENTION] GPIOMode_TypeDef   */
      
        GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.
                                             This parameter can be a value of [MENTION=129099]ref[/MENTION] GPIOSpeed_TypeDef  */
      
        GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.
                                             This parameter can be a value of [MENTION=129099]ref[/MENTION] GPIOOType_TypeDef  */
      
        GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.
                                             This parameter can be a value of [MENTION=129099]ref[/MENTION] GPIOPuPd_TypeDef   */
      }GPIO_InitTypeDef;


      و شکل نهایی کدتون اینطوری میشه :
      کد:
      GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
      Si vis pacem, para bellum

      دیدگاه


        #4
        پاسخ : شروع برنامه نویسی

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        یه تابع و این همه کار؟ مگه داریم؟ مگه میشه؟
        دوست عزیز توابعی که برای initialize واحدهای جانبی به کار میرن، معمولا توی ورودی خودشون یه استراکچر میگیرن. یعنی شما تنظیمات رو روی استراکچر اعمال میکنید، بعد استراکچر به تابع مخصوص میدید تا واحد جانبی رو از روی اون استراکچر تنظیم کنه. از اونجایی که استراکچرها بسته به داده های داخلشون خیلی بزرگ میشن، مرسومه که توی ارجاع اونها به تابع، ارجاع به صورت پوینتری صورت بگیره که پردازنده رو کمتر درگیر کنه. یعنی شما آدرس استراکچر رو به تابع میدید.
        الآن این چیزی که شما بهش میگید ارور، ارور نیست؛ اخطاره! داره میگه تابع از شما آدرس میخواد، ولی شما بهش عدد ثابت دادید! اصلا به طور کلی دارید به غلط از این تابع استفاده میکنید و انتظار نداشته باشید خروجی مناسب بگیرید. بهتره روی موضوع بیشتر مطالعه کنید.
        ممنون. این اولین برنامه من با برد stm32 هستش. با کمک نرم افزار stm32cubemx میتونم به راحتی انجام بدم. میخواستم بیشتر یاد بگیرم و بدون این نرم افزار و Hal برنامه رو بنویسم. و هدفم یاد گرفتن همین نکات اولیه که من نمیدونم هستش.

        دیدگاه


          #5
          پاسخ : شروع برنامه نویسی

          نوشته اصلی توسط nm272 نمایش پست ها
          ممنون. این اولین برنامه من با برد stm32 هستش. با کمک نرم افزار stm32cubemx میتونم به راحتی انجام بدم. میخواستم بیشتر یاد بگیرم و بدون این نرم افزار و Hal برنامه رو بنویسم. و هدفم یاد گرفتن همین نکات اولیه که من نمیدونم هستش.
          ایرادات کد شما بیشتر به منطق زبان C ارتباط داره و ربطی به سخت افزار مورد استفاده نداره. بهتره که اگر میخوایید خیلی سطح پایین کار کنید، اول مهارت های برنامه نویسی اتون رو افزایش بدید.
          موفق باشید

          دیدگاه


            #6
            پاسخ : شروع برنامه نویسی

            نوشته اصلی توسط tiranoid نمایش پست ها
            نخست اینکه ترجیحا از stdPeriph استفاده نکنید. با اینکه HAL هم چندان خوب نیس، ولی حداقل پرتابله و مث stdPeriph از سمت ارایه دهنده منسوخ نشده.
            نخست به توابع نگاه کنید :
            کد:
            void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
            void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
            void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            
            /* GPIO Read and Write functions **********************************************/
            uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
            uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
            void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
            void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

            همونطور که میبینید باید از یه استراکچر استفاده کنید، اگر میخواید از این توابع استفاده کنید :
            کد:
            typedef struct
            {
              uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.
                                                   This parameter can be any value of @[URL="https://www.eca.ir/forums/member.php?u=129099"]ref[/URL] GPIO_pins_define */
                                                   
              GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.
                                                   This parameter can be a value of @[URL="https://www.eca.ir/forums/member.php?u=129099"]ref[/URL] GPIOMode_TypeDef   */
            
              GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.
                                                   This parameter can be a value of @[URL="https://www.eca.ir/forums/member.php?u=129099"]ref[/URL] GPIOSpeed_TypeDef  */
            
              GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.
                                                   This parameter can be a value of @[URL="https://www.eca.ir/forums/member.php?u=129099"]ref[/URL] GPIOOType_TypeDef  */
            
              GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.
                                                   This parameter can be a value of @[URL="https://www.eca.ir/forums/member.php?u=129099"]ref[/URL] GPIOPuPd_TypeDef   */
            }GPIO_InitTypeDef;


            و شکل نهایی کدتون اینطوری میشه :
            کد:
            GPIO_InitTypeDef GPIO_InitStructure;
              
              RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
              
              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
              
              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
              GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
              GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
              GPIO_Init(GPIOC, &GPIO_InitStructure);
            ممنون از پاسخ کاملتون. فکر کنم کامل یاد گرفتم ایرادای این کارمو

            دیدگاه

            لطفا صبر کنید...
            X