Difference between revisions of "STM32 bit bang PWM"

From Stm32World Wiki
Jump to navigation Jump to search
Line 6: Line 6:
 
== Bit-banding ==
 
== Bit-banding ==
  
 +
<pre>
 +
#define BITBAND_BIT_ADDR(src_byte_addr, bit)  (((((uint32_t)(src_byte_addr) & 0x000fffff) << 5) | ((uint32_t)(src_byte_addr) & 0xfff00000) | 0x02000000) + (((uint32_t)(bit)) << 2))
 +
</pre>
 +
 +
== Code ==
 +
 +
=== Timer Settings ===
 +
 +
Firstly configure some timer (we use TIM10 here):
 +
 +
[[File:Bitbang PWM Timer Setting.png|600px]]
 +
 +
We also need to enable the global timer 10 interrupt:
 +
 +
[[File:Bitbang PWM Timer Interrupt Setting.png|600px]]
 +
 +
=== Implementation ===
 +
 +
We use bitbanding to address the bit used for GPIO:
 +
 +
<pre>
 +
// The led_bb_bit points to the bitband address for controlling the PC13
 +
uint8_t *led_bb_bit = (uint8_t*) BITBAND_BIT_ADDR(&LED_GPIO_Port->ODR, 13);
 +
</pre>
  
 
== Result ==
 
== Result ==

Revision as of 08:30, 6 May 2024

On many of the cheaper STM32 Development Boards there is a LED attached to PC13. This is perfectly ok if you want to switch it on or off, but PC13 is not attached to any of the timer channels, so it will not be possible to control the brightness using PWM.

Fortunately, while not ideal, it is possible to bitbang the PWM in a manner which doesn't require too much computation. Contrary to PWM using a Timer channel, it does require some computation in the MCU.

Bit-banding

#define BITBAND_BIT_ADDR(src_byte_addr, bit)  (((((uint32_t)(src_byte_addr) & 0x000fffff) << 5) | ((uint32_t)(src_byte_addr) & 0xfff00000) | 0x02000000) + (((uint32_t)(bit)) << 2))

Code

Timer Settings

Firstly configure some timer (we use TIM10 here):

Bitbang PWM Timer Setting.png

We also need to enable the global timer 10 interrupt:

Bitbang PWM Timer Interrupt Setting.png

Implementation

We use bitbanding to address the bit used for GPIO:

// The led_bb_bit points to the bitband address for controlling the PC13
uint8_t *led_bb_bit = (uint8_t*) BITBAND_BIT_ADDR(&LED_GPIO_Port->ODR, 13);

Result

Miscellaneous Links