+ Post New Thread
Results 1 to 8 of 8
  1. #1
    Member level 4
    Points: 1,844, Level: 9
    Achievements:
    7 years registered

    Join Date
    Oct 2010
    Location
    Wyoming
    Posts
    68
    Helped
    0 / 0
    Points
    1,844
    Level
    9

    STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    I have the Blue Pill - STMF103C8Tx - using Atollic TrueStudio and CubeMX with FreeRTOS. In a task, I write to the LED port (C13) and all of port A and port B and I can only get an output using a VOM on ports A0->A3 (except for A9 and 10 which I'm using for the serial port which works fine). I set the outputs in CubeMX to pullup/push-pull. I've tried accessing the GPIOA->ODR directly and can't seem to get anything. I also have a STMF100 Discovery VL board which works find with the same code:

    Code:
    /* USER CODE END Header_StartTask02 */
    void StartTask02(void const * argument)
    {
      /* USER CODE BEGIN StartTask02 */
      /* Infinite loop */
    	static int onoff = 0;
    	for(;;)
    	{
    		if(onoff == 0)
    		{
    			HAL_GPIO_WritePin(LED_PORT_GPIO_Port, LED_PORT_Pin, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET);
    			onoff = 1;
    			vTaskDelay(1000);
    		}else
    		{
    			HAL_GPIO_WritePin(LED_PORT_GPIO_Port, LED_PORT_Pin, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
    			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_SET);
    			onoff = 0;
    			vTaskDelay(1000);
    		}
    	}
      /* USER CODE END StartTask02 */
    }

    •   AltAdvertisment

        
       

  2. #2
    Advanced Member level 5
    Points: 9,012, Level: 22
    Achievements:
    7 years registered
    Easyrider83's Avatar
    Join Date
    Oct 2011
    Location
    Tallinn, Estonia
    Posts
    1,588
    Helped
    362 / 362
    Points
    9,012
    Level
    22

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    Did you enabled the RCC for portb?
    Did you initialized pins as output? Default is analog input.
    HAL_GPIO_WritePin may be a not a thread save function, also don't use static variables inside function. For now it is fine since you have only one thread. But you should be carefull using shared resources.
    Love me or hate me. All infractions will be ignored.



    •   AltAdvertisment

        
       

  3. #3
    Member level 4
    Points: 1,844, Level: 9
    Achievements:
    7 years registered

    Join Date
    Oct 2010
    Location
    Wyoming
    Posts
    68
    Helped
    0 / 0
    Points
    1,844
    Level
    9

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    The ports used have all been initialized in a file called gpio.c in the init function. I could try to use a semaphore instead of a static variable in this case, I guess.



    •   AltAdvertisment

        
       

  4. #4
    Advanced Member level 5
    Points: 9,012, Level: 22
    Achievements:
    7 years registered
    Easyrider83's Avatar
    Join Date
    Oct 2011
    Location
    Tallinn, Estonia
    Posts
    1,588
    Helped
    362 / 362
    Points
    9,012
    Level
    22

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    You don't have to. F103 has bitbang access to gpio. But in theory yes, you should.
    If you wanna get a help about your issue, you need to provide full code.
    Weird, that I have to explain that.
    Last edited by Easyrider83; 22nd April 2019 at 07:16.
    Love me or hate me. All infractions will be ignored.



  5. #5
    Member level 4
    Points: 1,844, Level: 9
    Achievements:
    7 years registered

    Join Date
    Oct 2010
    Location
    Wyoming
    Posts
    68
    Helped
    0 / 0
    Points
    1,844
    Level
    9

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    This project was generated using STM32CubeMX with the Middleware set to 'FreeRTOS' and in the Project Settings->Code Gernerator the option to generate separate *.c/*.h files for each peripheral is set so there's a file called main.c, gpio.c usart,c freertos.c in the Src directory. Here's the full freertos.c but I'll try to send the zip'ed file of the whole project minus the debug directory as an attachment.

    Code:
    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * File Name          : freertos.c
      * Description        : Code for freertos applications
      ******************************************************************************
      ******************************************************************************
      */
    /* USER CODE END Header */
    
    /* Includes ------------------------------------------------------------------*/
    #include "FreeRTOS.h"
    #include "task.h"
    #include "main.h"
    #include "cmsis_os.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */     
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    /* USER CODE BEGIN Variables */
    extern UART_HandleTypeDef huart1;
    /* USER CODE END Variables */
    osThreadId defaultTaskHandle;
    osThreadId Task02Handle;
    osMessageQId Queue01Handle;
    
    /* Private function prototypes -----------------------------------------------*/
    /* USER CODE BEGIN FunctionPrototypes */
       
    /* USER CODE END FunctionPrototypes */
    
    void StartDefaultTask(void const * argument);
    void StartTask02(void const * argument);
    
    void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
    
    /**
      * @brief  FreeRTOS initialization
      * @param  None
      * @retval None
      */
    void MX_FREERTOS_Init(void) {
      /* USER CODE BEGIN Init */
           
      /* USER CODE END Init */
    
      /* USER CODE BEGIN RTOS_MUTEX */
      /* add mutexes, ... */
      /* USER CODE END RTOS_MUTEX */
    
      /* USER CODE BEGIN RTOS_SEMAPHORES */
      /* add semaphores, ... */
      /* USER CODE END RTOS_SEMAPHORES */
    
      /* USER CODE BEGIN RTOS_TIMERS */
      /* start timers, add new ones, ... */
      /* USER CODE END RTOS_TIMERS */
    
      /* Create the queue(s) */
      /* definition and creation of Queue01 */
      osMessageQDef(Queue01, 16, uint16_t);
      Queue01Handle = osMessageCreate(osMessageQ(Queue01), NULL);
    
      /* USER CODE BEGIN RTOS_QUEUES */
      /* add queues, ... */
      /* USER CODE END RTOS_QUEUES */
    
      /* Create the thread(s) */
      /* definition and creation of defaultTask */
      osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
      defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
    
      /* definition and creation of Task02 */
      osThreadDef(Task02, StartTask02, osPriorityIdle, 0, 128);
      Task02Handle = osThreadCreate(osThread(Task02), NULL);
    
      /* USER CODE BEGIN RTOS_THREADS */
      /* add threads, ... */
      /* USER CODE END RTOS_THREADS */
    
    }
    
    /* USER CODE BEGIN Header_StartDefaultTask */
    /**
      * @brief  Function implementing the defaultTask thread.
      * @param  argument: Not used 
      * @retval None
      */
    /* USER CODE END Header_StartDefaultTask */
    void StartDefaultTask(void const * argument)
    {
    
      /* USER CODE BEGIN StartDefaultTask */
      UCHAR buff[100];
      UCHAR xbyte;
      int i;
      xbyte = 0x21;
      for(i = 0;i < 100;i++)
      {
    	  buff[i] = xbyte;
    	  if(++xbyte > 0x7e)
    		  xbyte = 0x21;
      }
      for(i = 100;i > 50;i--)
      {
    	  buff[i] = xbyte;
    	  if(++xbyte > 0x7e)
    		  xbyte = 0x21;
      }
      
    	/* Infinite loop */
    	for(;;)
    	{
    /* 		osDelay(1);
    		osDelay(1);
     */		vTaskDelay(500);
    		HAL_UART_Transmit(&huart1,buff,93,100);
    	}
      /* USER CODE END StartDefaultTask */
    }
    
    /* USER CODE BEGIN Header_StartTask02 */
    /**
    * @brief Function implementing the Task02 thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartTask02 */
    void StartTask02(void const * argument)
    {
      /* USER CODE BEGIN StartTask02 */
      /* Infinite loop */
    	for(;;)
    	{
    		HAL_GPIO_TogglePin(LED_PORT_GPIO_Port, LED_PORT_Pin);
    		
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_11);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_15);
    
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_7);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_11);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_12);
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_13);
    
    		vTaskDelay(1000);
    	}
      /* USER CODE END StartTask02 */
    }
    
    /* Private application code --------------------------------------------------*/
    /* USER CODE BEGIN Application */
         
    /* USER CODE END Application */
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
    - - - Updated - - -

    And here's gpio.c:

    Code:
    /* Includes ------------------------------------------------------------------*/
    #include "gpio.h"
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /*----------------------------------------------------------------------------*/
    /* Configure GPIO                                                             */
    /*----------------------------------------------------------------------------*/
    /* USER CODE BEGIN 1 */
    
    /* USER CODE END 1 */
    
    /** Configure pins
    */
    void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(LED_PORT_GPIO_Port, LED_PORT_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, row0_Pin|row1_Pin|row2_Pin|row3_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin : PtPin */
      GPIO_InitStruct.Pin = LED_PORT_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(LED_PORT_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
      GPIO_InitStruct.Pin = row0_Pin|row1_Pin|row2_Pin|row3_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
      /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
      GPIO_InitStruct.Pin = col0_Pin|col1_Pin|col2_Pin|col3_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
      /* EXTI interrupt init*/
      HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0);
      HAL_NVIC_EnableIRQ(EXTI3_IRQn);
    
      HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);
      HAL_NVIC_EnableIRQ(EXTI4_IRQn);
    
      HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0);
      HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
    
    }
    
    /* USER CODE BEGIN 2 */
    
    /* USER CODE END 2 */
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



  6. #6
    Advanced Member level 5
    Points: 9,012, Level: 22
    Achievements:
    7 years registered
    Easyrider83's Avatar
    Join Date
    Oct 2011
    Location
    Tallinn, Estonia
    Posts
    1,588
    Helped
    362 / 362
    Points
    9,012
    Level
    22

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    I still don't see any initialization for gpio.
    Love me or hate me. All infractions will be ignored.



    •   AltAdvertisment

        
       

  7. #7
    Member level 4
    Points: 1,844, Level: 9
    Achievements:
    7 years registered

    Join Date
    Oct 2010
    Location
    Wyoming
    Posts
    68
    Helped
    0 / 0
    Points
    1,844
    Level
    9

    Re: STM32F103 (Blue Pill) can only get A0-&amp;gt;A3 to work as outputs

    I just put the whole project up on github.com at: https://github.com/sunbelt56/STM32F103

    - - - Updated - - -

    It's in gpio.c: MX_GPIO_Init()

    - - - Updated - - -

    Well, make a liar out of me: I uncommented some of the HAL_GPIO_TogglePin statements before I posted it so it doesn't show in the GPIO_Init function. Give me a second, I posted the wrong friggin files...

    Somehow I put the wrong gpio.c up there in the above post and now I can't go back and edit it. So unless you go the the github link, I guess there's no way you'll understand it.
    Last edited by Build-A-Burger; 22nd April 2019 at 14:38.



  8. #8
    Advanced Member level 5
    Points: 9,012, Level: 22
    Achievements:
    7 years registered
    Easyrider83's Avatar
    Join Date
    Oct 2011
    Location
    Tallinn, Estonia
    Posts
    1,588
    Helped
    362 / 362
    Points
    9,012
    Level
    22

    Re: STM32F103 (Blue Pill) can only get A0->A3 to work as outputs

    Yes, you have init code for PA0 PA1 PA2 PA3 only, not surprised why the rest is not working.
    Love me or hate me. All infractions will be ignored.



--[[ ]]--