اطلاعیه

Collapse
No announcement yet.

وقفه uart کتابخونه HAL

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

    وقفه uart کتابخونه HAL

    سلام دوستان
    من با میکروکنترلر stm32f1 با کتابخونه SPL اوایل برنامه ای نوشته بودم که از وقفه سریال هی دریافت میکرد تا موقعی که کاراکتر اینتر رو دریافت کنه
    بعد ازینکه کاراکتر اینتر رو دریافت میکرد یه فلگ رو یک میکرد من تو برنامه اصلیم چک میکردم اون فلگ رو خوبم کار میکرد
    حالا میخوام با HAL اینکارو کنم
    اما نمیدونم چطوری
    سریال رو با HAL در حد دریافت و ارسال بدون وقفه کار کردم
    ممون میشم توضیح بدید کدش چطوری میشه
    وقفه سریال رو تو قسمت NVIC فعال کردم

    #2
    پاسخ : وقفه uart کتابخونه HAL

    وقت بخیر
    مثالی برای فعال سازی سریال تنظیم پورت و تنظیم سریال و تنظیم وقفه و فانکشن وقفه !! امیدوارم مفید باشد .

    کد:
    int main (void)
        
    {
        
        Usart_Configuration(buadrate);
        Init_NVIC();    
    
        
    }
    
    
    
    
    void Init_Usart(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;                    
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);    
    
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;                 //TX
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               //alternate function out put
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //for 50Mhz
          GPIO_Init(GPIOA, &GPIO_InitStructure);                       //Init GPIOA    
    
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //output pushpull                       
          GPIO_Init(GPIOA, &GPIO_InitStructure);                       //Init GPIOA    
    
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);                       //place in receive 485
    
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;              //RX
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //input flouting                       
          GPIO_Init(GPIOA, &GPIO_InitStructure);                       //Init GPIOA    
    }
    
    
    void Usart_Configuration(uint32_t BaudRate)
    {
        USART_InitTypeDef USART_InitStructure;                                    
    
        Init_Usart();           //init PORTA pin9 tx and pin10 rx
            
        USART_InitStructure.USART_BaudRate            = BaudRate ;                  
        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;     
        USART_InitStructure.USART_StopBits            = USART_StopBits_1;         
        USART_InitStructure.USART_Parity              = USART_Parity_No ;         
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx; 
        USART_Init(USART1, &USART_InitStructure);                                
        
              /* Enable USARTy Receive and Transmit interrupts */
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
            USART_Cmd(USART1, ENABLE);                                                 
    }
    
    void Init_NVIC(void)
    {     
        NVIC_InitTypeDef    NVIC_InitStructure;
    
        #ifdef  VECT_TAB_RAM                                  //
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);          //0x20000000(RAM)
        #else  
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);         //0x08000000(FLASH)  
        #endif
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //Configure the NVIC Preemption Priority Bits
    
    
        /* Enable the USART1 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    
    void USART1_IRQHandler(void)
    {
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
      {
            // to recive
      }
      
      if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
      { 
                // to transmit
       } 
      }
      if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
      {
            // to tranmit complete
      }  
    }
    جدیدترین ویرایش توسط taktrashe; ۱۸:۵۲ ۱۳۹۶/۰۴/۲۹.

    دیدگاه


      #3
      پاسخ : وقفه uart کتابخونه HAL

      سلام مهندس خیلی ممنون از توجهتون
      ولی عرض کردم
      با SPL رو خودم نوشتم
      الان با HAL میخوام

      دیدگاه


        #4
        پاسخ : وقفه uart کتابخونه HAL

        فکر کنم اگه با stm32cubeMx تولید بشه با hal تولید بشه ! مثال تولید کردم ولی تست نشده !!

        کد:
        int main(void)
        {
        
          /* USER CODE BEGIN 1 */
        
          /* USER CODE END 1 */
        
          /* MCU Configuration----------------------------------------------------------*/
        
          /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
          HAL_Init();
        
          /* Configure the system clock */
          SystemClock_Config();
        
          /* Initialize all configured peripherals */
          MX_GPIO_Init();
          MX_USART1_UART_Init();
        
          /* Initialize interrupts */
          MX_NVIC_Init();
        
          /* USER CODE BEGIN 2 */
        
          /* USER CODE END 2 */
        
          /* Infinite loop */
          /* USER CODE BEGIN WHILE */
          while (1)
          {
          /* USER CODE END WHILE */
        
          /* USER CODE BEGIN 3 */
        
          }
          /* USER CODE END 3 */
        
        }
        
        static void MX_NVIC_Init(void)
        {
          /* USART1_IRQn interrupt configuration */
          HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
          HAL_NVIC_EnableIRQ(USART1_IRQn);
        }
        
        /* USART1 init function */
        static void MX_USART1_UART_Init(void)
        {
        
          huart1.Instance = USART1;
          huart1.Init.BaudRate = 115200;
          huart1.Init.WordLength = UART_WORDLENGTH_8B;
          huart1.Init.StopBits = UART_STOPBITS_1;
          huart1.Init.Parity = UART_PARITY_NONE;
          huart1.Init.Mode = UART_MODE_TX_RX;
          huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
          huart1.Init.OverSampling = UART_OVERSAMPLING_16;
          if (HAL_UART_Init(&huart1) != HAL_OK)
          {
            Error_Handler();
          }
        
        
        void USART1_IRQHandler(void)
        {
          /* USER CODE BEGIN USART1_IRQn 0 */
        
          /* USER CODE END USART1_IRQn 0 */
          HAL_UART_IRQHandler(&huart1);
          /* USER CODE BEGIN USART1_IRQn 1 */
        
          /* USER CODE END USART1_IRQn 1 */
        }

        دیدگاه


          #5
          پاسخ : وقفه uart کتابخونه HAL

          ممنونم
          حالا من بخش دریافت رو تو کدوم قسمت کدم باید بنویسم؟چطوری باید دریافت کنم اصلا؟

          دیدگاه


            #6
            پاسخ : وقفه uart کتابخونه HAL

            توی فایلهای پروژه قسمت STM32F1xx_HAL_Driver یه فایل داره بنام stm32f1xx_hal_uart.c یک فانکشن داره بشکل زیر

            کد:
            /**
              * @brief  This function handles UART interrupt request.
              * [MENTION=17545]para[/MENTION]m  huart: Pointer to a UART_HandleTypeDef structure that contains
              *                the configuration information for the specified UART module.
              * @retval None
              */
            void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
            {
              uint32_t tmp_flag = 0, tmp_it_source = 0;
            
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE);
              tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE);  
              /* UART parity error interrupt occurred ------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              { 
                huart->ErrorCode |= HAL_UART_ERROR_PE;
              }
              
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE);
              tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
              /* UART frame error interrupt occurred -------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              { 
                huart->ErrorCode |= HAL_UART_ERROR_FE;
              }
              
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE);
              /* UART noise error interrupt occurred -------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              { 
                huart->ErrorCode |= HAL_UART_ERROR_NE;
              }
              
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
              /* UART Over-Run interrupt occurred ----------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              { 
                huart->ErrorCode |= HAL_UART_ERROR_ORE;
              }
              
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
              tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
              /* UART in mode Receiver ---------------------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              { 
                UART_Receive_IT(huart);
              }
              
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);
              tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);
              /* UART in mode Transmitter ------------------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              {
                UART_Transmit_IT(huart);
              }
            
              tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC);
              tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC);
              /* UART in mode Transmitter end --------------------------------------------*/
              if((tmp_flag != RESET) && (tmp_it_source != RESET))
              {
                UART_EndTransmit_IT(huart);
              }  
            
              if(huart->ErrorCode != HAL_UART_ERROR_NONE)
              {
                /* Clear all the error flag at once */
                __HAL_UART_CLEAR_PEFLAG(huart);
                
                /* Set the UART state ready to be able to start again the process */
                huart->State = HAL_UART_STATE_READY;
                
                HAL_UART_ErrorCallback(huart);
              }  
            }
            که هر قسمت رو میتونی کد بذاری و برای دریافت از سریال UART_FLAG_RXNE فلاگ هست البته فکر کنم خودش یک بافر هم تعریف میکنه ولی شما میتونی خودت تغییر بدی .

            دیدگاه


              #7
              پاسخ : وقفه uart کتابخونه HAL

              خیلی ممنون از شما لطف کردید

              دیدگاه


                #8
                پاسخ : وقفه uart کتابخونه HAL

                نوشته اصلی توسط mp.pezhvak نمایش پست ها
                خیلی ممنون از شما لطف کردید
                خواهش میکنم امیدوارم مفید باشه !! برای تشکر از دگمه تشکر استفاده کنید !

                دیدگاه


                  #9
                  پاسخ : وقفه uart کتابخونه HAL

                  نوشته اصلی توسط mp.pezhvak نمایش پست ها
                  ممنونم
                  حالا من بخش دریافت رو تو کدوم قسمت کدم باید بنویسم؟چطوری باید دریافت کنم اصلا؟
                  سلام
                  در این قسمت HAL_UART_RxCpltCallback
                  زیر برنامه وقفه

                  این دستور فعال کردن وقفه
                  __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE)

                  فیلم اموزشی
                  http://s9.picofile.com/file/82731839...VIDEO.rar.html


                  برنامه نمونه

                  جدیدترین ویرایش توسط mahdi8866; ۰۶:۴۱ ۱۳۹۶/۰۴/۳۱.
                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه


                    #10
                    پاسخ : وقفه uart کتابخونه HAL

                    نوشته اصلی توسط mahdi8866 نمایش پست ها
                    سلام
                    در این قسمت HAL_UART_RxCpltCallback
                    زیر برنامه وقفه

                    این دستور فعال کردن وقفه
                    __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE)

                    فیلم اموزشی
                    http://s9.picofile.com/file/82731839...VIDEO.rar.html


                    برنامه نمونه

                    خیلی جالب بود.
                    برای بخشهای دیگه مثل USB و ADC هم ویدئو اموزشی داری؟

                    دیدگاه

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