cancel
Showing results for 
Search instead for 
Did you mean: 

STM32L073RZ: PA15 AF5 alternate function (TIM2_CH1) seems unavailable

gon1332
Associate II

I've been trying to use the TIM2_CH1 function for PA15 but without success on a Nucleo-L073RZ. This function works OK on pins PA0 and PA5. Also PA15 works if set in GPIO output mode.

Errata document does not state anything about this pin.

Could you confirm?

This discussion is locked. Please start a new topic to ask your question.
1 ACCEPTED SOLUTION

Accepted Solutions
  1. LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_15, LL_GPIO_AF_5);

Pin 15 would be in the AFRH, not AFRL

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

View solution in original post

4 REPLIES 4
Uwe Bonnes
Principal III

What does fail? Can you check the registers with a debugger and compare to the datasheet/reference manual?

gon1332
Associate II

With the debugger I can see that while PA5's Alternate function can be set to AF5, PA15's cannot (AFRL register). The below snippets shows the cases with each pin. Breakpoint 1 holds the initial state and Breakpoint 2 the initialization. Note that PA2/3 are set for USART so don't mind for these ones:

PA5
========
Breakpoint 1, main () at main.c:85
85          app_init(&app_data);
(gdb) p/x *((GPIO_TypeDef *)0x50000000U)
$1 = {MODER = 0xebfffcff, OTYPER = 0x0, OSPEEDR = 0xc000000, PUPDR = 0x24000000, IDR = 0x0, 
  ODR = 0x0, BSRR = 0x0, LCKR = 0x0, AFR = {0x0, 0x0}, BRR = 0x0}
(gdb) c
Continuing.
 
Breakpoint 2, main () at main.c:86
86          now = millis();
(gdb) p/x *((GPIO_TypeDef *)0x50000000U)
$2 = {MODER = 0xebfffbaf, OTYPER = 0x0, OSPEEDR = 0xc0008f0, PUPDR = 0x24000800, 
  IDR = 0x600c, ODR = 0x0, BSRR = 0x0, LCKR = 0x0, AFR = {0x504400, 0x0}, BRR = 0x0}
 
 
PA15
=======
Breakpoint 1, main () at main.c:85
85          app_init(&app_data);
(gdb) p/x *((GPIO_TypeDef *)0x50000000U)
$1 = {MODER = 0xebfffcff, OTYPER = 0x0, OSPEEDR = 0xc000000, PUPDR = 0x24000000, IDR = 0x0, 
  ODR = 0x0, BSRR = 0x0, LCKR = 0x0, AFR = {0x0, 0x0}, BRR = 0x0}
(gdb) c
Continuing.
 
Breakpoint 2, main () at main.c:86
86          now = millis();
(gdb) p/x *((GPIO_TypeDef *)0x50000000U)
$2 = {MODER = 0xabffffaf, OTYPER = 0x0, OSPEEDR = 0x8c0000f0, PUPDR = 0xa4000000, 
  IDR = 0xe00c, ODR = 0x0, BSRR = 0x0, LCKR = 0x0, AFR = {0x4400, 0x0}, BRR = 0x0}

The code is:

/* PA5 */
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_5, LL_GPIO_PULL_DOWN);                              
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_5, LL_GPIO_SPEED_FREQ_HIGH);                       
LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_5, LL_GPIO_AF_5); 
 
/* PA15 */
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_15, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_15, LL_GPIO_PULL_DOWN);                              
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_15, LL_GPIO_SPEED_FREQ_HIGH);                       
LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_15, LL_GPIO_AF_5); 

I can also verify with a logic analyzer on PA15. It is pulled down forever. On the other hand PA0 and PA5 are working perfectly.

  1. LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_15, LL_GPIO_AF_5);

Pin 15 would be in the AFRH, not AFRL

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
gon1332
Associate II

Oh! That was it. For some reason I connected the "_0_7" part of the name to the Alternate Functions which are also (AF_0..AF_7).